提高爬虫性能,都有什么奇技淫巧呢( python 方面) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
aljun
V2EX    Python

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

  •  
  •   aljun 2016 年 2 月 25 日 18566 次点击
    这是一个创建于 3607 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    • twisted
    • multiprocessing
    • threading (但好像是不是不推荐)
    • gevent
    • tornado

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

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

    37 条回复    2016-08-29 16:28:55 +08:00
    aggron
        1
    aggron  
       2016 年 2 月 25 日 via iPhone
    任务队列方面可以看看 celery
    ahxxm
        2
    ahxxm  
       2016 年 2 月 25 日
    网络请求正常异步了就基本没什么性能需求,除非你网速太快。框架 /库用 scrapy 或者 asyncio ,前者久经考验而且对口,后者官方推荐。
    方便讲讲爬什么东西需要分布式吗。。
    sunchen
        3
    sunchen  
       2016 年 2 月 25 日
    任务队列不需要也分布式, redis 也不支持分布式,爬虫的分布式是指很多分布式爬虫 worker 从一个集中的任务队列(单机或分布式存储)里拿任务,然后分布式的去爬。
    div id="r_2931565" class="cell">
    Tony042
        4
    Tony042  
       2016 年 2 月 25 日 via iPhone
    可以用异步,可以看下 aiohttp 我觉得对 asyncio 封装挺好的
    ooh
        5
    ooh  
       2016 年 2 月 25 日
    scrapy 不要重复造轮子
    m8syYID5eaas8hF7
        6
    m8syYID5eaas8hF7  
       2016 年 2 月 25 日
    缓存 dns ,不用每次解析域名貌似会快一点
    (外行听别人这么说的
    huangfs
        7
    huangfs  
       2016 年 2 月 25 日
    楼主带带我不?
    some0ne
        8
    some0ne  
       2016 年 2 月 25 日 via iPad
    ip 够多
    est
        9
    est  
       2016 年 2 月 25 日   2
    1. 用 http/1.1
    2. 自建 dns cache
    3. 用 gzip (效果立竿见影)
    aljun
        10
    aljun  
    OP
       2016 年 2 月 25 日
    收藏比回复还多得多``````宝宝心里苦啊
    knightdf
        11
    knightdf  
       2016 年 2 月 25 日
    去学 scrapy 源码吧。。。
    onlyice
        12
    onlyice  
       2016 年 2 月 25 日 via Android
    @est HTTP/1.1 的好处是?
    honmaple
        13
    honmaple  
       2016 年 2 月 25 日 via Android
    借楼,问一下现在 scrapy 对 python3 的支持如何了,今天刚把 scrapy 装上(几个月前装过总报错),准备明天开始看文档
    herozzm
        14
    herozzm  
       2016 年 2 月 25 日 via Android
    @some0ne 正解
    mengskysama
        15
    mengskysama  
       2016 年 2 月 26 日
    哪方面的性能,如果量特别大耗时的操作一般都是在解析上面,用 bs4 速度不能忍。
    WildCat
        16
    WildCat  
       2016 年 2 月 26 日 via iPhone
    @honmaple 1.1rc 貌似支持了。
    官方在某个 issue 里提到,二月末发布支持 Python 3 的正式版。
    zhaozhao
        17
    zhaozhao  
       2016 年 2 月 26 日
    scrapy 的作者们创建了 http://scrapinghub.com/ 先去尝试他们提供的服务说不定会更好一点
    jamiesun
        18
    jamiesun  
       2016 年 2 月 26 日
    pyzmq,txzmq
    youxiachai
        19
    youxiachai  
       2016 年 2 月 26 日
    搞不定..ip...这个优化也是白搞...
    est
        20
    est  
       2016 年 2 月 26 日   1
    @onlyice keepalive 可以做连接池。
    chenwen
        21
    chenwen  
       2016 年 2 月 26 日
    如果仅仅是爬爬一般的站,把 ip 搞定就行了,但是如果尝试去爬阿里、企鹅的邮箱登陆或者淘宝登陆,光有 Ip 是不够的,一个淘宝登陆的加密算法就能让人吐血
    happywowwow
        22
    happywowwow  
       2016 年 2 月 26 日
    grequests
    firefox12
        23
    firefox12  
       2016 年 2 月 26 日
    cache 啊 根据 http 的 cache head 决定是否要继续获取
    pipeline 获取, 不要重建链接
    本地 tcp 栈优化,加快端口释放
    代理服务器
    dns 本地服务器,预热你要用的 dns 地址
    利用 17ce 这样的网站查询 服务器的所有 ip,提高使用效率
    分析和下载处理分开处理,不要让字符解析占有太多 cpu.
    加强 recv timeout 的智能判断,在服务器响应不佳的情况下,减少链接数目,让服务器退回服务质量。
    用 c++
    提高算法,链接命中算法

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

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

    6 年前的经验了,也不知道行不行了。看着用吧
    SlipStupig
        27
    SlipStupig  
       2016 年 2 月 26 日   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.这种呢,能透露的就是尽可能不要异地登录,其它一些歪门邪道的方法不好说
    ahxxm
        28
    ahxxm  
       2016 年 2 月 26 日
    @firefox12 求代码观摩
    SlipStupig
        29
    SlipStupig  
       2016 年 2 月 26 日
    还补充一条:就是链接和页面加密问题,这种只能靠分析,没有什么好的办法
    bdbai
        30
    bdbai  
       2016 年 2 月 28 日 via iPhone
    @SlipStupig Ajax 和 Flash 都是可以逆向的,直接分析效率会高很多。
    SlipStupig
        31
    SlipStupig  
       2016 年 2 月 28 日
    @bdbai ajax 和 flash 这类都需要第三方支持,如果能自己实现太费劲了,但是抓取的话真心很慢
    bdbai
        32
    bdbai  
       2016 年 2 月 29 日 via iPhone
    @SlipStupig 很多时候只要抓包分析一下就能摸到规律了,再不行就逆向。秒秒钟算出来的东西丢给"渲染引擎",那个速度不能忍啊。
    SlipStupig
        33
    SlipStupig  
       2016 年 2 月 29 日
    @bdbai 很多情况还是需要渲染,比如: jd 的价格都是 js 里面计算出来的,你直接看不到的,国外奢侈品网页都是全站 flash ,为了抓取,我硬生生把那个 phantomjs 那个 webkit 给改成了 v8 ,速度还行就是太吃内存了,开 20 个实例就已经占用了 4g 内存,后来换了 jemalloc 代替,但是也占用了很多,至于 flash 就不说了,完全是跑不动......这块在想一些通用点的办法
    bdbai
        34
    bdbai  
       2016 年 2 月 29 日 via iPhone
    @SlipStupig jd 的价格我没有抓过,不过 Flash 是可以完全逆向的,抓包也能看出点端倪。不如发一下地址?
    SlipStupig
        35
    SlipStupig  
       2016 年 3 月 1 日
    现在都改版了没了。 @bdbai 可以逆向你能自动化逆向么?主要需要自动去分析
    bdbai
        36
    bdbai  
       2016 年 3 月 1 日 via iPhone
    @SlipStupig 就是这样,自己分析出来逻辑让爬虫跑,这比"模拟"运行时的效率高多了。
    sosozzzx
        37
    sosozzzx  
       2016 年 8 月 29 日
    这里有个现有的例子,你可以参考一下:
    如何爬取大众点评网上的商家信息(有栗子、附代码)
    https://www.douban.com/group/topic/86269731/
    关于     帮助文档     自助推广系统     博客     API     FAQ     Soana     2338 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 01:42 PVG 09:42 LAX 17:42 JFK 20:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86