D.
答案: A
★难度:中
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
52、以下哪个HTML标签表示定义列表项目()
A.
B.-
C.
D.
答案: B
★难度:中
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
53、以下哪个HTML标签表示定义 HTML 表格中的行()
A.
B.-
C.
D.
答案: C
★难度:中
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
54、以下哪个HTML标签表示定义 HTML 表格中的标准单元格()
A.
B.-
C.
D.
答案: D
★难度:中
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
55、在Python中,为了使用XPath,需要安装一个第三方库()
A.lxml
B.xml
C.xpath
D.path
答案: A
★难度:易
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
56、使用Xpath获取文本使用()
A.text
B.text()
C.content
D.content()
答案: B
★难度:中
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
57、使用Xpath构造相同字符串开头的路径采用()方法
A.starts-with
B.starts
C.begin
D.begin-with
答案: A
★难度:中
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
58、使用Xpath构造属性值包含相同字符串的路径采用()方法
A.contain
B.contains
C.include
D.includes
答案: B
★难度:中
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
59、使用xpath方法的返回类型是()
A.列表
B.元组
C.字典
D.集合
答案: A
★难度:中
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
60、请问按哪个键可以打开Chrome自带的开发者工具()
A.F10
B.F1
C.F11
D.F12
答案: D
★难度:易
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
61、用Xpathh获取第二个div标签应该是()
A.dvi(1)
B.div(2)
C.div[1]
D.div[2]
答案: D
★难度:中
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
62、BS4可以用来从()中提取数据
A.HTML
B.XML
C.数据库
D.JSON
答案: A B
★难度:易
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
63、使用BeautifulSoup对象后可以使用()来查找内容
A.find_all
B.find
C.search
D.search_all
答案: A B
★难度:易
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
64、针对解析源代码的BeautifulSoup对象,构造时BeautifulSoup(网页源代码, '解析器')中的解析器可以为()
A.html
B.html.parser
C.lxml
D.xml
答案: A C
★难度:中
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
65、MongoDB中数据存储的形式类似于()
A.列表
B.元组
C.字典
D.集合
答案: C
★难度:中
参见章节:第6章
考核知识点:Python与数据库
试题解析:
66、在Mac OS下安装MongoDB使用命令() install mongodb
A.brew
B.apt-get
C.sudo
D.apt
答案: A
★难度:中
参见章节:第6章
考核知识点:Python与数据库
试题解析:
67、启动MongoDB使用命令mongod --() usr/local/etc/mongod.conf
A.config
B.install
C.start
D.begin
答案: A
★难度:中
参见章节:第6章
考核知识点:Python与数据库
试题解析:
68、以下哪个命令是利用URL语法在命令行下工作的文件传输工具()
A.curl
B.tar -zxvf
C.mkdir
D.cp
答案: A
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
69、以下哪个命令是linux下解压缩命令()
A.curl
B.tar -zxvf
C.mkdir
D.cp
答案: B
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
70、以下哪个命令是创建文件夹命令()
A.curl
B.tar -zxvf
C.mkdir
D.cp
答案: C
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
71、以下哪个命令是复制文件或者文件夹命令()
A.curl
B.tar -zxvf
C.mkdir
D.cp
答案: D
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
72、如果使用Python的数据结构来做类比的话,MongoDB中文档相当于一个()
A.列表
B.元组
C.字典
D.集合
答案: C
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
73、如果使用Python的数据结构来做类比的话,MongoDB中集合相当于一个()
A.列表
B.元组
C.字典
D.集合
答案: A
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
74、如果使用Python的数据结构来做类比的话,MongoDB中库相当于一个()
A.列表
B.元组
C.字典
D.集合
答案: C
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
75、如果使用Python的数据结构来做类比的话,MongoDB中库相当于一个大字典,大字典里面的每一个键值对都对应了一个集合,Key为(),Value就是一个集合。
A.字典
B.集合的名字
C.集合
D.文档
答案: B
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
76、如果使用Python的数据结构来做类比的话,MongoDB中库相当于一个大字典,大字典里面的每一个键值对都对应了一个集合,Key为集合的名字,Value就是一个()。
A.字典
B.集合的名字
C.集合
D.文档
答案: C
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
77、MongoDB中获取名字为db的库的语句为()
A.client.db
B.client('db')
C.client['db']
D.client{'db'}
答案: A C
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
78、MongoDB中获取名字为set1的集合的语句为()
A.database.set1
B.database('set1')
C.database['set1']
D.database{'set1'}
答案: A C
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
79、MongoDB中可以将()数据结构插入集合中
A.列表
B.元组
C.字典
D.集合
答案: C
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
80、以下哪种方法是MongoDB的查找方法()
A.find
B.find_one
C.finds
D.find_all
答案: A B
★难度:中
参见章节:第6章
考核知识点:Python与数据库
试题解析:
81、PyMongo中的查找方法的参数是哪种数据结构()
A.列表
B.元组
C.字典
D.集合
答案: C
★难度:中
参见章节:第6章
考核知识点:Python与数据库
试题解析:
82、PyMongo中逻辑查询表示大于的符号是()
A.$gt
B.$lt
C.$gte$$lte
答案: A
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
83、PyMongo中逻辑查询表示大于等于的符号是()
A.$gt
B.$lt
C.$gte$$lte
答案: C
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
84、PyMongo中逻辑查询表示小于的符号是()
A.$gt
B.$lt
C.$gte$$lte
答案: B
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
85、PyMongo中逻辑查询表示小于等于的符号是()
A.$gt
B.$lt
C.$gte$$lte
答案: D
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
86、PyMongo中逻辑查询表示等于的符号是()
A.$gt
B.$lt
C.$eq$$ne
答案: C
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
87、PyMongo中逻辑查询表示不等于的符号是()
A.$gt
B.$lt
C.$eq$$ne
答案: D
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
88、PyMongo中查询所有age > 29的记录是()
A.collection.find({'age': {'$gt': 29}})
B.collection.find({'age'>29})
C.collection.find_all({'age': {'$gt': 29}})
D.collection.find_all({'age'>29})
答案: A
★难度:中
参见章节:第6章
考核知识点:Python与数据库
试题解析:
89、PyMongo更新操作有()
A.update
B.update_all
C.update_one
D.update_many
答案: C D
★难度:中
参见章节:第6章
考核知识点:Python与数据库
试题解析:
90、PyMongo删除操作有()
A.delete
B.delete_all
C.delete_one
D.delete_many
答案: C D
★难度:中
参见章节:第6章
考核知识点:Python与数据库
试题解析:
91、Redis是一个开源的使用()语言编写
A.ANSI C
B.C++
C.JAVA
D.Python
答案: A
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
92、Redis是()数据库
A.关系数据库
B.键值数据库
C.列存数据库
D.图数据库
答案: B
★难度:难
参见章节:第6章
考核知识点:Python与数据库
试题解析:
93、Redis是遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库
A.
答案: T
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
94、Redis中的值可以支持()
A.列表
B.哈希
C.集合
D.有序集合
答案: A B C D
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
95、Redis若要进入交互环境,需要打开终端输入()
A.redis-cli
B.redis
C.redis-cmd
D.redis-start
答案: A
★难度:难
参见章节:第6章
考核知识点:Python与数据库
试题解析:
96、Redis中写数据到列表中,使用关键字()
A.push
B.append
C.lpush
D.lappend
答案: C
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
97、Redis中查看一个列表长度,使用关键字()
A.len
B.length
C.llen
D.count
答案: C
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
98、Redis中如果不删除列表中的数据,又要把数据读出来,就需要使用关键字()
A.range
B.lrange
C.srange
D.pop
答案: B
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
99、Redis中读取数据语句lrange chapter 0 3,那么表示读列表中()个值
A.2
B.3
C.4
D.5
答案: C
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
100、Redis中往集合中添加数据,使用关键字()
A.sadd
B.add
C.append
D.sappend
答案: A
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
101、Redis中往集合中读数据,使用关键字()
A.pop
B.spop
C.lpop
D.range
答案: B
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
102、Redis中从集合中查看有多少个值,用关键字()
A.scard
B.card
C.count
D.distinct
答案: A
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
103、采用以下()技术可以实现异步加载
A.HTML
B.AJAX
C.CSS
D.HTTP
答案: B
★难度:易
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
104、某些网站在发起Ajax请求时会携带()字符串用于身份验证
A.Token
B.Cookie
C.ReqTime
D.sum
答案: A
★难度:中
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
105、查看网站请求一般在Chrome开发者模式下的()选项卡中查看
A.Console
B.Sources
C.Network
D.Performance
答案: C
★难度:易
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
106、Python中的()库用于发送网络请求
A.web
B.request
C.requests
D.javascript
答案: C
★难度:易
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
107、Python在Windows路径字符串左引号的左边加()符号来避免反斜杠问题
A.s
B.c
C.d
D.r
答案: D
★难度:易
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
108、通常使用()工具来模拟浏览器进行爬虫请求
A.Selenium
B.Chrome
C.ChromeDriver
D.WebDriver
答案: A
★难度:易
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
109、下列哪项不是HTTP的请求类型()
A.GET
B.POST
C.PUT
D.SET
答案: D
★难度:中
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
110、当需要把Python里面的数据发送给网页时,需要先转换成()字符串
A.Python
B.Json
C.正则表达式
D.Ajax
答案: B
★难度:易
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
111、通过()爬取伪装成异步加载的后端渲染数据
A.正则表达式
B.Json字符串
C.JavaScript
D.Get
答案: A
★难度:难
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
112、使用Selennium获取网页中元素的方法有
A.find_element_by_name
B.find_element_by_id
C.find_elements_by_name
D.find_elements_by_id
答案: A B C D
★难度:中
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
113、带上通过Chrome浏览器从评论页面复制而来的()再发起请求,可以减少爬虫被网站封锁的概率
A.Cookie
B.Html
C.Headers
D.CSS
答案: C
★难度:中
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
114、当需要把Python里面的数据发送给网页时,应先将其转换成()
A.Json字符串
B.GET
C.POST
D.Request
答案: A
★难度:中
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
115、服务器端记录信息确定用户身份的数据是
A.session
B.cookies
C.moonpies
D.localstorage
答案: A
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
116、浏览器用来记录用户状态信息的数据叫
A.session
B.cookies
C.moonpies
D.selenium
答案: B
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
117、Chrome的开发者工具中哪个选项可以查找到cookies
A.Elements
B.Sources
C.Network
D.Peformance
答案: C
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
118、以下表示请求正常处理的HTTP状态码为
A.200
B.301
C.404
D.500
答案: A
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
119、以下表示请求资源找不到的HTTP状态码为
A.200
B.301
C.404
D.500
答案: C
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
120、以下表示请求资源重定向的HTTP状态码为
A.200
B.301
C.404
D.500
答案: B
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
121、python中可以用来将图片中的文字转换为文本的第三方类库是
A.lxml
B.requests
C.beautifulsoup
D.pytesseract
答案: D
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
122、可以通过()绕过网站登录。
A.session
B.cookies
C.moonpies
D.localstorage
答案: B
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
123、chrome默认打开开发者工具的快捷是
A.F5
B.F11
C.F12
D.F2
答案: C
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
124、cookies的缺点是
A.实现自动登录
B.跟踪用户状态
C.http中明文传输
D.增加http请求的流量
答案: C D
★难度:中
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
125、HTTP常用状态码表明请求被正常处理的有()
A.200
B.301
C.302
D.204
答案: A D
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
126、HTTP常用状态码表明表明浏览器需要执行某些特殊的处理以正确处理请求的有()
A.200
B.301
C.302
D.204
答案: B C
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
127、HTTP常用状态码表明表明客户端是发生错误的原因所在的有()
A.403
B.404
C.500
D.503
答案: A B
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
128、HTTP常用状态码表明表明服务器本身发生错误的有()
A.403
B.404
C.500
D.503
答案: C D
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
129、HTTP常用状态码表明服务器内部资源出故障了的是()
A.500
B.503
C.403
D.404
答案: A
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
130、HTTP常用状态码表明服务器正忙的是()
A.500
B.503
C.403
D.404
答案: B
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
131、HTTP常用状态码表明服务器上没有请求的资源的是()
A.500
B.503
C.403
D.404
答案: D
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
132、HTTP常用状态码表明服务器不允许访问那个资源的是()
A.500
B.503
C.403
D.405
答案: C
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
133、HTTP状态码401表示
A.请求报文中可能存在语法错误
B.请求需要通过HTTP认证
C.请求资源的访问被拒绝
D.服务器上没有请求的资源
答案: B
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
134、打码平台一般通过()识别验证码。
A.人工识别
B.机器学习识别
C.光学字符识别
D.深度学习识别
答案: A
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
135、Python中专门用来处理图像的第三方库是
A.lxml
B.Pillow
C.beautifulsoup
D.pytesseract
答案: B
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
136、以下HTTP状态码与302等价的是
A.301
B.303
C.304
D.307
答案: D
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
137、常用的会话跟踪技术是
A.session
B.cookies
C.moonpies
D.localstorage
答案: A B
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
138、以下HTTP状态码表示服务器没有正常返回结果的是
A.200
B.301
C.404
D.500
答案: B C D
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
139、要使用tesseract来进行图像识别,需要安装两个第三方库
A.requests
B.beautifulsoup
C.Pillow
D.pytesseract
答案: C D
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
140、自动填充验证码的方式有
A.手动识别填写
B.图像识别
C.打码网站
D.浏览器自动识别
答案: B C
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
141、以下HTTP状态码表示服务器本身发生错误的是
A.400
B.503
C.302
D.500
答案: B D
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
142、cookies的缺点是
A.实现自动登录
B.跟踪用户状态
C.http中明文传输
D.增加http请求的流量
答案: C D
★难度:中
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
143、以下关于Charles的说法正确的是( )
A.Charles是一个跨平台的HTTP抓包工具,可以截取HTTP或者HTTPS请求的数据包
B.Charles有Windows 32/64版和Linux 64 版,但是目前还没有对Mac OS进行有效的支持。
C.Charles上面滚动的数据就是目前计算机发起的数据包。单击工具栏上面的黄色笤帚图标,可以清停止抓包。
D.在Charles启动时,系统自带浏览器的部分HTTP流量不会经过Charles。
答案: A
★难度:易
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
144、下面关于Charles使用说法错误的是()
A.在数据包非常多的情况下,使用Charles的过滤功能来对数据包进行过滤从而减少干扰。
B.通过单击图中方框框住的各个选项卡,可以非常直观地观察到请求和返回的各种信息。
C.如果浏览器是Chrome,在没有安装第三方代理插件的情况下,Chrome的HTTP流量都会经过Charles。
D.Charles无法支持计算机上除了浏览器之外的其他软件。
答案: D
★难度:中
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
145、下列关于在IOS上配置charles的说法正确的是()
A.不同ios设备之间会有比较大的差别,所以配置的时候需要找到对应的安装证书的入口。
B.手机和电脑需要在同一个局域网下。
C.HTTP代理可以使用“自动”选项。
D.安装好证书以后,打开iOS设备上的任何一个App,可以看到Charles中有数据包在流动
答案: B D
★难度:易
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
146、下列说法错误的是()
A.小程序的请求极其简单,基本上没有验证信息
B.用Python来请求小程序的后台接口从而获取数据,比请求异步加载网页的后台接口要复杂很多。
C.如果目标网站有微信小程序,那么一定要优先调查能否通过小程序的接口来抓取数据。
D.小程序的反爬虫能力比网页版的低很多。使用小程序的接口来爬数据,能极大提高爬虫的开发效率。
答案: B
★难度:易
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
147、下列说法错误的是()
A.Charles只能截获HTTP和HTTPS的数据包,如果网站使用的是websocket或者是flashsocket,那么Charles就无能为力。
B.有一些App会自带证书,使用其他证书都无法正常访问后台接口。在这种情况下,Charles自带的证书就不能正常使用,也就没有办法抓取这种App的数据
C.有一些App的数据经过加密,App接收到数据以后在其内部进行解密。Charles无法获取这种App的数据
D.对于上述情况,Charles能抓取到经过加密的数据。但是如果无法知道数据的具体加密方法,就没有办法
答案: C
★难度:易
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
148、下列关于mitmproxy的安装说法错误的是()
A.对于Mac OS系统,使用Homebrew安装mitmproxy,命令为:brew install mitmproxy
B.在Ubuntu中,要安装mitmproxy,首先需要保证系统的Python为Python 3.5或者更高版本
C.在windows系统中无法使用linux的命令,只能通过下载安装包来安装
D.UBUNTU中执行命令 sudo pip3 install mitmproxy 进行安装
答案: C
★难度:易
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
149、下列关于mitmproxy的使用说法正确的是()
A.mitmproxy的端口为8080端口。
B.设置好代理以后,在手机上打开一个App或者打开一个网页,可以看到mitmproxy上面有数据滚动。
C.用鼠标在终端窗口上单击其中的任意一个请求,可以显示这个数据包的详情信息。
D.如果要访问HTTPS网站,还需要安装mitmproxy的证书
答案: A B C D
★难度:易
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
150、使用python定制mitmproxy,下面的语句请求的是()。{req.headers["User-Agent"]}
A.headers
B.文本内容
C.目标网站
D.user-agent
答案: D
★难度:易
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
151、下列说法错误的是()
A.mitmproxy的强大之处在于它还自带一个mitmdump命令。这个命令可以用来运行符合一定规则的Python脚本,并在Python脚本里面直接操作HTTP和HTTPS的请求,以及返回的数据包。
B.命令行中执行mitmdump -s parse_request.py即可运行python 脚本
C.使用python可以自定义返回的数据包,如 response.headers,就是返回的头部信息
D.如果返回的是JSON类型的字符串,python无法进行解析。
答案: A B C
★难度:易
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
152、在配置ios使用Charles的操作中,正确的有()
A.对于苹果设备,首先要保证计算机和苹果设备联在同一个Wi-Fi上。
B.选择“HTTP代理”下面的“手动”选项卡,在“服务器”处输入计算机的IP地址,在“端口”处输入8888
C.输入完成代理以后按下苹果设备的Home键,设置就会自动保存。
D.安装完成证书以后,在设置中打开“关于本机”,找到最下面的“证书信任设置”,并在里面启动对Charles证书的完全信任
答案: A B C D
★难度:中
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
153、要使用Python来操作UI Automator从而控制手机,需要安装一个第三方库()
A.uiautomator
B.automator
C.ui_automator
D.pyautomator
答案: A
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
154、Python并导入uiautomator来操作设备的语句是from uiautomator import ()
A.Device
B.Devices
C.Jobs
D.Job
答案: A
★难度:中
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
155、使用UI Automator打开微信的操作是获取相应图标后使用命令()
A.touch
B.click
C.push
D.hover
答案: B
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
156、如果计算机上连接了很多台手机,查看这些手机串号,需要在终端输入以下命令:()
A.adb device
B.adb devices
C.adb devices -l
D.adb devices -list
答案: C
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
157、使用UI Automator获取屏幕上显示的文本内容的操作是得到相应控件后使用命令()
A.content
B.text
C.title
D.body
答案: B
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
158、使用UI Automator获滚动屏幕的操作是得到相应控件后使用命令()
A.scroll
B.scroll_up
C.scroll_forword
D.scroll_back
答案: A
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
159、使用UI Automator使屏幕向上滚动一屏的操作是得到相应控件后使用命令()
A.scroll_forwad
B.scroll_up
C.scroll.forward
D.scroll.vert.forward
答案: D
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
160、使用UI Automatorr让屏幕向左滚动的操作是得到相应控件后使用命令()
A.scroll.left
B.scroll.horiz.left
C.scroll.forward
D.scroll.horiz.forward
答案: D
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
161、使用UI Automatorr根据坐标来滑动桌面的操作是得到相应控件后使用命令()
A.swipe
B.move
C.scroll
D.fly
答案: A
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
162、使用UI Automatorr长按点击的操作是得到相应控件后使用命令()
A.longclick
B.long_click
C.clicklong
D.click_long
答案: B
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
163、使用UI Automatorr输入文字的操作是得到相应控件后使用命令()
A.settext
B.set
C.set_text
D.text
答案: C
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
164、使用UI Automatorr判断元素是否存在的操作是得到相应控件后使用命令()
A.exist
B.exists
C.isnull
D.contains
答案: B
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
165、使用UI Automatorr点亮屏幕的操作是得到相应控件后使用命令()
A.wakeup
B.light
C.bright
D.sleep
答案: A
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
166、打开终端,输入(),屏幕上会出现Python的路径
A.python path
B.path python
C.which python
D.python which
答案: C
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
167、在Linux中哪个命令是添加权限的()
A.chmod
B.sudo
C.cp
D.mkdir
答案: A
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
168、windows中创建定时任务的命令为
A.task
B.schtasks
C.createtasks
D.maketasks
答案: B
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
169、Python中有哪些实现多线程方法()
A.multiprocess.dummy
B.threading.Thread
C.process
D.PyMongoDB
答案: A B
★难度:中
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
170、当爬虫创建好了之后,可以使用"scrapy()<爬虫名>" 命令运行爬虫。
A.startup
B.starwar
C.drawl
D.crawl
答案: D
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
171、在Scrapy的目录下,哪个文件负责存放爬虫文件?()
A.spiders文件夹
B.item.py
C.pipeline.py
D.settings.py
答案: A
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
172、在Scrapy的目录下,哪个文件负责定义需要爬取的数据?()
A.spiders文件夹
B.item.py
C.pipeline.py
D.settings.py
答案: B
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
173、在Scrapy的目录下,哪个文件负责数据抓取以后的处理工作?()
A.spiders文件夹
B.item.py
C.pipeline.py
D.settings.py
答案: C
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
174、在Scrapy的目录下,哪个文件负责存放爬虫的各种配置信息?()
A.spiders文件夹
B.item.py
C.pipeline.py
D.settings.py
答案: D
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
175、要想让Scrapy结合Redis,应该对Scrapy爬虫请求的调度算法进行修改,以下哪种修改不能完成这一任务?()
A.队列
B.栈
C.上锁
D.优先级队列
答案: C
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
176、xpath中extract方法返回值类型是()
A.列表
B.元组
C.字典
D.集合
答案: A
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
177、参数headers=(),把请求头添加到Scrapy请求中,使爬虫的请求看起来像是从浏览器发起的。
A.HEADER
B.HEADERS
C.HEAD
D.BODY
答案: B
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
178、()是一个传递信息的通道。它负责将爬取博文列表页获取到的信息传递给负责爬取正文页的方法中。
A.meta
B.head
C.header
D.body
答案: A
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
179、Scrapy中使用Xpath获得的结果调用了.extract方法,结果以()形式生成
A.列表
B.元组
C.字典
D.集合
答案: A
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
180、lxml库中etree模块的()方法把Selector对象转换为bytes型的源代码数据
A.etree.tostring
B.etree.convertBytes
C.etree.toBytes
D.etree.convertstring
答案: A
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
181、Scrapy自带的待爬队列是()
A.deque
B.queue
C.list
D.lqueue
答案: A
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
182、使用了RedisSpider作为爬虫的父类以后,爬虫会直接监控()中的数据,并不读取start_urls中的数据。
A.Redis
B.RedisSpider
C.Spider
D.MongoDB
答案: A
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
183、Scrapy_redis是Scrapy的“()”,它已经封装了使用Scrapy操作Redis的各个方法
A.组件
B.模块
C.控件
D.单元
答案: A
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
184、下载器中间件的作用有哪些?
A.更换代理IP
B.更换Cookies
C.更换User-Agent
D.自动重试
答案: A B C D
★难度:易
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
185、当爬虫运行到yield scrapy.Request()或者yield item的时候,下列哪个爬虫中间件的方法被调用?
A.process_spider_output()
B.process_spider_exception()
C.process_spider_input()
D.process_start_ requests()
答案: A
★难度:中
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
186、一个可行的自动更换代理的爬虫系统,应该下列哪些功能?
A.有一个小爬虫ProxySpider去各大代理网站爬取免费代理并验证,将可以使用的代理IP保存到数据库中
B.在发现某个请求已经被设置过代理后,什么也不做,直接返回
C.在ProxyMiddlerware的process_request中,每次从数据库里面随机选择一条代理IP地址使用
D.周期性验证数据库中的无效代理,及时将其删除
答案: A C D
★难度:中
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
187、为了解决爬虫代码本身的错误引起的异常,可以采用下列哪些方法
A.仔细检查代码
B.开发爬虫中间件
C.开发下载器中间件
D.等待
答案: A B
★难度:中
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
188、()是Scrapy官方开发的,用来部署、运行和管理Scrapy爬虫的工具
A.Scrapyd
B.ScrapyDeploy
C.Deploy
D.Scrapy_Deploy
答案: A
★难度:易
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
189、如果爬虫爬取的是商业网站,并且目标网站使用了反爬虫机制,那么强行突破反爬虫机制可能构成()
A.非法侵入计算机系统罪
B.非法获取计算机信息系统数据罪
C.非法获取计算机数据罪
D.非法获取系统罪
答案: A B
★难度:中
参见章节:第13章
考核知识点:爬虫开发中的法律和道德问题
试题解析:
190、如果目标网站有反爬虫声明,那么对方在被爬虫爬取以后,可以根据()来起诉使用爬虫的公司
A.服务器日志
B.数据库日志记录
C.程序日志记录
D.服务器监控
答案: A B C D
★难度:难
参见章节:第13章
考核知识点:爬虫开发中的法律和道德问题
试题解析:
191、网站根目录中哪个文件里面的内容会告诉爬虫哪些数据是可以爬取的,哪些数据是不可以爬取的()。
A.robot.txt
B.robot.html
C.robots.txt
D.robots.html
答案: C
★难度:易
参见章节:第13章
考核知识点:爬虫开发中的法律和道德问题
试题解析:
192、在Scrapy工程的settings.py文件中,哪个配置项,如果设置为True,那么Scrapy就会自动跳过网站不允许爬取的内容()
A.ROBOTSTXT_ OBEY
B.ROBOTSTXT_JUDGE
C.ROBOTSTXT
D.ROBOTSTXT_ IF
答案: A
★难度:易
参见章节:第13章
考核知识点:爬虫开发中的法律和道德问题
试题解析:
193、如果很多爬虫同时对一个网站全速爬取,那么其实就是对网站进行了()攻击
A.XSS
B.DOS
C.DDOS
D.跨域
答案: C
★难度:易
参见章节:第13章
考核知识点:爬虫开发中的法律和道德问题
试题解析:
二、主观部分:
(一)、填空部分
1、Ubuntu中安装Python的语句为sudo ______ install python3.6 python3-dev python3-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
答案: apt-get
★难度:易
参见章节:第2章
考核知识点:Python基础
试题解析:
2、Python中若定义object=(1, 2, 3, 4, 5),则print(object[-2])输出______
答案: 4
★难度:易
参见章节:第2章
考核知识点:Python基础
试题解析:
3、Python中若定义object=(1, 2, 3, 4, 5),则print(object[:3])输出______
答案: 45
★难度:易
参见章节:第2章
考核知识点:Python基础
试题解析:
4、Python中若定义object=[1, 2, 3, 4, 5],则print(object[1:3])输出______
答案: 23
★难度:难
参见章节:第2章
考核知识点:Python基础
试题解析:
5、Python中若定义object=(1, 2, 3, 4, 5),则print(object[:3])输出______
答案: 123
★难度:中
参见章节:第2章
考核知识点:Python基础
试题解析:
6、Python中若定义object=[1, 2, 3, 4, 5],则print(object[::-1])输出______
答案: [5,4,3,2,1]
★难度:难
参见章节:第2章
考核知识点:Python基础
试题解析:
7、Python中若object_1=[1,2],object_2=[3,4],则print(object_1+object_2)输出为______
答案: [1,2,3,4]
★难度:中
参见章节:第2章
考核知识点:Python基础
试题解析:
8、Python中跳过本次循环应用关键字______
答案: continue
★难度:易
参见章节:第2章
考核知识点:Python基础
试题解析:
9、Python中退出循环应用关键字______
答案: break
★难度:易
参见章节:第2章
考核知识点:Python基础
试题解析:
10、Python中定义函数关键字为______
答案: def
★难度:易
参见章节:第2章
考核知识点:Python基础
试题解析:
11、Python正则表达式模块的findall方法若想忽略换行符,需要哪个flag:______
答案: re.S
★难度:难
参见章节:第3章
考核知识点:正则表达式与文件操作
试题解析:
12、使用pip安装requests的命令为______
答案: pip install requests
★难度:易
参见章节:第4章
考核知识点:简单的网页爬虫方法
试题解析:
13、Python中若要获取0-9,10个数字的列表,则应如何补充代码origin_num = [x for x in range(______)]
答案: 10
★难度:易
参见章节:第4章
考核知识点:简单的网页爬虫方法
试题解析:
14、Windows下启动MongoDB命令是______
答案: mongod.exe --config mongodb.conf
★难度:难
参见章节:第6章
考核知识点:Python与数据库
试题解析:
15、Linux下启动MongoDB命令是______ --config mongodb.conf
答案: mongod
★难度:难
参见章节:第6章
考核知识点:Python与数据库
试题解析:
16、Linux下启动MongoDB命令是mongod --config ______
答案: mongodb.conf
★难度:难
参见章节:第6章
考核知识点:Python与数据库
试题解析:
17、MongoDB如果需要从外网访问数据库,那么需要修改安装MongoDB时用到的配置文件______
答案: mongod.conf
★难度:难
参见章节:第6章
考核知识点:Python与数据库
试题解析:
18、PyMongo中查询29 ≤ age ≤ 40的记录的语句是collection.______
答案: find({'age': {'$gte': 29, '$lte': 40}})
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
19、PyMongo针对age字段操作将所有年龄为20岁的人年龄全部改为30的语句为collection.______
答案: update_many({‘age’:20},{‘$set’:{‘age’:30}})
★难度:难
参见章节:第6章
考核知识点:Python与数据库
试题解析:
20、PyMongo针对age字段操作将将第一个年龄为20岁的人删除的语句为collection.______
答案: delete_one({‘age’:20})
★难度:难
参见章节:第6章
考核知识点:Python与数据库
试题解析:
21、PyMongo针对age字段去重的语句为collection.______
答案: distinct('age')
★难度:难
参见章节:第6章
考核知识点:Python与数据库
试题解析:
22、在MacOS下运行Redis命令为______ /user/local/etc/redis.conf
答案: redis-server
★难度:中
参见章节:第6章
考核知识点:Python与数据库
试题解析:
23、在Windows下运行Redis命令为______ redis.windows.conf
答案: redis-server.exe
★难度:中
参见章节:第6章
考核知识点:Python与数据库
试题解析:
24、一般通过______表达式来解析网页数据
答案: 正则
★难度:易
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
25、实现异步加载需要利用______技术
答案: Ajax
★难度:易
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
26、普通的异步加载,可以使用______库直发送AJAX请求来获取被加载的内容
答案: requests
★难度:易
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
27、使用UI Automatorr操作实体键的命令中电源键的按键名称为______
答案: power
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
28、使用UI Automatorr操作实体键的命令中返回键的按键名称为______
答案: back
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
29、使用UI Automatorr操作实体键的命令中菜单键的按键名称为______
答案: menu
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
30、使用UI Automatorr操作实体键的命令中音量增大键的按键名称为______
答案: volume_up
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
31、使用UI Automatorr操作实体键的命令中音量减小键的按键名称为______
答案: volume_down
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
32、使用UI Automatorr操作实体键的命令中返回键的按键名称为______
答案: home
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
33、在Scrapy的依赖库文件中,pywin32和Twisted的底层是基于______开发的。
答案: C语言
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
34、在Windows系统中搭建Scrapy环境时,______和______这两个第三方库不能使用常规的方法安装。
答案: lxml , pywin32
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
35、settings.py中pipeline后面数字代表优先级,当数字越大,则优先级越______
答案: 低
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
36、获取extract()方法返回值的第一个,可以使用______来进行
答案: extract()[0]
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
37、______是负责处理详情页并获取信息的一个方法。它负责从整个正文页中提取发布时间、文章分类和正文HTML。
答案: self.parse_detail
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
38、使用了RedisSpider作为爬虫的父类以后,爬虫会直接监控______中的数据,并不读取start_urls中的数据。
答案: Redis
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
39、爬虫中间件scrapy.spidermiddlewares.httperror.HttpErrorMiddleware的顺序号是______
答案: 50
★难度:难
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
40、爬虫中间件scrapy.spidermiddlewares.offsite.OffsiteMiddleware的顺序号是______
答案: 500
★难度:难
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
41、爬虫中间件scrapy.spidermiddlewares.referer.RefererMiddleware的顺序号是______
答案: 700
★难度:难
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
42、爬虫中间件scrapy.spidermiddlewares.urllength.UrlLengthMiddleware的顺序号是______
答案: 800
★难度:难
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
43、爬虫中间件scrapy.spidermiddlewares.depth.DepthMiddleware的顺序号是______
答案: 900
★难度:难
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
(二)、名词解释题
1、网络爬虫
答案: 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
★难度:易
参见章节:第1章
考核知识点:网络爬虫概念
试题解析:
2、通用网络爬虫
答案: 通用网络爬虫又称全网爬虫(Scalable Web Crawler),爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。
★难度:易
参见章节:第1章
考核知识点:网络爬虫概念
试题解析:
3、聚焦网络爬虫
答案: 聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。
★难度:易
参见章节:第1章
考核知识点:网络爬虫概念
试题解析:
4、HTTP
答案: Hypertext Transfer Protocol,超文本传输协议
★难度:易
参见章节:第4章
考核知识点:简单的网页爬虫方法
试题解析:
5、Python中的requests
答案: requests是Python的一个第三方HTTP(Hypertext Transfer
Protocol,超文本传输协议)库,它比Python自带的网络库urllib更加简单、方便和人性化。使用requests可以让Python实现访问网页并获取源代码的功能。
★难度:易
参见章节:第4章
考核知识点:简单的网页爬虫方法
试题解析:
6、Python的库
答案: 在Python开发的过程中,常常需要将一些功能比较通用的代码抽离出来作为一个单独的模块,从而被多个工程调用。这种公共的模块称为Python的库(Library,Lib)
★难度:易
参见章节:第4章
考核知识点:简单的网页爬虫方法
试题解析:
7、multiprocessing
答案: multiprocessing本身是Python的多进程库,用来处理与多进程相关的操作
★难度:易
参见章节:第4章
考核知识点:简单的网页爬虫方法
试题解析:
8、HTML
答案: HTML是一种结构化的标记语言,可以描述一个网页的结构信息
★难度:易
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
9、CSS
答案: Cascading Style Sheets,层叠样式表
★难度:易
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
10、Xpath
答案: XPath(XML Path)是一种查询语言,它能在XML和HTML的树状结构中寻找结点
★难度:易
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
11、XML
答案: Extensible Markup Language,可扩展标记语言
★难度:易
参见章节:第5章
考核知识点:信息提取高级方法
试题解析:
12、URI
答案: Uniform Resource Identifier,统一资源标志符
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
13、Redis
答案: Remote Dictionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
14、AJAX
答案: AJAX是Asynchronous JavaScript And XML的首字母缩写,意为异步JavaScript与XML
★难度:易
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
15、JSON
答案: JSON的全称是JavaScript Object Notation,是一种轻量级的数据交换格式。网络之间使用HTTP方式传递数据的时候,绝大多数情况下传递的都是字符串
★难度:易
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
16、请求头
答案: Headers称为请求头,浏览器可以将一些信息通过Headers传递给服务器,服务器也可以将一些信息通过Headers传递给浏览器
★难度:中
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
17、Selenium
答案: Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
★难度:中
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
18、cookies
答案
: Cookie是用户使用浏览器访问网站的时候网站存放在浏览器中的一小段数据。
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
19、HTTP状态码
答案: HTTP状态码是当客户端向服务器发送请求时,服务端描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求还是出现了错误。
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
20、404 Not Found
答案: 404 Not Found是HTTP状态码,表示服务器上没有请求的资源。
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
21、pytesseract
答案: pytesseract是python中的开源类库,它的作用是将图像中文字转换为文本。
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
22、数据抓包
答案: 抓包就是在网络数据的传输过程中对数据包进行截获、查看、修改或转发的过程。
★难度:易
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
23、中间人爬虫
答案: 中间人爬虫就是利用了中间人攻击的原理来实现数据抓取的一种爬虫技术
★难度:易
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
24、中间人攻击
答案: 中间人(Man-in-the-Middle,MITM)攻击是指攻击者与通信的两端分别创建独立的联系,并交换其所收到的数据,使通信的两端认为其正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制
★难度:易
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
25、UiAutomator
答案: UiAutomator是Google官方提供的Android自动化图形接口测试框架
★难度:易
参见章节:第10章
考核知识点:Android原生App爬虫
试题解析:
26、Scrapy
答案: Scrapy是基于Python的分布式爬虫框架,可以非常方便地实现分布式爬虫。
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
27、Twisted
答案: Twisted是Python中的一个非常重要的基于事件驱动的异步输入/输出(Input/Output,I/O)引擎
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
28、DDOS
答案: Distributed Denial-of-Service,分布式拒绝服务
★难度:易
参见章节:第13章
考核知识点:爬虫开发中的法律和道德问题
试题解析:
(三)、问答题
1、通用性搜索引擎局限性是什么?
答案: (1)不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。
(2)通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。
(3)万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。
(4)通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。
★难度:中
参见章节:第1章
考核知识点:网络爬虫概念
试题解析:
2、聚焦网络爬虫与通用网络爬虫区别?
答案: 和通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求 。
聚焦网络爬虫和通用网络爬虫相比,增加了链接评价模块以及内容评价模块。聚焦爬虫爬行策略实现的关键是评价页面内容和链接的重要性,不同的方法计算出的重要性不同,由此导致链接的访问顺序也不同。
★难度:中
参见章节:第1章
考核知识点:网络爬虫概念
试题解析:
3、元组和列表的区别
答案: 列表生成以后还可以往里面继续添加数据,也可以从里面删除数据;
元组一旦生成就不能修改。
如果元组里面只有整数、浮点数、字符串、另一个元组,就既不能添加数据,也不能删除数据,还不能修改里面数据的值。但是如果元组里面包含了一个列表,那么这个元组里面的列表依旧可以变化。
★难度:中
参见章节:第2章
考核知识点:Python基础
试题解析:
4、Python中条件语句的短路效应是什么
答案: (1)在使用and连接的多个表达式中,只要有一个表达式不为真,那么后面的表达式就不会执行。
(2)在使用or连接的多个表达式中,只要有一个表达式为真,那么后面的表达式就不会执行。
★难度:中
参见章节:第2章
考核知识点:Python基础
试题解析:
5、Python正则表达式模块的findall方法原型及参数含义
答案: findall的函数原型为:
re.findall(pattern, string, flags=0)
pattern表示正则表达式,string表示原来的字符串,flags表示一些特殊功能的标志。
★难度:中
参见章节:第3章
考核知识点:正则表达式与文件操作
试题解析:
6、Python正则表达式模块的search方法原型及参数含义
答案: search()的函数原型为:
re.search(pattern, string, flags=0)
pattern表示正则表达式,string表示原来的字符串,flags表示一些特殊功能的标志。
★难度:中
参见章节:第3章
考核知识点:正则表达式与文件操作
试题解析:
7、Python正则表达式中search和findall方法比较
答案: search()的用法和findall()的用法一样,但是search()只会返回第1个满足要求的字符串。一旦找到符合要求的内容,它就会停止查找。
★难度:中
参见章节:第3章
考核知识点:正则表达式与文件操作
试题解析:
8、Python中正则表达式下“.*”和“.*?”的区别
答案: ①“.*”:贪婪模式,获取最长的满足条件的字符串。
②“.*?”:非贪婪模式,获取最短的能满足条件的字符串。
★难度:难
参见章节:第3章
考核知识点:正则表达式与文件操作
试题解析:
9、为什么使用多线程爬取信息比多进程有优势?
答案: 由于进程与进程之间不能直接共享内存和堆栈资源,而且启动新的进程开销也比线程大得多
★难度:中
参见章节:第4章
考核知识点:简单的网页爬虫方法
试题解析:
10、请描述爬虫中的深度优先搜索过程
答案
: 在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。
★难度:中
参见章节:第4章
考核知识点:简单的网页爬虫方法
试题解析:
11、请描述爬虫中的广度优先搜索过程
答案: 整个的广度优先爬虫过程就是从一系列的种子节点开始,把这些网页中的"子节点"(也就是超链接)提取出来,放入队列中依次进行抓取。被处理过的链接需要放 入一张表(通常称为Visited表)中。每次新处理一个链接之前,需要查看这个链接是否已经存在于Visited表中。如果存在,证明链接已经处理过, 跳过,不做处理,否则进行下一步处理。
★难度:中
参见章节:第4章
考核知识点:简单的网页爬虫方法
试题解析:
12、MongoDB的特点
答案: MongoDB是一款基于C++开发的开源文档数据库,数据在MongoDB中以Key-Value的形式存储,就像是Python中的字典一样。
MongoDB 是一个基于分布式文件存储的数据库。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
★难度:易
参见章节:第6章
考核知识点:Python与数据库
试题解析:
13、对于MongoDB中更新操作,如何采用“批量更新方式”
答案: 不要执行“更新”这个动作。把更新这个动作改为插入。这样就可以实现批量更新的效果了。具体来说,就是把数据批量插入到一个新的MongoDB集合中,再把原来的集合删除,最后将新的集合改为原来集合的名字。
★难度:中
参见章节:第6章
考核知识点:Python与数据库
试题解析:
14、如何在多步请求的异步加载下爬取信息?
答案: 对于多次请求才能得到数据的情况,解决办法就是逐一请求,得到返回结果以后再发起下一个请求。
★难度:中
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
15、网站是如何知道用户是通过计算机浏览器还是手机浏览器在访问页面呢
答案: 请求头Headers中一般会包含请求者所使用的浏览器信息,服务器通过此判断是手机还是计算机浏览器
★难度:中
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
16、使用异步加载技术的网站,被加载的内容是不能在源代码中找到的。对于这种情况,应该如何抓取被加载的内容呢?
答案: 使用Google Chrome浏览器的开发者模式。在网页上单击右键,选择“检查”命令,然后定位到“Network”选项卡,刷新网页就看到“Network”选项卡下出现的加载内容了。
★难度:易
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
17、Selenium的主要功能
答案: 测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。
★难度:难
参见章节:第7章
考核知识点:异步加载与请求头
试题解析:
18、为什么web应用需要使用cookies?
答案: 由于HTTP的无状态性,服务器需要借助Cookies来维护用户跟服务器会话中的状态;实现自动登录。
★难度:难
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
19、简述session和cookies的区别。
答案: Cookie通过在客户端记录信息确定用户身份,
Session通过在服务器端记录信息确定用户身份。
★难度:中
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
20、HTTP状态码301和30?2有什么区别
答案: 301表示资源永久重定向;302代表的资源不是永久性移动,只是临时性性质的。
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
21、使用打码平台有哪些安全注意事项?
答案: 拒绝实名制;注册邮箱使用小号;注意交费地址及金额;尽量不使用百度
★难度:易
参见章节:第8章
考核知识点:模拟登陆与验证码
试题解析:
22、微信小程序爬虫相比网页有哪些优势?
答案: 小程序的请求极其简单,基本上没有验证信息,即便有验证信息也非常脆弱。
用Python来请求小程序的后台接口从而获取数据,比请求异步加载网页的后台接口要容易很多。在爬虫开发过程中,如果目标网站有微信小程序,那么一定要优先调查能否通过小程序的接口来抓取数据。
小程序的反爬虫能力比网页版的低很多。使用小程序的接口来爬数据,能极大提高爬虫的开发效率
★难度:易
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
23、爬虫爬取的对象都有哪些?
答案: 计算机网页。本章将会讲到手机App爬虫、微信小程序爬虫和中间人爬虫
★难度:易
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
24、Charles的局限有哪些?
答案: Charles只能截获HTTP和HTTPS的数据包,如果网站使用的是websocket或者是flashsocket,那么Charles就无能为力。
有一些App会自带证书,使用其他证书都无法正常访问后台接口。在这种情况下,Charles自带的证书就不能正常使用,也就没有办法抓取这种App的数据。
有一些App的数据经过加密,App接收到数据以后在其内部进行解密。
对于这种情况,Charles只能抓取到经过加密的数据。如果无法知道数据的具体加密方法,
★难度:中
参见章节:第9章
考核知识点:抓包与中间人爬虫
试题解析:
25、为什么Scrapy在Windows下不支持Python3
答案: 由于Scrapy所依赖的一个第三方库Twisted不支持Windows下面的Python 3,所以Scrapy在Windows下不支持Python 3。
★难度:中
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
26、在安装Microsoft Visual C++ Build Tools时如何解决系统提示“.Net Framework没有安装或安装版本太低”的的问题
答案: 下载并安装一个要求版本或以上版本的.Net Framework
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
27、在CMD中使用哪种命令可以创建虚拟环境,从而让Virtualenv使用系统python环境的第三方库
答案: virtualenv --always-copy --system-site-packages venv
★难度:中
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
28、在Windows下,通过CMD创建虚拟环境后,可以使用哪种命令来激活虚拟环境?
答案: venvscriptsactivate
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
29、在MacOS下安装Scrapy,当pip的网络受到干扰导致安装的速度很慢时,应该如何应对?
答案: 可以使用一些代理工具来让网络变得稳定,例如ProxyChains。
★难度:中
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
30、在执行scrapy genspider example baidu.com命令来创建爬虫时,example和baidu.com这两个参数分别代表什么含义?
答案: 第1个参数“example”是爬虫的名字;
第2个参数“baidu.com”是需要爬取的网址
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
31、Scrapy和lxml使用XPath的不同之处都有什么?
答案: Scrapy与lxml使用XPath的唯一不同之处在于,Scrapy的XPath语句后面需要用.extract()这个方法。
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
32、如何通过命令行启动Redis
答案: 对于Mac OS/Linux系统,直接在终端下面输入以下命令并按Enter键:
redis-server
在Windows系统中,通过CMD的cd命令进入存放Redis的文件夹,并运行:
redis-server.exe
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
33、extract_first()方法和extract()方法返回的值有怎样的区别?
答案: “extract_first()”方法。“extract_first()”方法的作用是获取XPath提取出来的值中的第一个。“extract()”方法返回的是一个列表,而“extract_first()”返回的就是一个具体的值。
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
34、lxml库中etree模块的etree.tostring()方法是做什么用的
答案: 把Selector对象转换为bytes型的源代码数据
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
35、爬虫在运行时,在PyCharm的控制台中打印出以下内容:
Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) ,这代表了什么?
答案: 意思是说爬虫什么内容都没有爬取到。
★难度:易
参见章节:第11章
考核知识点:Scrapy框架
试题解析:
36、中间件和中间人的异同?
答案
: “中间件”这个中文名字和前面章节讲到的“中间人”只有一字之差。它们做的事情确实也非常相似。中间件和中间人都能在中途劫持数据,做一些修改再把数据传递出去。不同点在于,中间件是开发者主动加进去的组件,而中间人是被动的,一般是恶意地加进去的环节。中间件主要用来辅助开发,而中间人却多被用来进行数据的窃取、伪造甚至攻击。
★难度:中
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
37、什么是中间件?
答案: 中间件是Scrapy里面的一个核心概念。使用中间件可以在爬虫的请求发起之前或者请求返回之后对数据进行定制化修改,从而开发出适应不同情况的爬虫。
★难度:易
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
38、如何禁止中间件?
答案: 在settings.py里面将这个中间件的顺序设为None
★难度:中
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
39、简述如何在重试中间件里面判断返回的网址
答案: 在一次请求的返回结果中判断是否被自动跳转到了异常页面,或者是否被返回了“参数错误”。如果都不是,说明这一次请求目前看起来正常,直接把response返回,交给后面的中间件来处理。 如果被重定向到了异常页面,或者被返回“参数错误”,那么进入重试的逻辑。如果返回了“参数错误”,那么直接替换原来请求的body即可重新发起请求
★难度:难
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
40、简述使用中间件的好处
答案: 可以把数据爬取和其他操作分开。在爬虫的代码里面专心写数据爬取的代码;在中间件里面专心写突破反爬虫、登录、重试和渲染AJAX等操作
★难度:易
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
41、使用Git来管理运行爬虫的优缺点分别是什么
答案: 好处是可以进行版本管理,不会出现代码丢失的问题。但操作步骤多,需要先在本地提交,然后登录服务器,再从服务器上面把代码下载下来。如果有很多服务器的话,每个服务器都登录并下载一遍代码是非常浪费时间的事情
★难度:中
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
42、简述反向代理和正向代理的含义
答案: 所谓“反向代理”,是相对于“正向代理”而言的。前面章节所用到的代理是正向代理。正向代理帮助请求者(爬虫)隐藏身份,爬虫通过代理访问服务器,服务器只能看到代理IP,看不到爬虫;反向代理帮助服务器隐藏身份。用户只知道服务器返回的内容,但不知道也不需要知道这个内容是在哪里生成的
★难度:中
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
43、简述使用scrapyd来部署爬虫的好处
答案: 使用Scrapyd来部署爬虫,可以实现远程开关爬虫和批量部署爬虫,从而实现分布式爬虫
★难度:中
参见章节:第12章
考核知识点:Scrapy高级应用
试题解析:
44、请问如果通过爬虫抓取某公司网站的公开数据,分析以后发现这个公司业绩非常好,于是首先把数据或者分析结果出售给某基金公司,然后自己再买被爬公司的股票。这样的行为是否违法,为什么?
答案
: 该行为涉嫌内幕交易,属于严重违法行为。之所以出售数据给基金公司以后,读者就不能在基金公司购买股票之前再购买被爬公司股票,这是由于“基金公司将要购买哪一只股票”属于内幕消息,使用内幕消息购买股票将严重损坏市场公平,因此已被定义为非法行为。而读者自身是没有办法证明自己买被爬公司的股票是基于对自己数据的信心,而不是基于知道了某基金公司将要购买该公司股票这一内幕消息的。
★难度:难
参见章节:第13章
考核知识点:爬虫开发中的法律和道德问题
试题解析:
(四)、解答题
1.题干:请描述下面结构采用深度优先遍历搜索的顺序
难易程度:中
所属章节:4
考核知识点:简单的网页爬虫方法
参考答案:1-2-5-12-13-14-6-7-3-8-9-4-10-11
2.题干:请描述下面结构采用广度优先遍历搜索的顺序
难易程度:中
所属章节:4
考核知识点:简单的网页爬虫方法
参考答案:1-2-9-12-3-7-8-10-11-13-14-4-5-6
(五) 、编程题
1、题干:
if state == 'start':
code = 1
elif state == 'running':
code = 2
elif state == 'offline':
code = 3
elif state == 'unknown':
code = 4
else:
code = 5
要求:上述Python代码很繁琐,请使用字典来实现多重条件控制。
难易程度:中
所属章节:2
考核知识点:使用字典实现多重条件控制
参考答案:
state_dict = {'start': 1, 'running': 2, 'offline': 3, 'unknown': 4}
code = state_dict.get(state, 5)
2、 题干:
使用Python开发一个猜数小游戏。在游戏中,程序每一轮会随机生成一个0~1024之间的数字,用户输入猜测的数字,程序告诉用户猜大了还是猜小了。在一定次数内猜对,则本轮用户获胜,否则本轮用户失败。
要求:定义一个函数try_to_guess,输入name,answer,并用全局变量history记录历史。
难易程度:中
所属章节:2
考核知识点:Python基础知识
参考答案:
def try_to_guess(name, answer):
try_num = 0
while try_num < 10:
guess_answer = int(input('请输入一个数字: '))
if guess_answer < answer:
print('你输入的数字比正确答案小。')
elif guess_answer == answer:
print('回答正确!')
history[name].append('成功')
break
else:
print('你输入的数字比正确答案大。')
try_num += 1
else:
print('猜错次数太多,失败。')
history[name].append('失败')
3、题干:下面代码目的为在百度贴吧中任意寻找一个贴吧并打开一个热门帖子,将帖子的源代码复制下来,并保存为source.txt。Python 读入这个source.txt文件,通过正则表达式获取用户名、发帖内容和发帖时间,并保存为result.csv。
import re
import csv
with open('source.txt', 'r', encoding='UTF-8') as f:
source = f.read()
result_list = []
every_reply = re.findall('l_post l_post_bright j_l_post clearfix "(.*?)p_props_tail props_appraise_wrap', source, re.S)
# 从每一个大文本块里面提取出各个楼层的发帖人姓名,发帖内容和发帖时间
for each in every_reply:
result = {}
result['username'] = re.findall('username="(.*?)"', each, re.S)[0]
result['content'] = re.findall('j_d_post_content ">(.*?)<', each, re.S)[0].replace(' ', '')
result['reply_time'] = re.findall('class="tail-info">(2017.*?)<', each, re.S)[0]
result_list.1. (result)
2. open('tieba.csv', 'w', encoding='UTF-8') as f:
writer = csv.DictWriter(f, fieldnames=['username', 'content', 'reply_time'])
writer.writeheader()
writer.3. (result_list)
要求:请将上述代码补充完整。
难易程度:中
所属章节:2
考核知识点:Python基础知识
参考答案:
1. append
2. with
3. writerows
4、 题干:下面代码目的是使用3个线程计算0-9的平方。
from multiprocessing.dummy import 1.
def calc_power2(num):
return num * num
pool = Pool(3)
origin_num = [x for x in range(2. )]
result = pool.3. (calc_power2, origin_num)
print(f'计算0-9的平方分别为:{result}')
要求:请将上述代码补充完整。
难易程度:中
所属章节:4
考核知识点:简单的网页爬虫方法
参考答案:
1. Pool
2. 10
3. Map
5、 题干:下面代码目的是使用单线程循环访问百度首页100次。
def query(url):
requests.get(url)
start = time.time()
for i in range(100):
query('https://baidu.com')
end = time.time()
print(f'单线程循环访问100次百度首页,耗时:{end - start}')
要求:请将上述代码改写为使用5个线程进行上述操作。
难易程度:中
所属章节:4
考核知识点:简单的网页爬虫方法
参考答案:
start = time.time()
url_list = []
for i in range(100):
url_list.append('https://baidu.com')
pool = Pool(5)
pool.map(query, url_list)
end = time.time()
print(f'5线程访问100次百度首页,耗时:{end - start}')
6、 题干:下面代码目的小说网站爬虫开发部分代码
def save(chapter, article):
"""
将每一章保存到本地。
:param chapter: 章节名, 第X章
:param article: 正文内容
:return: None
"""
os.1. ('动物农场', exist_ok=True) #如果没有"动物农场文件夹,就创建一个,如果有,则什么都不做"
with open(os.path.2. ('动物农场', chapter + '.txt'), 'w', encoding='utf-8') as f:
f.write(article)
def query_article(url):
"""
根据正文网址获取正文源代码,并调用get_article函数获得正文内容最后保存到本地。
:param url: 正文网址
:return: None
"""
article_html = get_source(url)
chapter_name, article_text = get_article(article_html)
save(chapter_name, article_text)
要求:请将上述代码补充完整。
难易程度:中
所属章节:4
考核知识点:简单的网页爬虫方法
参考答案:
1. makedirs
2. join
7、 题干:下面代码目的小说网站爬虫开发部分代码
start_url = 'http://www.kanunu8.com/book3/6879/‘
def get_source(url):
""" 获取网页源代码。
:param url: 网址
:return: 网页源代码
"""
html = requests.get(url)
return html.content.1. ('gbk') #这个网页需要使用gbk方式解码才能让中文正常显示
from multiprocessing.2. import Pool
if __name__ == '__main__':
toc_html = get_source(start_url)
toc_list = get_toc(toc_html)
pool = Pool(4)
pool.3. (query_article, toc_list)
要求:请将上述代码补充完整。
难易程度:中
所属章节:4
考核知识点:简单的网页爬虫方法
参考答案:
1. decode
2. dummy
3. map
8、 题干:下面代码目的小说网站爬虫开发部分代码
import requests
import lxml.html
import csv
url = 'https://www.damai.cn/projectlist.do'
source = requests.get(url).content
selector = lxml.html.1. (source)
item_list = selector.xpath('//ul[@id="performList"]/li')
item_dict_list = []
for item in item_list:
show_name = item.xpath('div[@class="ri-infos"]/h2/a/text()')
show_url = item.xpath('div[@class="ri-infos"]/h2/a/@href')
show_description = item.xpath('div[@class="ri-infos"]/p[1]/text()')
show_time = item.xpath('div[@class="ri-infos"]/p[@class="mt5"]/text()')
show_place = item.xpath('div[@class="ri-infos"]/p[@class="mt5"]/span[@class="ml20"]/a/text()')
show_price = item.xpath('div[@class="ri-infos"]/p/span[@class="price-sort"]/text()')
item_dict = {'show_name': show_name[0] if show_name else '',
'show_url': 'https:' + show_url[0] if show_url else '',
'show_description': show_description[0] if show_description else '',
'show_time': show_time[0].strip() if show_time else '',
'show_place': show_place[0] if show_place else '',
'show_price': show_price[0] if show_price else ''}
item_dict_list.2. (item_dict)
with open('result.csv', 'w', encoding='utf-8') as f:
writer = csv.DictWriter(f, 3. =['show_name',
'show_url',
'show_description',
'show_time',
'show_place',
'show_price'])
writer.writeheader()
writer.writerows(item_dict_list)
要求:请将上述代码补充完整。
难易程度:中
所属章节:5
考核知识点:信息提取高级方法
参考答案:
1. fromstring
2. append
3. fieldnames
9、题干:下面代码爬虫开发部分代码,目的是使用XPath获取每一章的网址,再将它们添加到Redis中。
import requests
from lxml import html
import redis
client = redis.StrictRedis()
source = requests.get('http://dongyeguiwu.zuopinj.com/5525').1.
selector = html.2. (source)
url_list = selector.xpath('//div[@class="book_list"]/ul/li/a/@href')
for url in url_list:
client.3. ('url_queue', url)
要求:请将上述代码补充完整。
难易程度:中
所属章节:6
考核知识点:Python与数据库
参考答案:
1. content
2. fromstring
3. lpush
10、题干:下面代码爬虫开发部分代码,目的是使对于爬取正文的爬虫,只要发现Redis里的url_queue这个列表不为空,就要从里面读出网址,并爬取数据。
import requests
import pymongo
import redis
from lxml import html
connection = pymongo.MongoClient()
db = connection.Chapter6
handler = db.white
client = redis.1. ()
content_list = []
while client.llen('url_queue') > 0:
url = client.lpop('url_queue').decode()
source = requests.get(url).content
selector = html.2. (source)
chapter_name = selector.xpath('//div[@class="h1title"]/h1/text()')[0]
content = selector.xpath('//div[@id="htmlContent"]/p/text()')
content_list.append({'title': chapter_name, 'content': 'n'.join(content)})
handler.3. (content_list)
要求:请将上述代码补充完整。
难易程度:中
所属章节:6
考核知识点:Python与数据库
参考答案:
1. StrictRedis
2. fromstring
3. insert
11、题干:下面代码爬虫开发部分代码,目的是使用正则表达式从页面中把数据提取出来,然后直接解析。
import json
import requests
import re
url = 'http://exercise.kingname.info/exercise_ajax_2.html'
html = requests.get(url).content.1. ()
code_json = re.2. ("secret = '(.*?)'", html, re.S).group(1)
code_dict = json.3. (code_json)
print(code_dict['code'])
要求:请将上述代码补充完整。
难易程度:中
所属章节:7
考核知识点:异步加载与请求头
参考答案:
1. decode
2. search
3. loads
12、题干:下面代码为乐视网爬取视频评论部分代码,目的是使用正则表达式从页面中把数据提取出来,然后直接解析。
def __init__(self, url):
self.necessary_info = {}
self.url = url
self.get_necessary_id()
self.get_comment()
def get_source(self, url, headers):
return requests.get(url, headers).content.decode()
def get_necessary_id(self):
source = self.get_source(self.url, self.HEADERS)
vid = re.search('vid: (d+)', source).1. (1)
2. = vid
def get_comment(self):
url = self.COMMENT_URL.format(xid=self.necessary_info['xid'])
source = self.get_source(url, self.HEADERS)
source_json = source[source.find('{"'): -1]
comment_dict = json.loads(3. )
comments = comment_dict['data']
for comment in comments:
print(f'发帖人: {comment["user"]["username"]}, 评论内容:{comment["content"]}')
要求:请将上述代码补充完整。
难易程度:中
所属章节:7
考核知识点:异步加载与请求头
参考答案:
1. group
2. self.necessary_info['xid']
3. source_json
13、题干:下面代码为自动登录果壳网部分代码,目的是使用正则表达式从页面中把数据提取出来,然后直接解析。
def get_captcha_by_cid(cid, timeout=15):
while timeout > 0:
response = requests.get(captcha_result_url.format(cid)).text
response_dict = json.loads(response)
print(response_dict, '——还剩:{}秒...'.format(timeout))
captcha = response_dict['text']
if response_dict['text']:
return captcha
time.1. (1)
timeout -= 1
return ''
def query_captcha(filename):
data = {'method': 'upload', 'username': captcha_username, 'password': captcha_password, 'appid': captcha_appid,
'appkey': captcha_appkey, 'codetype': captcha_codetype, 'timeout': '60'}
f = open(filename, 'rb')
file = {'file': f}
response = requests.2. (captcha_url, data, files=file).text
f.close()
response_dict = json.loads(response)
if 'cid' not in response_dict:
print('请在官网上查询此错误码: {}'.format(response_dict['ret']))
exit()
captcha = response_dict['text']
if not 3. :
cid = response_dict['cid']
captcha = get_captcha_by_cid(cid)
return captcha
要求:请将上述代码补充完整。
难易程度:中
所属章节:8
考核知识点:模拟登陆与验证码
参考答案:
1. sleep
2. post
3. captcha
14、题干:下面代码为自动登录果壳网部分代码,目的是使用正则表达式从页面中把数据提取出来,然后直接解析。
session = requests.Session()
#直接访问登录页面,先获取必要信息:csrf_token, captcha_rand 和captcha地址
html = session.get(login_url, headers=header).content.decode()
csrf_token = re.findall('name="csrf_token" type="hidden" value="(.*?)">',
html, re.S)
if not csrf_token:
print('不能获取csrf_token, 无法登录。')
exit()
csrf_token = 1. [0]
captcha_rand = re.findall('id="captchaRand" value="(.*?)">', html, re.S)
if not captcha_rand:
print('不能获取captcha_rand, 无法登录。')
exit()
captcha_rand = captcha_rand[0]
with open('guokr.png', 'wb') as f:
f.write(requests.get(guokr_captcha_url.format(captcha_rand)).content)
captcha_solution = query_captcha('guokr.png')
data_guokr['captcha'] = captcha_solution
data_guokr['captcha_rand'] = captcha_rand
data_guokr['csrf_token'] = csrf_token
result = session.post(login_url, data=data_guokr, 2. =header).content
#在登录成功以后,访问其他页面只需要使用session.get即可。
profile = session.get('http://www.guokr.com/settings/profile/', headers=header).3.
print(profile.decode())
要求:请将上述代码补充完整。
难易程度:中
所属章节:8
考核知识点:模拟登陆与验证码
参考答案:
1. csrf_token
2. headers
3. content
15、题干:下面代码是多设备群控应用,目的为主线程中调用子线程。
for serial in serial_list:
phone_thread = PhoneThread(serial)
phone_thread.1. ()
phone_list.2. (phone_thread)
while phone_list:
phone_list = [x for x in phone_list if x.3. ()]
time.sleep(5)
要求:请将上述代码补充完整。
难易程度:难
所属章节:10
考核知识点:Android原生App爬虫
参考答案:
1. Start
1. append
2. is_alive
16、题干:下面代码是BOSS直聘爬虫代码。
from uiautomator import Device
device = Device()
resource_id_dict = {
'salary': 'com.hpbr.bosszhipin:id/tv_position_salary',
'company': 'com.hpbr.bosszhipin:id/tv_company_name',
'address': 'com.hpbr.bosszhipin:id/tv_location',
'experence': 'com.hpbr.bosszhipin:id/tv_work_exp',
'degree': 'com.hpbr.bosszhipin:id/tv_degree'}
def crawl():
for job in device(resourceId='com.hpbr.bosszhipin:id/rl_section_1'):
result_dict = {}
job_info_box = job.child(resourceId='com.hpbr.bosszhipin:id/ll_position')
job_name = job_info_box.child(resourceId='com.hpbr.bosszhipin:id/tv_position_name')
if not job_name.1. :
return
result_dict['job_name'] = job_name.text
for key, resource_id in resource_id_dict.2. ():
value = job.child(resourceId=resource_id)
if not value.exists:
return
result_dict[key] = value.text
print(result_dict)
def scroll():
device(scrollable=3. ).scroll.vert.forward()
if __name__ == '__main__':
while True:
crawl()
scroll()
要求:请将上述代码补充完整。
难易程度:难
所属章节:10
考核知识点:Android原生App爬虫
参考答案:
1. exists
2. items
3. True
17、 题干:下面代码是博客爬虫。
import scrapy
from scrapy_redis.spiders import RedisSpider
from baidu.items import BlogItem
from lxml import etree
from html import unescape
class BlogSpider(RedisSpider):
name = "BlogSpider"
allowed_domains = ["www.kingname.info"]
redis_key = 'blogspider'
start_urls = ['https://www.kingname.info/archives/']
host = 'https://www.kingname.info'
def parse(self, response):
title_tag_list = response.xpath('//a[@class="post-title-link"]')
for title_tag in title_tag_list:
article_title = title_tag.xpath('span/text()').1. ()
article_url = self.host + title_tag.xpath('@href').extract_first()
item = BlogItem()
item['title'] = article_title
item['url'] = article_url
yield scrapy.Request(article_url,
headers=self.2. ['HEADERS'],
callback=self.parse_detail,
meta={'item': item})
def parse_detail(self, response):
item = response.3. ['item']
post_time = response.xpath('//time[@title="Post created"]/@datetime').extract_first()
category = response.xpath('//span[@itemprop="about"]/a/span/text()').extract_first()
post_body = response.xpath('//div[@class="post-body"]')
body_html = unescape(etree.tostring(post_body[0]._root).decode())
item['post_time'] = post_time
item['category'] = category
item['detail'] = body_html
yield item
要求:请将上述代码补充完整。
难易程度:难
所属章节:11
考核知识点:Scrapy框架
参考答案:
1. extract_first
2. settings
3. meta
18、题干:下面代码是重试中间件。
class RetryOfDateMiddleware(RetryMiddleware):
def __init__(self, settings):
1. .__init__(self, settings)
def process_exception(self, request, exception, spider):
if spider.name == 'exceptionSpider' and isinstance(exception, TCPTimedOutError):
self.remove_borken_proxy(request.meta['proxy'])
return request.copy()
def remove_borken_proxy(self, proxy):
"""
在这里写代码,从数据库或者是Redis中,把无效的代理剔除掉
:param proxy:
:return:
"""
pass
def process_response(self, request, response, spider):
if 2. .name == 'middlewareSpider':
return_str = response.body.decode()
if '404.html' not in str(response.url) and '参数错误' not in return_str:
return response
yesterday = str(datetime.date.today() - datetime.timedelta(days=1))
if '404.html' in str(response.url):
origin_url = request.meta['redirect_urls'][0]
next_request = request.replace(url=origin_url,
method='POST',
body=json.dumps({'date': yesterday}),
headers={'Content-Type': 'application/json'})
else:
next_request = request.replace(body=json.3. ({'date': yesterday}))
return next_request
return response
要求:请将上述代码补充完整。
难易程度:难
所属章节:12
考核知识点:Scrapy高级应用
参考答案:
1. RetryMiddleware
2. spider
3. dumps
查看更多
| | | |