推荐学习书目
› 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 · Mar 18, 2018 · 5927 views
    This topic created in 3156 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    无奈啊啊啊啊。那就让服务器多劳苦劳苦啦。
    linde
    linde
    Mar 18, 2018
    22
    LoadRunner 中 Pacing 和 Think time 概念。
    sunwei0325
    sunwei0325
    Mar 19, 2018
    23
    建议看一下 scrapy 母公司的项目- frontera
    https://github.com/scrapinghub/frontera
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1887 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 66ms · UTC 07:18 · PVG 15:18 · LAX 23:18 · JFK 02:18
    ♥ Do have faith in what you're doing.