从京东"窃取"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

10013 次点击
所在节点    Python
87 条回复
tcpdump
2017-06-22 12:41:45 +08:00
mark
HGladIator
2017-06-22 12:54:55 +08:00
我就卡在 IP 这块儿
lanpong
2017-06-22 13:10:23 +08:00
github 上 README 的博客地址指向不对。。。
samray
2017-06-22 13:32:08 +08:00
@lanpong 已经修改.谢谢你的建议.
samray
2017-06-22 13:34:57 +08:00
@xiaomeimei 相信你指的应该是  PhantomJS  和  selenium  配合使用来模拟浏览器,但是这样对于爬虫来说实在太耗费资源了,相当于打开一个没有 GUI 的浏览器,然后解析需要爬取的页面.这个只能作为不是办法的办法了.
samray
2017-06-22 13:41:08 +08:00
@suliuyes 其实,并不是那么绝对的,例如爬淘宝,即使你经常换代理 IP,也没办法突破它的反爬策略,因为爬虫无论怎么慢,对比人来说,操作都太快了.再比如爬取 QQ 空间,并不是简单的模拟请求登陆就可以了,再你登陆之后,服务器会在 cookie 中返回三个值 p_skey,skey,rv2,然后作移位和与或操作得到一个 gtk 值,然后每次请求都要附上这个 gtk 值,不然都是 403. 更不要说 Google 的人机检验机制,不是人类根本用不了.代理 IP 是一个关键点,但是并不是全部.如果你爬取的网页超过 1000 + w,光是去重就是一个值得深究的问题了.个人小小愚见 :)
samray
2017-06-22 13:47:48 +08:00
附加一个个人推测,但未证实.在双11或者是 618 搞活动的时候,电商网站的反爬虫策略一般都会关闭,或者不会那么严格,因为面对洪峰一样的流量,需要把尽量多的资源用于处理客户端请求,而越复杂的反爬机制,需要的验证就越多,耗费的资源也会相应增加.不过这个只是个人主观感觉+合理推测,未证实.
fate0
2017-06-22 14:16:05 +08:00
@samray 1000+w 的数据去重也可以用 bloom filter 啊,就用 Redis 的 bitmap 存 bit 数组就可以了。
shew2356
2017-06-22 14:29:59 +08:00
@ajan 第六十四条 网络运营者、网络产品或者服务的提供者违反本法第二十二条第三款、第四十一条至第四十三条规定,侵害个人信息依法得到保护的权利的,由有关主管部门责令改正,可以根据情节单处或者并处警告、没收违法所得、处违法所得一倍以上十倍以下罚款,没有违法所得的,处一百万元以下罚款,对直接负责的主管人员和其他直接责任人员处一万元以上十万元以下罚款;情节严重的,并可以责令暂停相关业务、停业整顿、关闭网站、吊销相关业务许可证或者吊销营业执照。
违反本法第四十四条规定,窃取或者以其他非法方式获取、非法出售或者非法向他人提供个人信息,尚不构成犯罪的,由公安机关没收违法所得,并处违法所得一倍以上十倍以下罚款,没有违法所得的,处一百万元以下罚款。

中华人民共和国网络安全法
http://www.npc.gov.cn/npc/xinwen/2016-11/07/content_2001605.htm
dallaslu
2017-06-22 14:33:46 +08:00
我怎么记得京东基本不限制爬虫呢?
samray
2017-06-22 14:45:19 +08:00
@fate0 在这个项目中,我是直接用 scrapy-redis 来,而 scrapy-redis 是把 request 的指纹保存起来进去去重的.只是感觉这样的做法不是很符合我自己的做法,因为就我看来,去重应该是直接对 url 去重.感觉这是不同的取舍,所以感慨一下.
samray
2017-06-22 14:50:09 +08:00
@fate0 我倾向于使用的就是 bloomfilter,只是当变成分布式爬虫的时候,可能会因为分布式的设计不一样而导致不一样的问题出现.单机使用 bloomfilter 和分布式不一样,可以新建一个 master 节点,然后所有的需要爬取和已爬取的 url 都保存在 master,然后 slave 节点只需请求待爬 url 就好.但是这种方式不同于  scrapy-redis,就需要自己使用 bloomfilter 以及编写调度器
fate0
2017-06-22 15:02:36 +08:00
@samray 可能我说的不清楚,我现在说的就是分布式爬虫的情况,可以稍微修改一下 scrapy-redis 里的 dupefilter 文件,不使用之前 redis set 去重的方式,在这里改成使用 bloom filter,将 bloom filter 所使用的 bit 数组用 Redis 的 bitmap 进行存取。其他地方不需要修改。
fate0
2017-06-22 15:04:06 +08:00
@samray 另外使用整个 request 进行 hash 还是 只使用 url 进行 hash,也可以在 dupefilter 里修改,都不是特别难。
samray
2017-06-22 15:37:24 +08:00
@fate0 抱歉,一直理解错了你的观点 :(
doggg
2017-06-22 18:39:24 +08:00
非常酷。这几天用 java 写 php 期末商城作业。只会一点 node 和 Jsoup 的我望而却步,最后还是死皮赖脸的跟图书馆老师要了全学校的图书馆数据。
samray
2017-06-22 19:23:31 +08:00
@doggg 对于学校图书馆的网站,真的只会把网站爬崩,不会有反爬策略这种东西存在的.
doggg
2017-06-22 20:15:27 +08:00
@samray 平日泡图书馆比较多,跟老师比较熟。其实那个商城的数据本来想爬京东图书数据的,无奈不会 py,只会一点 node,而且图书分类获取非常麻烦,京东图书的分类太过于详细。所以跟老师要了图书馆所以的图书数据。总共 30W+
dd0754
2017-06-22 20:33:45 +08:00
屌爆了
MIROKY
2017-06-22 20:36:11 +08:00
感谢分享 马上回去试试=w=

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

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

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

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

© 2021 V2EX