python编写知乎爬虫实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. 程柳锋
2017.7.12
PYTHON编写知乎爬⾍实践
2. 个⼈介绍
▸ 2014.12~2017.2 淘宝,闲⻥鱼拍卖
▸ 2017.2 ~ ⾄至今 腾讯,Now直播
▸ 博客:http://www.cnblogs.com/cpselvis
▸ Github: https://github.com/cpselvis
3. 开篇
分享⼤纲
▸ 爬⾍虫⼯工作原理理
▸ ⽹网⻚页抓取、去重、解析和存储相关技术栈
▸ Bloom Filter算法介绍
▸ 使⽤用redis queue实现⼤大规模⽹网⻚页抓取
▸ 反爬⾍虫策略略及应对措施
▸ QA
4. 第⼀部分:爬⾍⼯作原理
从种⼦URL获取HTML源代码说起
5. 第⼀部分:爬⾍⼯作原理
DEMO解释
news.qq.com
析
qq.com
下载
qq.com
源代码
解
解析
解析
解析
pp.qq.com
v.qq.com
解析
ent.qq.com
下载
下载
news.qq.com
源代码
pp.qq.com
源代码
下载
下载
……
fashion.qq.com
下载
……
fashion.qq.com
源代码
……
6. 第⼀部分:爬⾍⼯作原理
引⼊URL队列模型
qq.com
加⼊入
待抓取URL 读取任务队列列
当前任务url
任务队列列
下载
加⼊入
当前任务url
对应源码
解析
多个
新任务url
7. 第⼀部分:爬⾍⼯作原理
通俗易懂的伪代码
8. 第⼀部分:爬⾍⼯作原理
爬⾍的基本流程总结
读取url
DNS解析
加⼊入
种⼦URL
待抓取的URL
任务队列
新解析的url
⽹网⻚页下载
已执⾏行行的url
已抓取的URL
任务队列
⽹页内容
⽹网⻚页解析
有⽤信息
存储
9. 第⼀部分:爬⾍⼯作原理
爬⾍的抓取策略
▸ 深度优先策略略
▸ ⼴广度优先策略略
10. 第⼀部分:爬⾍⼯作原理
复杂点的例⼦:图⽚抓取程序
11. 第⼆部分:⽹页抓取、去重、解析和存储相关技术栈
技术栈
▸ ⽹网⻚页抓取:urllib2、urllib3、requests
▸ 去重:set、Bloom Filter
▸ 解析:re、XPath、BeautifulSoup
▸ 存储:MySQL、Mongodb、Redis
▸ 并发抓取:rq、scrapy、celery、thread、multiprocess
12. 第三部分:布隆过滤器
⼏个⽐较常见的例⼦
▸ 字处理理软件中,需要检查⼀一个英语单词是否拼写正确
▸ 在 FBI,⼀一个嫌疑⼈人的名字是否已经在嫌疑名单上
▸ 在⽹网络爬⾍虫⾥里里,⼀一个⽹网址是否被访问过
▸ yahoo, gmail等邮箱垃圾邮件过滤功能
13. 第三部分:布隆过滤器
如何判断⼀个元素是否存在⼀个集合中?
▸ 数组
▸ 链表
▸ 树、平衡⼆二叉树
▸ Trie
▸ 哈希表
14. 第三部分:布隆过滤器
哈希函数
▸ 将任意⼤大⼩小的数据转换成特定⼤大⼩小的数据的函数
▸ 转换后的数据称为哈希值或哈希编码
▸ 特点:
▸ 如果两个散列列值是不不相同的(根据同⼀一函数),
那么这两个散列列值的原始输⼊入也是不不相同的
▸ 不不同的输⼊入可能对应相同的输出(哈希碰撞)
15. 第三部分:布隆过滤器
哈希表
▸ 根据关键码值(Key value)⽽而直接进⾏行行访问的数据结构
▸ 拉链法解决哈希冲突
16. 第三部分:布隆过滤器
使⽤哈希表存储⼀亿 个垃圾 EMAIL 地址的消耗?
▸ 哈希函数将⼀一个email地址映射成8字节信息指纹
▸ 哈希表存储效率通常⼩小于50%(哈希冲突)
▸ 消耗的内存:8 * 2 * 1亿 字节 = 1.6G 内存
17. 第三部分:布隆过滤器
布隆过滤器(BLOOM FILTER)
▸ 巴顿.布隆隆于⼀一九七零年年提出
▸ ⼀一个很⻓长的⼆二进制向量量 (位数组)
▸ ⼀一系列列随机函数 (哈希)
▸ 空间效率和查询效率⾼高
▸ 有⼀一定的误判率(哈希表是精确匹配)
18. 第三部分:布隆过滤器
布隆过滤器的实现要求
▸ ⻓长度为m的位数组
▸ k个独⽴立的良好的哈希函数
▸ 均匀的随机分布
▸ 哈希冲突低
▸ k远⼩小于m
▸ m和容纳的元素之间存在⽐比例例
▸ m 和 k的值取决于误判率
19. 第三部分:布隆过滤器
直观的描述
20. 第三部分:布隆过滤器
布隆过滤器添加元素
▸ 将要添加的元素给k个哈希函数
▸ 得到对应于位数组上的k个位置
▸ 将这k个位置设为1
21. 第三部分:布隆过滤器
布隆过滤器查询元素
▸ 将要查询的元素给k个哈希函数
▸ 得到对应于位数组上的k个位置
▸ 如果k个位置有⼀一个为0,则肯定不不在集合中
▸ 如果k个位置全部为1,则可能在集合中 误判率存在的原因
22. 第三部分:布隆过滤器
布隆过滤器⾼效的原因
▸ 普通数据结构都存取元素
▸ Bloom filter只需存取要⼀一个位数组
▸ 查询效率O(k)
23. 第三部分:布隆过滤器
布隆过滤器的简单实现
24. 第四部分:使⽤REDIS QUEUE实现⼤规模⽹页抓取
消息队列-⽣产者消费者模式介绍
▸ 元素:⽣生产者、消费者、任务队列列
▸ 调度:round-robin、权重调度
▸ 消息ack确认
C
P
C
C
25. 第四部分:使⽤REDIS QUEUE实现⼤规模⽹页抓取
rq⽰例
my_module.py ⼯工具函数
worker.py 后台执⾏行行进程
main.py 主⼊入⼝口
26. 第四部分:使⽤REDIS QUEUE实现⼤规模⽹页抓取
截图
27. 第五部分:反爬⾍策略及应对措施
常见站点爬⾍攻防
▸ ⽤用户代理理检测: 通过设置User-Agent header
▸ Referer检测: 通过设置Referer header
▸ 登陆限制:通过模拟登陆解决
▸ 访问频率限制:
▸ 同⼀一账号的频率限制,则可以使⽤用多个账号轮流发请求
▸ 如果针对IP,可通过IP代理理池
28. 第五部分:反爬⾍策略及应对措施
各种浏览器的user-agent
▸ IE 8: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)
▸ IE 7: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)
▸ IE 6: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
▸ chrome: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/
59.0.3071.115 Safari/537.36
▸ safari: ”Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1)
AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/
602.2.14"
29. 第五部分:反爬⾍策略及应对措施
⽹站反“反盗链”
▸ referer:⽤用于告知服务器器⽤用户的来源⻚页⾯面
▸ 某些站点会检测是否存在referer
▸ 资源站点反盗链
30. 反爬⾍策略及应对措施
代理IP池
31. Thanks for attending.