提高爬虫性能,都有什么奇技淫巧呢( python 方面)
楼主现在想做一个大规模的爬虫爬取,寒假看了很多关于爬虫进阶的文章,文档,
归纳下来,寒假接触的爬虫爬取性能提升的模块和库:
- twisted
- multiprocessing
- threading (但好像是不是不推荐)
- gevent
- tornado
那么除了这上面的还有别的么= =,另外这上面的哪些比较好使,哪些又一些坑呢?
关于任务队列,是不是都推荐使用 redis ? redis 构建分布式的爬取麻烦么?(正在看 redis 的书籍)
除了 redis 还有什么别的好使的办法么?
答:任务队列方面可以看看 celery
答:网络请求正常异步了就基本没什么性能需求,除非你网速太快。框架 /库用 scrapy 或者 asyncio ,前者久经考验而且对口,后者官方推荐。
方便讲讲爬什么东西需要分布式吗。。
答:任务队列不需要也分布式, redis 也不支持分布式,爬虫的分布式是指很多分布式爬虫 worker 从一个集中的任务队列(单机或分布式存储)里拿任务,然后分布式的去爬。
答:可以用异步,可以看下 aiohttp 我觉得对 asyncio 封装挺好的
答:scrapy 不要重复造轮子
答:缓存 dns ,不用每次解析域名貌似会快一点
(外行听别人这么说的
答:楼主带带我不?
答:ip 够多
答:1. 用 http/1.1
2. 自建 dns cache
3. 用 gzip (效果立竿见影)
答:收藏比回复还多得多``````宝宝心里苦啊
答:去学 scrapy 源码吧。。。
答:借楼,问一下现在 scrapy 对 python3 的支持如何了,今天刚把 scrapy 装上(几个月前装过总报错),准备明天开始看文档
答:哪方面的性能,如果量特别大耗时的操作一般都是在解析上面,用 bs4 速度不能忍。
答:scrapy 的作者们创建了 http://scrapinghub.com/ 先去尝试他们提供的服务说不定会更好一点
答:pyzmq,txzmq
答:搞不定..ip...这个优化也是白搞...
答:如果仅仅是爬爬一般的站,把 ip 搞定就行了,但是如果尝试去爬阿里、企鹅的邮箱登陆或者淘宝登陆,光有 Ip 是不够的,一个淘宝登陆的加密算法就能让人吐血
答:grequests
答:cache 啊 根据 http 的 cache head 决定是否要继续获取
pipeline 获取, 不要重建链接
本地 tcp 栈优化,加快端口释放
代理服务器
dns 本地服务器,预热你要用的 dns 地址
利用 17ce 这样的网站查询 服务器的所有 ip,提高使用效率
分析和下载处理分开处理,不要让字符解析占有太多 cpu.
加强 recv timeout 的智能判断,在服务器响应不佳的情况下,减少链接数目,让服务器退回服务质量。
用 c++
提高算法,链接命中算法
.... 至于 内存控制这种,估计你也不会去做。
答:下载 分析 主控 要分开。
答:补充点反扒这块的
能用的代理肯定不多,跟着别人对刚反扒规则也麻烦
所以倒不如隔段时间就去爬取一些免费的代理 并验证下 然后就从中随机抽取调用
答:也不能修改,
以上经验适用于 2010 年 15 分钟抓取京东全商品数据。
linode 512M vps 4cpu 满核, c++ ,200-500 connection.
6 年前的经验了,也不知道行不行了。看着用吧
答:如果单纯是性能的话,应该考虑几个方面
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.这种呢,能透露的就是尽可能不要异地登录,其它一些歪门邪道的方法不好说
答:还补充一条:就是链接和页面加密问题,这种只能靠分析,没有什么好的办法
答:这里有个现有的例子,你可以参考一下:
如何爬取大众点评网上的商家信息(有栗子、附代码)
https://www.douban.com/group/topic/86269731/
0条评论