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-02-25 17:28:39 +08:00 · 17867 次点击
    这是一个创建于 3192 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

    6 年前的经验了,也不知道行不行了。看着用吧
    SlipStupig
        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.这种呢,能透露的就是尽可能不要异地登录,其它一些歪门邪道的方法不好说
    ahxxm
        28
    ahxxm  
       2016-02-26 20:09:21 +08:00
    @firefox12 求代码观摩
    SlipStupig
        29
    SlipStupig  
       2016-02-26 20:45:52 +08:00
    还补充一条:就是链接和页面加密问题,这种只能靠分析,没有什么好的办法
    bdbai
        30
    bdbai  
       2016-02-28 12:59:21 +08:00 via iPhone
    @SlipStupig Ajax 和 Flash 都是可以逆向的,直接分析效率会高很多。
    SlipStupig
        31
    SlipStupig  
       2016-02-28 23:39:17 +08:00
    @bdbai ajax 和 flash 这类都需要第三方支持,如果能自己实现太费劲了,但是抓取的话真心很慢
    bdbai
        32
    bdbai  
       2016-02-29 00:30:16 +08:00 via iPhone
    @SlipStupig 很多时候只要抓包分析一下就能摸到规律了,再不行就逆向。秒秒钟算出来的东西丢给"渲染引擎",那个速度不能忍啊。
    SlipStupig
        33
    SlipStupig  
       2016-02-29 00:34:13 +08:00
    @bdbai 很多情况还是需要渲染,比如: jd 的价格都是 js 里面计算出来的,你直接看不到的,国外奢侈品网页都是全站 flash ,为了抓取,我硬生生把那个 phantomjs 那个 webkit 给改成了 v8 ,速度还行就是太吃内存了,开 20 个实例就已经占用了 4g 内存,后来换了 jemalloc 代替,但是也占用了很多,至于 flash 就不说了,完全是跑不动......这块在想一些通用点的办法
    bdbai
        34
    bdbai  
       2016-02-29 18:10:53 +08:00 via iPhone
    @SlipStupig jd 的价格我没有抓过,不过 Flash 是可以完全逆向的,抓包也能看出点端倪。不如发一下地址?
    SlipStupig
        35
    SlipStupig  
       2016-03-01 13:29:53 +08:00
    现在都改版了没了。 @bdbai 可以逆向你能自动化逆向么?主要需要自动去分析
    bdbai
        36
    bdbai  
       2016-03-01 18:11:19 +08:00 via iPhone
    @SlipStupig 就是这样,自己分析出来逻辑让爬虫跑,这比"模拟"运行时的效率高多了。
    sosozzzx
        37
    sosozzzx  
       2016-08-29 16:28:55 +08:00
    这里有个现有的例子,你可以参考一下:
    如何爬取大众点评网上的商家信息(有栗子、附代码)
    https://www.douban.com/group/topic/86269731/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   986 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:03 · PVG 05:03 · LAX 13:03 · JFK 16:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.