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

经常写爬虫的大佬们是如何不让程序中断的?

  •  
  •   hard2reg · 2017-01-30 18:47:04 +08:00 · 5499 次点击
    这是一个创建于 2890 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题,爬虫运行的时候难免会遇到各种意外,很有可能导致整个程序都终止。。。。

    各位大佬一般是怎么解决的?
    18 条回复    2017-02-08 23:09:13 +08:00
    h3ikichi
        1
    h3ikichi  
       2017-01-30 18:55:22 +08:00 via iPhone
    Try..Except...
    zqhong
        2
    zqhong  
       2017-01-30 18:57:13 +08:00
    Supervisor
    bombless
        3
    bombless  
       2017-01-30 19:01:50 +08:00 via Android
    还是对库的行为不熟悉吧 233
    直接 panic 的库当然就不要用了,除非做的是随时崩溃随时恢复
    bazingaterry
        4
    bazingaterry  
       2017-01-30 19:02:06 +08:00 via iPhone
    catch 。

    查一下文档这个函数会抛什么异常,都接住就好……
    popbones
        5
    popbones  
       2017-01-30 19:15:39 +08:00
    try:
    except:
    pass
    gamexg
        6
    gamexg  
       2017-01-30 19:24:29 +08:00
    python ?
    每个任务最外侧接住所有异常并打印日志。
    sheep3
        7
    sheep3  
       2017-01-30 19:27:34 +08:00
    难道不是 try catch 么,然后最好通知和记录,这个点爬不下去了继续爬别的点,如果出现大量错误做更高级别的通知,比如 server 酱啊,或者发个邮件啊,就这样。
    sheep3
        8
    sheep3  
       2017-01-30 19:27:45 +08:00
    打好 log 就好
    wellsc
        9
    wellsc  
       2017-01-30 19:32:57 +08:00
    let it crash
    gamexg
        10
    gamexg  
       2017-01-30 19:34:10 +08:00
    另外再补充下非爬虫涉及第三方的复杂任务,直接 multiprocessing.Process 另起一个进程来跑,出故障也只是任务进程出问题,主进程不会出问题,超时之类的情况直接杀子进程的进程树树,方便。
    bxb100
        11
    bxb100  
       2017-01-30 20:32:49 +08:00 via Android
    @gamexg 老司机😏
    Yinz
        12
    Yinz  
       2017-01-30 20:43:11 +08:00
    一般用 queue 做多线程任务队列,然后在 worker 线程上先处理已知可能出现的 exception ,然后再套一个 except Exception 来抓未知的。

    最后正常的任务会放到完成 queue 里,跳了未知 exception 的会放到一个 error queue 里,这样你可以人工处理完之后把 error queue 的全都倒回待处理 queue 里。

    当然,肯定需要完整的 log 才方便查错了
    aabbccli
        13
    aabbccli  
       2017-01-30 23:21:53 +08:00   ❤️ 1
    用 REDIS 做队列,失败的用 TRY EXCEPT 再 PUSH 到未爬队列里
    RqPS6rhmP3Nyn3Tm
        14
    RqPS6rhmP3Nyn3Tm  
       2017-01-30 23:34:49 +08:00 via iPhone
    抛出一个异常,然后记录下来,以后再尝试呗
    whwq2012
        15
    whwq2012  
       2017-01-31 09:44:01 +08:00 via Android
    用 scrapy 啊,而且爬之前要尽量搞清楚哪里会抛异常,并标记 try except 。
    lizon
        16
    lizon  
       2017-02-01 14:18:34 +08:00
    为什么会全部停止?单线程爬取?
    开多线程的话,暴力点处理就是在线程最外面 catch 所有异常,记下本次抓取的 url ,重新投递到任务队列。
    对获取不成功的 url 进行重试计数,超过重试次数限制的就不再投递到任务队列,记下来,人工处理。
    denonw
        17
    denonw  
       2017-02-03 14:31:02 +08:00
    try catch 啊
    whnzy
        18
    whnzy  
       2017-02-08 23:09:13 +08:00
    守护进程
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2853 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:09 · PVG 22:09 · LAX 06:09 · JFK 09:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.