首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
华为云
V2EX  ›  Python

网站爬虫爬着爬着程序就假死了,也不报错,也不继续,就卡着不动了,是哪里设计不对,求各位指教

  •  
  •   wsds · 65 天前 · 2135 次点击
    这是一个创建于 65 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用于网站爬图 代码太多,贴关键部分,应该问题就出自以下爬虫部分:

    for i in soup1.find_all("input", type="image"):
    	imgnow = time.strftime("%Y%m%d%H%M%S")
    	imgurl = i['data-src']
    	rname = imgurl .split('/')[-1]
    	opener = urllib.request.build_opener()
    	opener.addheaders = self.UA
    	urllib.request.install_opener(opener)
    
            try:
              #就是卡这里不动了,没有任何动静,程序静止了
    	  urllib.request.urlretrieve(
    	  imgurl, "./Pic/%s" % imgnow + "_" + str(rname))     
    
           except Exception as e:
    		print("出错了:%s,继续..." % e)
    	        continue
    
    16 回复  |  直到 2018-06-14 17:13:14 +08:00
        1
    a7a2   65 天前
    需要加入超时处理,免得在对方网站限制或关闭时候有反应
        2
    wsds   65 天前
    @a7a2 怎么加,求指教
        3
    bihuchao   65 天前
        4
    ThirdFlame   65 天前
    推荐 requests。 当然了 不管用啥 都得考虑超时
        5
    wsds   65 天前
    @ThirdFlame 加了超时,现在可以抛出异常了,但老是有这种,放在 try 了,10 个请求,有 5 个就是这种,遇到就 pass 了继续。。。。:

    [WinError 10054] 远程主机强迫关闭了一个现有的连接。,继续...



    要么就干脆直接报错程序 终止了:
    requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None))
        6
    ThirdFlame   65 天前
    @wsds ConnectionReset,对端发了 reset。原因很多,网络不好 对方等待超时,对方发现你再爬虫,所以超时。 各种原因。 想要仔细分析原因 抓包分析,看看是网络不好,还是对方主动的。
        7
    wsds   65 天前
    @ThirdFlame 换了网络,不像是网络问题,总之感觉爬的很费力,各种异常,try 都 try 不住
        8
    SimbaPeng   65 天前 via Android
    必须要 ip 代理
        9
    herozhang   65 天前
    python 有个叫做 retry 的库,可以试一下,很方便的。
        10
    mumbler   65 天前
    要加重试机制,任何网络都会不稳定,对方服务器也可能出现故障,屏蔽等情况
        11
    wsds   65 天前
    @herozhang 好的,我试一下
    @mumbler 确实要加重啊,不然跑几分钟就直接崩了
        12
    Leigg   65 天前 via iPhone
    骚年,你得学会 requests。
    你说的假死问题应该出在你的代码上,好好排查。
        13
    alvin666   65 天前 via Android
    为什么不用 requests ? requests.get(timeout=10)
        14
    WWd0g   65 天前
    @alvin666 这个没啥用,只针对链接超时,读取超时得这样写 timeout=(3,6)
    不过这样写了也没卵用~
        15
    wsds   64 天前
    @Leigg 请求地址用的就是 requests,只不过下载图片用的是 urllib.request.urlretrieve
        16
    beforeuwait   61 天前
    我以前抓携程的时候也遇到这种问题
    程序就假死在那了。

    后来,我做了一个断点续爬来解决这个问题。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   实用小工具   ·   697 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 30ms · UTC 20:01 · PVG 04:01 · LAX 13:01 · JFK 16:01
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1