【问题标题】:ProxyError Raised with Requests moduleRequests 模块引发的 ProxyError
【发布时间】:2014-02-11 10:49:55
【问题描述】:

我还是 python 的新手,即使在尝试了解 Requests 模块的不同方法并在那里阅读之后,我也不知道如何处理这个错误以及如何处理它来避免它。

这是我使用的简单请求,其中 line 循环通过具有我尝试访问的不同 URL 的文本文件和 d 包含许多 URL 的字典列表我正在用作代理。

import requests
import collections

# [...]
d = collections.deque(proxies)

with requests.session() as r:
    d.rotate(-1)
    page = r.get(line.rstrip(), proxies=d[0])

它运行良好,直到列表中的一个代理由于某种原因超时并强制脚本引发此错误:

ProxyError                                Traceback (most recent call last)
C:\Python27\lib\site-packages\IPython\utils\py3compat.pyc in execfile(fname, glob, loc)
    195             else:
    196                 filename = fname
--> 197             exec compile(scripttext, filename, 'exec') in glob, loc
    198     else:
    199         def execfile(fname, *where):

C:\Users\Christopher Fargere\desktop\python\quick_scraper.py in <module>()
     72         with requests.session() as r:
     73                 d.rotate(-1)
---> 74                 page = r.get(line.rstrip(), proxies=d[0])
     75                 print d[0]
     76                 print page.status_code
 C:\Python27\lib\site-packages\requests\sessions.pyc in get(self, url, **kwargs)
    393
    394         kwargs.setdefault('allow_redirects', True)
--> 395         return self.request('GET', url, **kwargs)
    396
    397     def options(self, url, **kwargs):

C:\Python27\lib\site-packages\requests\sessions.pyc in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert)
    381             'allow_redirects': allow_redirects,
    382         }
--> 383         resp = self.send(prep, **send_kwargs)
    384
    385         return resp

C:\Python27\lib\site-packages\requests\sessions.pyc in send(self, request, **kwargs)
    484         start = datetime.utcnow()
    485         # Send the request
--> 486         r = adapter.send(request, **kwargs)
    487         # Total elapsed time of the request (approximately)
    488         r.elapsed = datetime.utcnow() - start

C:\Python27\lib\site-packages\requests\adapters.pyc in send(self, request, stream, timeout, verify, cert, proxies)
    379
    380         except _ProxyError as e:
--> 381             raise ProxyError(e)
    382
    383         except (_SSLError, _HTTPError) as e:

ProxyError: Cannot connect to proxy. Socket error: [Errno 11001] getaddrinfo failed.

当引发从 d 列表中弹出代理的错误并重试相同的 URL 时,我希望实现一个 IF 条件。我确信它非常简单,但无法理解 Python 中的错误是如何引发的。 :(

【问题讨论】:

    标签: python proxy python-requests


    【解决方案1】:

    要捕获异常,请使用exception handling;抓住ProxyError 抛出:

    from requests.exceptions import ProxyError
    
    with requests.session() as r:
        page = None
    
        for _ in range(len(d)):
            d.rotate(-1)
            try:
                page = r.get(line.rstrip(), proxies=d[0])
            except ProxyError:
                # ignore proxy exception, move to next proxy
                pass
            else:
                # success, break loop
                break
    
        if page is None:
            # none of the proxies worked
            raise ProxyError
    

    这最多会一一尝试d 中的所有代理。如果它们都不起作用,我们会再次提出ProxyError,因为您可能想知道当时您的所有代理都失败了。

    【讨论】:

    • 太棒了,谢谢,我以为 python 中不存在“案例”控制流。那确实很方便。 :D 现在,我还有一个问题,因为一旦我中断循环,我在执行其他命令时遇到问题:如果我在块'with requests.session() as r:' 中'中断'指令:'它不允许我在那里处理更多命令,对吧?
    • 抱歉,我发表评论有点快。如果您能就我上面编辑的评论启发我,那就太好了。 :)
    • @fassn:我根据您在帖子中提供的内容构建了一个循环;您可以在if page is None 部分之后放置更多需要r 会话处于活动状态的代码,或者在try:/except 中放置更多使用当前代理的代码。
    • @fassn: 但break 意味着结束for _ in range(len(d)) 循环,因为我们不再需要循环到下一个代理。
    • 谢谢完美!我想我发现我的逻辑错误让我感觉 break 指令也在停止父循环的其余部分!
    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 2013-03-12
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多