爬虫相关
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
优点:代码简单,不再重复创建连接
缺点:兼容性没有长轮询好