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
CitizenR
V2EX  ›  Python

从前面一个爬虫帖想到的

  •  5
     
  •   CitizenR · 2018-03-18 08:04:33 +08:00 · 4956 次点击
    这是一个创建于 2446 天前的主题,其中的信息可能已经有所发展或是发生改变。

    那个爬虫贴在这里:默默的撸了套爬虫...

    很多人的关注点在那几个简单粗暴的循环上,虽然的确是略粗暴了点,但对于爬虫来说,这不是重点,重点是:

    每个请求之间没有合理的时间停顿

    这对于被爬取的服务器才真的是粗暴。

    也许有人会说,获取网页后的处理过程(此处甚至包含数据库操作)就是一个给服务器喘息的过程;也许还有人会说每秒几个几十个的请求对于服务器来说小 CASE 不然网站还是关停算了。

    暂且不论服务器是否能承受的问题,我想有些人学爬虫根本不知道robots.txt,也没想过这是在免费获取他人网站的信息不应该给他人服务器施加太大压力,他们只想快速获取自己想要的内容。一个热门网站(微博为例),如果爬取的人很多,并且都不停顿甚至加多线程,对于服务器的压力可想而知。

    当初学爬虫的时候,作者在书中第一个例子里就加了sleep,并且反复强调这很重要。我也想如此强调,这很重要。

    在写不加停顿 /多线程的爬虫时,我们是否应该思考如下问题:

    1. 我爬取的信息有必要这么快获取吗,慢一点是不是也可以?
    2. 我想爬取的信息如果有一定的即时性,官方是否有相应 API ?

    一点小小的想法,如果能给大家一点小小的启发,非常荣幸。也欢迎大家讨论自己的爬虫习惯。

    23 条回复    2018-03-19 08:50:07 +08:00
    qu3290052
        1
    qu3290052  
       2018-03-18 08:28:46 +08:00 via Android
    人是自私的,我只会想着最快时间爬完
    qu3290052
        2
    qu3290052  
       2018-03-18 08:30:12 +08:00 via Android
    例如你做一个网站最新内容抓取,肯定考虑及时性,所以我会把 get 间隔越小越好
    Hydjan
        3
    Hydjan  
       2018-03-18 08:37:50 +08:00
    学习了
    chuanqirenwu
        4
    chuanqirenwu  
       2018-03-18 08:46:42 +08:00
    研究表明,人类访问网站的时间间隔分布服从幂律分布且具有爆发( burst )的特性。
    mengzx
        5
    mengzx  
       2018-03-18 09:22:22 +08:00
    感觉一般都会停顿吧,否则大家都不好过
    whwq2012
        6
    whwq2012  
       2018-03-18 09:25:34 +08:00 via Android
    我会停顿,我的潜意识告诉我,爬得太频繁,把网站弄崩了,抛出异常对我也不方便。
    shapl
        7
    shapl  
       2018-03-18 09:37:30 +08:00
    最近我网站总是隔一段时间 CPU 和带宽就飙升,
    如果爬太快,看访问日志时很容易被发现的。
    xuxueli
        8
    xuxueli  
       2018-03-18 10:36:45 +08:00 via Android
    同意!
    主动停顿,成熟的爬虫肯定会从 api 层就预留主动停顿的接口的。
    停顿有很多好处,它可以缓解目标服务器压力,隐藏爬虫行为,同时也可以对抗服务器限流。

    比如这个爬虫库就支持随机主动停顿 :)

    http://www.xuxueli.com/xxl-crawler/
    iyaozhen
        9
    iyaozhen  
       2018-03-18 11:17:16 +08:00 via Android
    我觉得更近一步本质上应该是精准的控制并发,100 个线程即使随机暂停也会莫个时刻并发很大,不让加个队列 10 线程稳定输出的好。

    还可以加个思考:什么时候爬比较好。
    mornlight
        10
    mornlight  
       2018-03-18 11:19:12 +08:00 via iPhone
    令牌桶了解一下。
    gouchaoer
        11
    gouchaoer  
       2018-03-18 11:27:58 +08:00 via Android
    停顿是一点,另外你不可以翻页太厉害,翻页后面 sql 是 limit M,N,对 sql 服务器负担大,很多网站后端不知道翻页优化可以用自增 id 和总 id 数反推出一个区间从而使用索引会很快,删除的记录不显示即可
    Levox
        12
    Levox  
       2018-03-18 11:47:29 +08:00
    确实。另外自私的人会找很多理由来正当化自己的行为。
    hyi
        13
    hyi  
       2018-03-18 12:48:13 +08:00 via Android
    @gouchaoer 翻页太厉害的意识是翻太多页了吗,那进行翻 10 几页页的话,是不是也需要停顿下
    Coioidea
        14
    Coioidea  
       2018-03-18 13:44:10 +08:00
    不止是你一个人用爬虫。本来,爬虫就不被许多 eula 或者网站主认可的。通过工具化获取信息没有错。但不要太自私
    neoblackcap
        15
    neoblackcap  
       2018-03-18 14:01:47 +08:00
    @qu3290052 所以这就是他们的教程没有教如何爬 Facebook,淘宝的原因。因为这些网站反爬虫反得他们都没法做
    zachguo
        16
    zachguo  
       2018-03-18 14:06:07 +08:00 via Android
    所爬的内容不是 cc 授权的话,其实是违法的。
    国内目前不管,但估计迟早有天会有人被办的。
    safedogcc
        17
    safedogcc  
       2018-03-18 14:06:12 +08:00
    赞同贴主的想法!
    至于 robots.txt ,我猜部分较大的搜素引擎都不一定会遵循。。

    - - -
    我现在做的 APP,也是抛弃了服务端爬虫的做法,让用户主动的触发网站爬取的操作(比如用户想看网站,浏览器访问,可能会加载很多如 js css 等资源)而我只需要一次 get 请求主页 html 源码即可)
    另外还有缓存的功能,一个小时内用户再次查看此栈点,会有限加载缓存中的列表,没数据了之后再进行 HTTP 请求。

    好像自己这么设计,挺善良的。。 哈哈哈
    LINAICAI
        18
    LINAICAI  
       2018-03-18 14:10:03 +08:00
    使用 Scrapy,默认就遵守 robots.txt 的了吧
    自己写的时候都加 sleep 的,不加的话很快就被搬
    exiahan
        19
    exiahan  
       2018-03-18 14:18:43 +08:00 via Android
    赞,特别同意要注意 delay 请求这点。。。贪得无厌最终是全部死光。
    zdnyp
        20
    zdnyp  
       2018-03-18 14:39:39 +08:00
    @whwq2012 我也是,一般请求间隔都会间隔,就怕被 ban,还一个就是队列的问题,采的再快,你也得处理、存储啊
    Mavious
        21
    Mavious  
       2018-03-18 16:15:23 +08:00 via iPhone
    爬虫抢刷商品。
    我以前睡 0.1 秒。后来发现有问题,刷出来的老是已经被人买走了的空页面(大约 5 秒前已经被买走)。
    百思不得其解。只好猜测是太快导致数据没下载全。

    于是改成睡 0.4 秒,遇到的问题是略慢,提交购买申请时大概慢了个 1 秒(偶尔出现)

    我也很苦恼啊。
    快了担心数据下载不全,慢了担心人家已经捷足先登。
    我预计至少有 6 个机器人在和我争。我不狂刷就要被别的机器人虐。

    无奈啊啊啊啊。那就让服务器多劳苦劳苦啦。
    linde
        22
    linde  
       2018-03-18 22:47:38 +08:00
    LoadRunner 中 Pacing 和 Think time 概念。
    sunwei0325
        23
    sunwei0325  
       2018-03-19 08:50:07 +08:00
    建议看一下 scrapy 母公司的项目- frontera
    https://github.com/scrapinghub/frontera
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1035 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 22:01 · PVG 06:01 · LAX 14:01 · JFK 17:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.