从京东"窃取"150+万条数据 (爬虫)

2017-06-21 21:57:56 +08:00
 samray

博客地址:从京东"窃取"150+万条数据

github 地址: jd_spider

使用 scrapy, scrapy-redis, graphite 实现的京东分布式爬虫,以 mongodb 实现底层存储。分布式 实现,解决带宽和性能的瓶颈,提高爬取的效率。实现 scrapy-redis 对进行 url 的去重 以及调度,利用 redis 的高效和易于扩展能够轻松实现高效率下载:当 redis 存储或者访问速 度遇到瓶颈时,可以通过增大 redis 集群数和爬虫集群数量改善

爬取策略

获取 <a href> 标签里面的 url 值,然后迭代爬取,并且把 url 限定在 xxx.jd.com 范围内,防止无限广度的问题。

反爬虫策略

禁用 cookie

通过禁用 cookie, 服务器就无法根据 cookie 判断出爬虫是否访问过网站

伪装成搜索引擎

要说最著名的爬虫是谁?肯定是搜索引擎,它本质上也是爬虫,而且是非常强大的爬虫。 而且这些爬虫可以光明正大地去爬取各式网站,相信各式网站也很乐意被它爬。 现在可以通过修改 user-agent 伪装成搜索引擎

 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
 'Mozilla/5.0 (compatible; Bingbot/2.0; +http://www.bing.com/bingbot.htm)',
 'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)',
 'DuckDuckBot/1.0; (+http://duckduckgo.com/duckduckbot.html)',
 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)',
 'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)',
 'ia_archiver (+http://www.alexa.com/site/help/webmasters; crawler@alexa.com)',

轮转 user-agent

为了提高突破反爬虫策略的成功率,定义多个 user-agent, 然后每次请求都随机选择 user-agent。本爬虫实现了一个 RotateUserAgentMiddleware 类来实现 user-agent 的轮转

代理 IP

使用代理 IP, 防止 IP 被封

爬虫状态监控

将分布式爬虫 stats 信息(请求个数,item 下载个数,dropItem 个数,日志)保存到 redis 中 实现了一个针对分布式的 stats collector,并将其结果用 graphite 以图表形式动态实时显示

并发请求和深度控制

通过 setting.py 中的 CONCURRENT_REQUESTS = 32 配置来控制并发请求数量,通过 DepthMiddle 类的 DEPTH_LIMIT=max 参数来控制爬虫的的递归深度

运行截图

http://imgur.com/a/Q9Usi

http://imgur.com/a/FBvay

http://imgur.com/a/zgFWa

10213 次点击
所在节点    Python
87 条回复
bozong
2017-06-21 22:13:30 +08:00
屌屌屌。
zhp521163
2017-06-21 22:16:31 +08:00
很猛!
shiny
2017-06-21 22:17:34 +08:00
代理 ip 用的是哪一家?
samray
2017-06-21 22:18:35 +08:00
欢迎大家不吝指教.
bozong
2017-06-21 22:21:31 +08:00
同问。代理 IP 来源
samray
2017-06-21 22:21:41 +08:00
代理 IP 用的不是一家,是用这两位的项目  https://github.com/qiyeboy/IPProxyPool   https://github.com/qiyeboy/IPProxyPool .只是个人感觉还是不够方便,还需要自己安装和配置环境,所以我就把这两个项目做成 docker image. 然后映射  IP 出来,通过  api 获取代理 IP. 只是 image 还有点问题,所以还没有分享出来.
xiaoyu9527
2017-06-21 22:22:23 +08:00
爬虫监控状态这个是怎么做的。

感觉很屌。
bozong
2017-06-21 22:23:42 +08:00
NB
samray
2017-06-21 22:25:53 +08:00
主要是将 scrapy.spider 的 stats 保存到 Redis (单机或者是集群),然后通过将这些数据发送给 graphite 来生成监控动态图.主要参考  https://github.com/gnemoug/distribute_crawler  的做法.只是这个项目已经没有维护了,并且是 python2,所以要自己看源码做一些适配.
Thoxvi
2017-06-21 22:27:37 +08:00
反反爬虫策略…?
samray
2017-06-21 22:29:13 +08:00
此外,graphite 的配置安装是很麻烦的事情,并且是不支持 windows  (虽说我是 Linuxer), 所以用 docker 就非常方便.我自己就在别人做好的  graphite 基础上做了些许配置的修改然后生成新的 image 适配 scrapy+graphite
samray
2017-06-21 22:30:13 +08:00
突破反爬虫策略嘛,所以就叫反反爬虫策略.见笑了.
bozong
2017-06-21 22:32:26 +08:00
@samray #9 用了多少台机器在爬
fate0
2017-06-21 22:47:35 +08:00
代理部分,下次可以试试我写的代理程序 [https://www.v2ex.com/t/369905]( https://www.v2ex.com/t/369905) (。・`ω´・)
samray
2017-06-21 22:56:00 +08:00
一台 32Gb 内存的工作站,跑了三个实例.
samray
2017-06-21 23:01:33 +08:00
@fate0 其实主要的问题是免费的代理大部分都不能用,而且即使现在能用,下一分钟也可能不能用.并且以文本形式来存储代理 IP,在运行的时候将代理 IP 全部加载进内存,但是如果你的爬虫是长时间运行,代理应该很快用完.所以比较理想的是"动态"加载代理 IP. 即可以在运行时继续加载 IP. 个人小小的看法.也很感谢你的项目啦 :)
fate0
2017-06-21 23:18:35 +08:00
@samray readme 里说可以全加载到内存,只不过想体现这个程序的方便而已,我个人喜欢把所有的代理都放在 redis 里,每间隔 15min 就把 proxylist 拉下来换一批,2000+个代理,15min 内一般项目一般都够用了,用 proxylist 的优点是自己不用再维护一个 proxy pool, 缺点是没法给每个 proxy 打分统计、proxylist 上的代理,可能在某个地区没法使用。
samray
2017-06-21 23:22:55 +08:00
其实最大的问题是,知道这一刻的代理可用,但是却完全没办法保证下一刻依旧可用.:(
misaka19000
2017-06-21 23:24:18 +08:00
不错,准备学习一个!
fate0
2017-06-21 23:27:03 +08:00
@samray 这不算什么问题吧,出现 exception 就换下一个代理,商业代理偶尔也有抽风的时候,也会出现下一刻不可用,就看换代理的频率是不是可以接收的范围内。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/370158

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX