楼主现在想做一个大规模的爬虫爬取,寒假看了很多关于爬虫进阶的文章,文档,
归纳下来,寒假接触的爬虫爬取性能提升的模块和库:
那么除了这上面的还有别的么= =,另外这上面的哪些比较好使,哪些又一些坑呢?
关于任务队列,是不是都推荐使用 redis ? redis 构建分布式的爬取麻烦么?(正在看 redis 的书籍)
除了 redis 还有什么别的好使的办法么?
1
aggron 2016-02-25 17:48:52 +08:00 via iPhone
任务队列方面可以看看 celery
|
2
ahxxm 2016-02-25 19:21:05 +08:00
网络请求正常异步了就基本没什么性能需求,除非你网速太快。框架 /库用 scrapy 或者 asyncio ,前者久经考验而且对口,后者官方推荐。
方便讲讲爬什么东西需要分布式吗。。 |
3
sunchen 2016-02-25 19:43:02 +08:00
任务队列不需要也分布式, redis 也不支持分布式,爬虫的分布式是指很多分布式爬虫 worker 从一个集中的任务队列(单机或分布式存储)里拿任务,然后分布式的去爬。
|
4
Tony042 2016-02-25 19:47:29 +08:00 via iPhone
可以用异步,可以看下 aiohttp 我觉得对 asyncio 封装挺好的
|
5
ooh 2016-02-25 19:56:02 +08:00
scrapy 不要重复造轮子
|
6
m8syYID5eaas8hF7 2016-02-25 20:03:53 +08:00
缓存 dns ,不用每次解析域名貌似会快一点
(外行听别人这么说的 |
7
huangfs 2016-02-25 20:11:13 +08:00
楼主带带我不?
|
8
some0ne 2016-02-25 20:14:21 +08:00 via iPad
ip 够多
|
9
est 2016-02-25 20:28:09 +08:00 2
1. 用 http/1.1
2. 自建 dns cache 3. 用 gzip (效果立竿见影) |
10
aljun OP 收藏比回复还多得多``````宝宝心里苦啊
|
11
knightdf 2016-02-25 22:39:02 +08:00
去学 scrapy 源码吧。。。
|
13
honmaple 2016-02-25 23:23:25 +08:00 via Android
借楼,问一下现在 scrapy 对 python3 的支持如何了,今天刚把 scrapy 装上(几个月前装过总报错),准备明天开始看文档
|
15
mengskysama 2016-02-26 02:23:48 +08:00
哪方面的性能,如果量特别大耗时的操作一般都是在解析上面,用 bs4 速度不能忍。
|
16
WildCat 2016-02-26 07:57:01 +08:00 via iPhone
@honmaple 1.1rc 貌似支持了。
官方在某个 issue 里提到,二月末发布支持 Python 3 的正式版。 |
17
zhaozhao 2016-02-26 08:19:09 +08:00
scrapy 的作者们创建了 http://scrapinghub.com/ 先去尝试他们提供的服务说不定会更好一点
|
18
jamiesun 2016-02-26 09:28:15 +08:00
pyzmq,txzmq
|
19
youxiachai 2016-02-26 09:29:49 +08:00
搞不定..ip...这个优化也是白搞...
|
21
chenwen 2016-02-26 10:09:35 +08:00
如果仅仅是爬爬一般的站,把 ip 搞定就行了,但是如果尝试去爬阿里、企鹅的邮箱登陆或者淘宝登陆,光有 Ip 是不够的,一个淘宝登陆的加密算法就能让人吐血
|
22
happywowwow 2016-02-26 11:10:41 +08:00
grequests
|
23
firefox12 2016-02-26 13:34:58 +08:00
cache 啊 根据 http 的 cache head 决定是否要继续获取
pipeline 获取, 不要重建链接 本地 tcp 栈优化,加快端口释放 代理服务器 dns 本地服务器,预热你要用的 dns 地址 利用 17ce 这样的网站查询 服务器的所有 ip,提高使用效率 分析和下载处理分开处理,不要让字符解析占有太多 cpu. 加强 recv timeout 的智能判断,在服务器响应不佳的情况下,减少链接数目,让服务器退回服务质量。 用 c++ 提高算法,链接命中算法 .... 至于 内存控制这种,估计你也不会去做。 |
24
firefox12 2016-02-26 13:35:52 +08:00
下载 分析 主控 要分开。
|
25
zhouquanbest 2016-02-26 13:38:08 +08:00
补充点反扒这块的
能用的代理肯定不多,跟着别人对刚反扒规则也麻烦 所以倒不如隔段时间就去爬取一些免费的代理 并验证下 然后就从中随机抽取调用 |
26
firefox12 2016-02-26 13:39:58 +08:00
也不能修改,
以上经验适用于 2010 年 15 分钟抓取京东全商品数据。 linode 512M vps 4cpu 满核, c++ ,200-500 connection. 6 年前的经验了,也不知道行不行了。看着用吧 |
27
SlipStupig 2016-02-26 15:01:10 +08:00 2
如果单纯是性能的话,应该考虑几个方面
1.http 请求尽量采用 pool 的方式保持会话 2.尽可能避免重复 url 和重复页面的抓取 3.不要使用单一磁盘存储,尽可能用一些 Nosql 数据库或内存高速缓存(例如: redis/memcache ) 4.降低存储部分冗余,提高存储效率,比如去除空格之类的,如果是二进制文件可以采用一些算法进行压缩存储 5.ajax 类型网站和 flash 网站, Parser 和 download 一定要分开, ajax 类网站的话可能需要考虑一下内存问题,如果使用 phantomjs 如果有可能最好能用 v8 去代替 jscore (过程十分的艰难,不要轻易尝试), 并且禁用安全检测,使用磁盘缓存(硬件方面能使用 ssd 最好了) 6.使用更快速的 dns 服务器,爬虫尽可能去缓存 dns 地址 7.多台机器性能一定高于单台机器 8.在条件允许的情况下用 pypy 代替 cpython 会更好 一些抓取遇到的反制问题 1.由于抓取频率过快,会被服务器认为是 ddos 攻击或爬虫抓取(有时候确实会让服务器宕机) 解决方案:使用代理进行绕过,并实现一些智能算法使爬虫更像人类(例如:一旦被 ban 掉自动切换代理,并减缓抓取速度,如果一定时间内没有被 ban 掉,则提高抓取速度,这样能自适应一个网站能承受的最大速度) 2.遇到验证码 解决方案:简单的验证码通过 hash 感知和一些简单的字模型匹配就能够解决,复杂验证码例如: recapture 这类可以靠人工去识别(有这种打码平台),如果是第二代验证码基于坐标位置的这类目前暂无解决办法 3.操作需要登录 解决方法:自己注册或购买账号,但是仍然可能可能会遇到问题 2 ,所以不继续说了,需要注意的是,某一些网站会通过一些特定元素的请求判断是是否是真实的登录,如果没有请求是无法成功的 4.异地登录需要验证 1.这种呢,能透露的就是尽可能不要异地登录,其它一些歪门邪道的方法不好说 |
29
SlipStupig 2016-02-26 20:45:52 +08:00
还补充一条:就是链接和页面加密问题,这种只能靠分析,没有什么好的办法
|
30
bdbai 2016-02-28 12:59:21 +08:00 via iPhone
@SlipStupig Ajax 和 Flash 都是可以逆向的,直接分析效率会高很多。
|
31
SlipStupig 2016-02-28 23:39:17 +08:00
@bdbai ajax 和 flash 这类都需要第三方支持,如果能自己实现太费劲了,但是抓取的话真心很慢
|
32
bdbai 2016-02-29 00:30:16 +08:00 via iPhone
@SlipStupig 很多时候只要抓包分析一下就能摸到规律了,再不行就逆向。秒秒钟算出来的东西丢给"渲染引擎",那个速度不能忍啊。
|
33
SlipStupig 2016-02-29 00:34:13 +08:00
@bdbai 很多情况还是需要渲染,比如: jd 的价格都是 js 里面计算出来的,你直接看不到的,国外奢侈品网页都是全站 flash ,为了抓取,我硬生生把那个 phantomjs 那个 webkit 给改成了 v8 ,速度还行就是太吃内存了,开 20 个实例就已经占用了 4g 内存,后来换了 jemalloc 代替,但是也占用了很多,至于 flash 就不说了,完全是跑不动......这块在想一些通用点的办法
|
34
bdbai 2016-02-29 18:10:53 +08:00 via iPhone
@SlipStupig jd 的价格我没有抓过,不过 Flash 是可以完全逆向的,抓包也能看出点端倪。不如发一下地址?
|
35
SlipStupig 2016-03-01 13:29:53 +08:00
现在都改版了没了。 @bdbai 可以逆向你能自动化逆向么?主要需要自动去分析
|
36
bdbai 2016-03-01 18:11:19 +08:00 via iPhone
@SlipStupig 就是这样,自己分析出来逻辑让爬虫跑,这比"模拟"运行时的效率高多了。
|
37
sosozzzx 2016-08-29 16:28:55 +08:00
|