魔法他在召唤我
一、单项选择题(本大题共15小题,每小题2分,共30分)
1、下列不属于常见爬虫类型的是( 浅层网络爬虫)。
A、 浅层网络爬虫
B、 聚焦网络爬虫
C、 增量式网络爬虫
D、 通用网络爬虫
答案: A
2、下列哪项不属于解析网页的库?( requests )
A、 lxml
B、 beautifulsoup4
C、 正则表达式
D、 requests
答案: D
3、通过设置HTTP请求的哪个参数可以实现伪装成浏览器访问网页?(headers )
A、 params
B、 data
C、 headers
D、 timeout
答案: C
4、下列哪个函数可以实现合并URL?( urljoin() )
A、 urlpase()
B、 urlencode()
C、 urljoin()
D、 quote()
答案: C
5、下列不属于Response对象属性的是( txt )。
A、 content
B、 txt
C、 text
D、 encoding
答案: B
6、下列不属于HTML标签的是( href )。
A、 href
B、 head
C、 a
D、 li
答案: A
7、lxml库中选取属性的语法是( @ )。
A、 @
B、 .
C、 *
D、 //
答案: A
8、能够在字符串“aabaaabaaaab”中匹配“aab”,而不能匹配“aaab”和“aaaab”的正则表达式为( aa??b )。
A、 a{1,3}b
B、 aa??b
C、 aaa??b
D、 a*?b
答案: B
9、beautifulsoup4 库中遍历整个HTML文件,按照条件返回所有匹配的节点元素的方法是( find_all() )
A、 find()
B、 select()
C、 find_all()
D、 search()
答案: C
10、下列关于XPath描述错误的是( contains()方法可用于选取以特定值开头的节点 )。
A、 text()方法可提取节点的文本内容
B、 text()方法可用于选取包含指定文本内容的节点
C、 contains()方法可用于选取以特定值开头的节点
D、 and可用于选取同时包含两种指定值的节点
答案: C
11、下列关于beutiflsoup4中Tag对象描述错误的是( attrs 属性可获取Tag对象的HTML属性,返回值为列表形式 ).
A、 string属性可获取Tag对象中的文本字符串内容
B、 attrs 属性可获取Tag对象的HTML属性,返回值为列表形式
C、 contents属性可获取Tag对象子标签的内容
D、 name 属性可获取Tag对象的名称
答案: B
12、下列关于json库中dumps()方法描述错误的是( dumps()方法可将JSON对象写入文件内 )。
A、 设置indent参数为2时,输出时缩进2个字符
B、 如果需要输出中文字符,设置ensure_ascii 参数为True
C、 dumps()方法可将JSON对象写入文件内
D、 dumps()方法可生成一个字符串
答案: C
13、逆向分析请求页面和取动态加载数据时选择Network面板的哪个选项查看JavaScript加载的文件? ( XHR )
A、 CSS
B、 Doc
C、 XHR
D、 Media
答案: C
14、下列Selenium库的方法中,不能通过节点属性进行多元素定位的是( find _element _by_ name() )。
A、 find _element _by_ name()
B、 find_ elements_ by_class_name()
C、 find_elements_by_name()
D、 find_ elements_ by _id()
答案: A
15、以下选项中哪一个不是正则表达式的元字符( @ ).
A、 $
B、 @
C、 ^
D、 *
答案: B
16、Selenium中提供了多种元素定位方法,但不包括以下选项中的( find_ element by_ page() )
A、 find_ element_ by_ id()
B、 find_ element_ by_ xpath()
C、 find_ element by_ page()
D、 find _element by_ class_ name()
答案: C
17、使用selenium模块打开谷歌浏览器,以下选项中正确的是( webdriver.Chrome() )
A、 webdriver.Google
B、 webdriver.Google()
C、 webdriver.Chrome
D、 webdriver.Chrome()
答案: D
18、以下正则表达式中,属于非贪婪匹配, 且允许出现0次的是(.*? )
A、 .
B、 .*
C、 .*?
D、 .+?
答案: C
19、正则表达式R[0-9]{3},能匹配出以下哪个字符串( R093 )
A、R3
B、 R03
C、 R09
D、 R093
答案: D
20、MySQL数据库默认端口号是( 3306 )。
A、 8888
B、 27017
C、 3306
D、 6379
答案: C
21、下列哪个函数可以实现不同模式图像之间的转换。( convert() )
A、 show()
B、 convert()
C、 open()
D、 save()
答案: B
22、<div id="wrapper">,使用selenium中的方法定位该标签,以下选项中正确的是( find_element_by_id("wrapper") )。
A、 find_element_by_id("wrapper")
B、 find_element_by_id("wrapper_new ")
C、 find_element_by_class("wrapper_new ")
D、 以上都可以
答案: A
23、关于open函数的操作模式,以下选项中哪一种既可以读也可以写( a+ )。
A、 a
B、 w
C、 a+
D、 wb
答案: C
24、下列Tag对象的哪个属性返回标签包含的属性?( attrs )
A、 name
B、 contents
C、 attrs
D、 string
答案: C
25、下列关于urlopen()函数的说法错误的是( 不设置data参数时,以POST方式发送请求 )
A、 data参数是可选的
B、 可以用于对目标URL的访问
C、 设置data参数时,以POST方式发送请求
D、 不设置data参数时,以POST方式发送请求
答案: D
26、下列关于Requests库的说法错误的是( 是一个Python标准库 )
A、 是一个Python标准库
B、 能够发送HTTP请求
C、 能够抓取二进制数据
D、 能够发送HTTP请求头
答案: A
27、下列关于lxml库的说法正确的是( lxml是一款高性能的HTML/XML解析库 )
A、 lxml是一个网络库
B、 lxml是一款高性能的HTML/XML解析库
C、 仅支持利用XPath来选取节点
D、 lxml是一个Python的标准库
答案: B
28、下列关于XPath的语法说法错误的是( ‘//’选取当前节点的子节点)
A、 ‘/’选取当前节点的直接子节点
B、 ‘@’选取属性
C、 ‘..’选取父节点
D、 ‘//’选取当前节点的子节点
答案: D
29、下列说法错误的是( XPath不能做多属性过滤 )
A、 ‘//*’选取整个HTML所有的节点
B、 ‘//li/a’选取<li>节点下的所有<a>节点
C、 XPath不能做多属性过滤
D、 XPath中的索引是从1开始的
答案: C
30、下列关于XPath中功能函数描述错误的是( contains( )方法可用于选取以指定值开头的节点 )
A、 contains( )方法可用于选取以指定值开头的节点
B、 and( )方法可用于选取同时包含两种指定值的节点
C、 text( )函数可用于选取包含指定文本内容的节点
D、 text( )函数可提取节点文本内容
答案: A
31、在MySQL数据库中,下列说法错误的是( 使用show database命令显示所有数据库 )
A、 使用show database命令显示所有数据库
B、 使用update命名修改数据
C、 使用delete命名删除数据
D、 使用insert into命名插入数据
答案: A
32、下列关于Chrome 开发者工具描述错误的是( 网络面板无法查看HTML源码 )
A、 元素面板可查看元素在页面的对应位置
B、 源代码面板可查看HTML源码
C、 网络面板无法查看HTML源码
D、 网络面板可查看HTTP头部信息
答案: C
33、下列关于BeautifulSoup中对象类型描述错误的是( attrs( )方法可获取Tag对象的HTML属性,返回值为列表形式 )
A、 name( )方法可以获取及修改Tag对象名称
B、 attrs( )方法可获取Tag对象的HTML属性,返回值为列表形式
C、 string( )方法可获取Tag对象中的文本字符串内容
D、 NavigableString对象无法被编辑,但可以进行替换
答案: B
二、判断题(本大题共10小题,每小题1.5分,共15分)
1、网站中的robots.txt可以无视。
答案: 错误
2、get方法相比post方法能携带更多信息。
答案: 错误
3、正则表达式中.*代表匹配任意内容。
答案: 正确
4、Selenium的webdriver的版本必须和浏览器的版本相对应。
答案: 正确
5、Selenium中模拟鼠标点击的函数是send_keys()。
答案: 错误
6、requests库中直接使用返回对象response.encoding的编码方式解析网页一定不会造成乱码问题。
答案: 错误
7、requests库中post()函数的data参数可以接收字典、字节序列或文件对象,作为请求体的内容提交给HTTP。
答案: 正确
8、在BeautifulSoup4库中CSS选择器'a[src*="abc"]'表示选择其src属性值中包含“abc”子串的所有<a>节点。
答案: 正确
9、在XPath语法中'body/div[1]'表示选取body节点下的第二个div子节点。
答案: 错误
10、Tag对象的string属性返回标签的文本信息,而text属性返回标签下所有标签的文本信息。
答案: 正确
11、在Match对象中group()方法分组的下标从1开始。
答案: 错误
12、在dumps()方法将python数据类型转化成JSON字符串时,将ensure_ascii设置为True,就能正常输出中文字符。
答案: 错误
13、csv库提供DIctWriter()方法用于初始化一个字典写入对象。
答案: 正确
14、find_elements_by_name()表示通过节点的name属性名定位,匹配返回第一个符合条件的节点。
答案: 错误
15、在selenium中,通过ActionChains类初始化对象browser,这个对象会存储所有用户产生的行为,需要通过perform()方法执行这些行为。
答案: 正确
16、对数据库中的数据进行了修改,需要通过游标对象的commit()方法提交事务,才会将修改后的数据真正更新到数据库中。
答案: 正确
17、在使用代码连接MySQL数据库时,如果指定的数据库还没创建也可以直接连接。
答案: 错误
18、在MongoDB中,可以通过find()方法查询多条记录,返回一个字典列表数据。
答案: 正确
19、在requests库中,可以在发送HTTP请求时,使用proxies参数添加代理IP。
答案: 正确
20、在Scrapy库中,Spider是负责处理所有的Request,并按照一定的方式将其进行整理。
答案: 错误
21、在settings.py文件中的ITEM_PIPELINES的键值是一个数字,数字越大优先级越高。
答案: 错误
三、填空题(本大题共5小题,每小题2分,共10分)
1、HTTP响应由(__)、(__)和(__)三部分组成。
答案: 响应状态码; 响应头; 响应体;
2、HTTP请求由(__)、 (__) 、 (__)和(__) 四部分组成。
答案:请求的URL; 请求方法; 请求头; 请求体;
3、匹配"abe""ace" 和"ade"的正则表达式为(__)
答案: a[bcd]e;
4、pymongo库使用MongoClient类连接数据库,须指定连接的数据库(__)和(__)。
答案: 地址; 端口;
5、表示匹配任意数字的正则表达式是(__).
答案: [0-9];\d;
6、Selenium中使用___(__)___获取某个元素显示在网页上的文本。
答案: .text;
7、
通过BeautifulSoup的CSS选择器soup对象定位到li节点
答案: soup.select('#J_goodsList>ul>li');
8、使用组合的方式匹配任意非数字的正则表达式是 。
答案: [^0-9];
9、通过正则表达式提取html标签名称:text = "<h1>这是标题</h1>"是 。
答案: re.search("<.+?>",text);
10、Selenium中使用_______获取某个标签的其他属性。
答案: get_atrribute();
11、使用组合方式匹配\w的正则表达式是 。
答案: [a-zA-Z0-9_];
12、通过正则表达式验证一个字符是不是0-100之间的数字,是 。
答案: 0$|[1-9]\d?$|100$;
13、获取所有li元素下的所有class属性的值的XPath语句是 。
答案: xpath('//li/@class');
14、获取倒数第二个li的a标签里内容的XPath语句是 。
答案: xpath('//li[last()-1]/a')[0].text;xpath('//li[last()-1]/a/text()');
15、获取最后一个li的a的href属性对应的值的XPath语句是 。
答案: xpath('//li[last()]/a/@href');
四、简答题(本大题共5小题,每小题5分,共25分)
1、简述网络爬虫基本工作原理。
答案:
(1)预先设定一个或若干个初始网页URL,将初始URL加入到待爬取URL列表中;
(2)从待爬取列表中逐个读取URL,并将URL加入到已爬取URL列表中,然后下载网页;
(3)解析已下载的网页,并存储提取的数据,从中获取新的URL;
(4)将新的URL在已爬取的URL列表中进行比对,检查该网页是否已爬取,如果网页没有被爬取,则将新的URL地址放入到待爬取URL列表的末尾,等待读取;
(5)如此往复,直到待爬取URL列表为空或者满足设定的终止条件,最终达到遍历网页的目的。
2、简述在浏览器中输入一个URL按下回车键后浏览器显示内容的这一过程的HTTP原理。
答案:
(1)浏览器向Web服务器发送了一个HTTP请求;
(2)Web服务器接收请求后进行解析和处理,返回给浏览器对应的HTTP响应;
(3)浏览器对HTTP响应进行解析,将网页呈现。
3、简述常见的几种反爬虫策略。
答案:
(1)通过Headers反爬虫通过识别用户请求的Headers来反爬虫
(2)基于用户行为反爬虫通过检测用户行为来判断请求是否来自爬虫程序
4、写出图片验证码的识别思路。
答案:
(1)获取验证码图片。
(2)将图像转化为灰度图像。
(3)将灰度图像转化为二值图像。
(4)使用OCR技术识别图中字母或数字。
5、简述点触验证码的识别思路。
答案:
(1)获取验证码图片。
(2)获取单击的位置坐标。
(3)解析坐标,模拟点击。
6、简述滑动拼图验证识别思路。
答案:
(1)获取验证码图片。
(2)在图片上绘制文字。
(3)获取滑块移动至缺口的距离。
(4)生成滑块移动轨迹。
(5)模拟拖动滑块。
7、Scrapy框架由哪7个组件构成,每个组件的有什么功能?
答案:
(1)Engine :处理系统的数据流、触发事务,是整个框架的核心。
(2)Scheduler :处理所有的Request, 并按照一定的方式将其进行整理、排列和入队。
(3)Downloader :下载网页内容。
(4)Spider:解析所有的Response,提取Item所需的数据和新的URL。
(5) Item Plpeline :处理Item
(6)Downloader Middleware:自定义扩展下载功能。
(7)Spider Middleware:自定义扩展Engine和Spider间通信的功能。
8、简述Scrapy中Engine控制数据流的工作基本步骤。
答案:
(1) Engine 从Spider获取初始爬取列表的Request.
(2) Engine将要爬取的Request发送给Scheduler,通过Scheduler进行调度。
(3) Engine向Scheduler获取下一个要爬取的Request.
(4) Engine 将Request通过Downloader Middleware发送给Downloader.
(5)当网页下载完毕,Downloader 生成该网页的Response,并将其通过Downloader Middleware提交给Engine.
(6) Engine 将接收到Response通过Spider Middleware发送给Spider处理。
(7) Spider 解析响应,提取Item所需的数据和新的URL,并将Item和新的Request通过Spider Middleware提交给Engine。
(8) Engine 将Item发送给Item Pipeline,将新的Request发送给Scheduler.
(9)重复第(2) ~ (8) 步,直到Scheduler中没有Request, Engine 关闭该爬虫程序,爬取结束。
9、简述cookie和session会话的联系与区别。
答案:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
3、session比较占用你服务器的性能
4、单个cookie保存的数据不能超过4K
10、罗列五个常见的请求头信息。
答案:
User-Agent
Accept
Referer cookie
Content-Type
11、简述JSON数据的本质与使用。
答案:
JSON的本质:是一个字符串,JSON是对JS对象的字符串表达式,它使用文本形式表示一个JS对象的信息。
JSON使用:
(1)json.dumps,将Python的list或者dict返回为一个JSON字符串;
(2)json.loads,将JSON字符串返回为Python的list或者dict;
(3)json.dump,将Python的list或者dict转为一个JSON字符串,保存到文件中;
(4)json.load ,从JSON文件中读出JSON数据,并转换为Python的list或者dict。
12、简述下在 requests 模块中,requests.content 和 requests.text 什么区别。
答案:
requests.text返回的是unicode型数据,requsets.content返回的是bytes(二进制)型数据
13、简述下通用爬虫工作流程。
答案:
工作流程可以分为爬取网页、解析网页和存储数据三个步骤。
14、解释一下一个URL由几个部分组成:scheme://host:port/path/?query-string=xxx#anchor
答案:
URL:是对可以从互联网上得到的资源位置和访问方法的一种简洁表示,是互联网上标准资源的地址。
scheme:协议
host/IP:服务器的IP地址或者域名
port:服务器的端口
path:访问资源的路径
query-string:参数,发送给http服务器的数据
anchor:锚
15、request请求方式中的post、get有什么区别
答案:
GET一般用于获取/查询资源信息,而POST一般用于更新资源信息;
get安全性非常低,post安全性较高,但是get执行效率却比Post方法好
16、简述使用Scrapy框架的一般流程。
答案:
1.创建新项目;2.修改items脚本,定义Item中数据的结构;3.创建spider脚本,解析响应,提取数据和新的URL;4.修改settings.py脚本,设置Scrapy组件和定义全局变量;5.运行爬虫程序。
五、编程题(本大题共2小题,每小题10分,共20分)
1、
编写一个python程序,参考附录中的内容,使用python中的selenium模块完成以下内容: a. 打开谷歌浏览器 b. 访问百度首页 c. 在百度首页的文本输入框中输入“泉州职业技术大学” d. 点击“百度一下”按钮 附录1:百度首页中输入框对应的html代码 `<input id="kw" name="wd" value="" maxlength="255" autocomplete="off">` 附录2:百度首页中“百度以下”按钮对应的html代码 `<input type="submit" id="su" value="百度一下" class="bg s_btn">`
答案:
from selenium import webdriver
Browser = webdriver.Chrom()
Browser.get(“https://www.baidu.com”)
Browser.find_element_by_id(‘kw’).send_keys(“泉州职业技术大学”)
Browser.find_element_by_id(‘su’).click()
2、使用Selenium模拟浏览器访问淘宝首页(网址https://www.taobao.com/),通过selenium库提供的常用方法定位节点,输出爬取到的节点和节点信息。
附录:
<input id="q" name="q" aria-label="请输入搜索文字" accesskey="s" autofocus="true" autocomplete="off" aria-haspopup="true" aria-combobox="list" role="combobox" x-webkit-grammar="builtin:translate">
答案:
from selenium import webdriver #导入webdriver模块
#初始化Google Chrome浏览器对象,并赋值给browser
browser = webdriver.Chrome()
#请求淘宝首页,打开一个浏览器窗口
browser.get('https://www.taobao.com/')
#输出id属性值为“q”的节点
print('通过id属性值“q”定位节点:')
print(browser.find_element_by_id('q'))
#输出class属性值为“btn-search”的节点
print('通过class属性值“btn-search”定位节点:')
print(browser.find_element_by_class_name('btn-search'))
#输出使用XPath定位的id属性值为“q”的节点
print('通过XPath定位id属性值为“q”的节点:')
print(browser.find_element_by_xpath('//input[@id="q"]'))
#输出使用CSS选择器定位的class属性值为“btn-search”的节点
print('通过CSS选择器定位class属性值为“btn-search”的节点:')
print(browser.find_element_by_css_selector('.btn-search'))
#定位class属性值为“btn-search”的节点,并赋值给element
element = browser.find_element_by_class_name('btn-search')
#输出element的type属性值
print('class属性值为“btn-search”节点的type属性值:', element.get_attribute("type"))
#输出element的文本
print('class属性值为“btn-search”节点的文本:', element.text)
#输出element的节点名
print('class属性值为“btn-search”节点的节点名:', element.tag_name)
#输出element的id
print('class属性值为“btn-search”节点的id:', element.id)
3、爬取Python中文开发者社区的Python高级教程网页(网址https://www.pythontab.com/html/pythonhexinbiancheng/),输出所有页面的URL、响应状态码和请求头。(总共有27页,从第2页开始每翻一页url变成https://www.pythontab.com/html/pythonhexinbiancheng/2.html,以此类推至https://www.pythontab.com/html/pythonhexinbiancheng/27.html)
附录:
headersvalue = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
} #设置请求头的User-Agent信息
#定义代理IP
proxy = {'http': 'http://121.232.148.167:9000'}
答案:
import time #导入time模块
import random #导入random模块
import requests #导入requests模块
#定义base_url字符串
base_url='https://www.pythontab.com/html/pythonhexinbiancheng/'
headersvalue = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
} #设置请求头的User-Agent信息
#定义代理IP
proxy = {'http': 'http://121.232.148.167:9000'}
for i in range(1,28): #循环
if i>1:
url = base_url+str(i)+'.html'#组合网页URL
else:
url = base_url #第一页URL
print(url) #输出每个页面的URL
#异常判断
try:
#设置代理IP,发送HTTP请求
r=requests.get(url,headers=headersvalue,proxies=proxy)
except:
print('请求失败') #请求错误,输出“请求失败”
else:
print(r.status_code) #输出响应状态码
print(r.request.headers) #输出请求头
#设置随机休眠时间
sleep_time = random.randint(0, 2) + random.random()
time.sleep(sleep_time) #程序休眠sleep_time