面试整理:爬虫
爬虫相关
requests和bs4模块
1、requests模块常用参数有哪些?
#常用参数: url headers cookies data json params proxy
2、requests模块常用返回值有哪些?
#常用返回值 content iter_content text encoding="utf-8" cookie.get_dict()
3、bs4常用方法有哪些?
#常用方法 解析:html.parser 或者 lxml(需要下载安装) find find_all text attrs get
4、常见的请求头有哪些?
# 常见请求头: user-agent host referer cookie content-type
5、爬取对象时注意
#套路: - 先给你cookie,然后再给你授权。 - 凭证 #轮询+长轮询(例如web微信)
Scrapy框架相关
- scrapy - 高性能相关,单线程并发发送Http请求 - twisted - gevent - asyncio 本质:基于IO多路复用+非阻塞的socket客户端实现 问题:异步非阻塞? 问题:什么是协程? - scrapy框架 - scrapy执行流程(包含所有组件) - 记录爬虫爬取数据深度(层级),request.meta['depth'] - 传递cookie - 手动 - 自动:meta={'cookiejar':True} - 起始URL - 持久化:pipelines/items - 去重 - 调度器 - 中间件 - 下载中间件 - agent - proxy - 爬虫中间件 - depth - 扩展+信号 - 自定义命令 - scrapy-redis组件,本质:去重、调度器任务、pipeline、起始URL放到redis中。 - 去重,使用的redis的集合。 - 调度器, - redis列表 - 先进先出队列 - 后进先出栈 - redis有序集合 - 优先级队列 PS:深度和广度优先 - pipelines - redis列表 - 起始URL - redis列表 - redis集合 补充: 自定义encoder实现序列化时间等特殊类型: json.dumps(xx,cls=MyEncoder)
轮询
6、什么是轮询?
可简单理解为: #通过定时器让程序每隔n秒执行一次操作。
7、什么是长轮询?
#浏览器向后端发起请求,后端会将请求 hang 住; #规定时间内如果不返回数据,则超时断开,紧接着用户立即再发送请求。 #如果有数据返回:则操作数据并立即再发送请求。 #PS:后台可以使用队列或redis的列表来hang主请求。
8、轮询和长轮询的目的?
#由于Http请求是短连接、无状态,所以服务端无法向客户端实时推送消息, #所以,我们可以使用:轮训和长轮训去服务端获取实时数据。
9、轮询之间的优缺点?
#轮询 优点:简单 缺点:请求次数多,服务器压力大,消息延迟 #长轮询 优点:实时接收数据,兼容性好 缺点:请求次数比原来少,但是相对原来也不少 #websocket 优点:代码简单,不再重复创建连接 缺点:兼容性没有长轮询好