提高爬虫性能,都有什么奇技淫巧呢( python 方面)

2016-02-25 17:28:39 +08:00
 aljun

楼主现在想做一个大规模的爬虫爬取,寒假看了很多关于爬虫进阶的文章,文档,

归纳下来,寒假接触的爬虫爬取性能提升的模块和库:

那么除了这上面的还有别的么= =,另外这上面的哪些比较好使,哪些又一些坑呢?

关于任务队列,是不是都推荐使用 redis ? redis 构建分布式的爬取麻烦么?(正在看 redis 的书籍)
除了 redis 还有什么别的好使的办法么?

17924 次点击
所在节点    Python
37 条回复
chenwen
2016-02-26 10:09:35 +08:00
如果仅仅是爬爬一般的站,把 ip 搞定就行了,但是如果尝试去爬阿里、企鹅的邮箱登陆或者淘宝登陆,光有 Ip 是不够的,一个淘宝登陆的加密算法就能让人吐血
happywowwow
2016-02-26 11:10:41 +08:00
grequests
firefox12
2016-02-26 13:34:58 +08:00
cache 啊 根据 http 的 cache head 决定是否要继续获取
pipeline 获取, 不要重建链接
本地 tcp 栈优化,加快端口释放
代理服务器
dns 本地服务器,预热你要用的 dns 地址
利用 17ce 这样的网站查询 服务器的所有 ip,提高使用效率
分析和下载处理分开处理,不要让字符解析占有太多 cpu.
加强 recv timeout 的智能判断,在服务器响应不佳的情况下,减少链接数目,让服务器退回服务质量。
用 c++
提高算法,链接命中算法

.... 至于 内存控制这种,估计你也不会去做。
firefox12
2016-02-26 13:35:52 +08:00
下载 分析 主控 要分开。
zhouquanbest
2016-02-26 13:38:08 +08:00
补充点反扒这块的
能用的代理肯定不多,跟着别人对刚反扒规则也麻烦
所以倒不如隔段时间就去爬取一些免费的代理 并验证下 然后就从中随机抽取调用
firefox12
2016-02-26 13:39:58 +08:00
也不能修改,
以上经验适用于 2010 年 15 分钟抓取京东全商品数据。

linode 512M vps 4cpu 满核, c++ ,200-500 connection.

6 年前的经验了,也不知道行不行了。看着用吧
SlipStupig
2016-02-26 15:01:10 +08:00
如果单纯是性能的话,应该考虑几个方面
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.这种呢,能透露的就是尽可能不要异地登录,其它一些歪门邪道的方法不好说
ahxxm
2016-02-26 20:09:21 +08:00
@firefox12 求代码观摩
SlipStupig
2016-02-26 20:45:52 +08:00
还补充一条:就是链接和页面加密问题,这种只能靠分析,没有什么好的办法
bdbai
2016-02-28 12:59:21 +08:00
@SlipStupig Ajax 和 Flash 都是可以逆向的,直接分析效率会高很多。
SlipStupig
2016-02-28 23:39:17 +08:00
@bdbai ajax 和 flash 这类都需要第三方支持,如果能自己实现太费劲了,但是抓取的话真心很慢
bdbai
2016-02-29 00:30:16 +08:00
@SlipStupig 很多时候只要抓包分析一下就能摸到规律了,再不行就逆向。秒秒钟算出来的东西丢给"渲染引擎",那个速度不能忍啊。
SlipStupig
2016-02-29 00:34:13 +08:00
@bdbai 很多情况还是需要渲染,比如: jd 的价格都是 js 里面计算出来的,你直接看不到的,国外奢侈品网页都是全站 flash ,为了抓取,我硬生生把那个 phantomjs 那个 webkit 给改成了 v8 ,速度还行就是太吃内存了,开 20 个实例就已经占用了 4g 内存,后来换了 jemalloc 代替,但是也占用了很多,至于 flash 就不说了,完全是跑不动......这块在想一些通用点的办法
bdbai
2016-02-29 18:10:53 +08:00
@SlipStupig jd 的价格我没有抓过,不过 Flash 是可以完全逆向的,抓包也能看出点端倪。不如发一下地址?
SlipStupig
2016-03-01 13:29:53 +08:00
现在都改版了没了。 @bdbai 可以逆向你能自动化逆向么?主要需要自动去分析
bdbai
2016-03-01 18:11:19 +08:00
@SlipStupig 就是这样,自己分析出来逻辑让爬虫跑,这比"模拟"运行时的效率高多了。
sosozzzx
2016-08-29 16:28:55 +08:00
这里有个现有的例子,你可以参考一下:
如何爬取大众点评网上的商家信息(有栗子、附代码)
https://www.douban.com/group/topic/86269731/

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

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

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

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

© 2021 V2EX