【问题标题】:Can't connect to a specific URL in python无法连接到python中的特定URL
【发布时间】:2015-10-21 15:16:41
【问题描述】:

我正在尝试使用 Python 连接到 Heathrow rewards 站点。我正在尝试使用RoboBrowser 库从页面中抓取数据,但我的连接尝试引发了ReadTimeout 错误。我使用的所有其他 URL(即 Waterstones、Maximiles)都运行良好。

我已尝试连接 requestsurllib 库,并得到相同的结果。

我认为问题与 SSL 验证有关,所以我将其关闭,但它并没有改变任何东西。

您应该能够通过在我提到的其中一个库中连接到上面的 URL 来为自己复制问题。

from robobrowser import RoboBrowser
browser = RoboBrowser()
browser.open('https://rewards.heathrow.com')

【问题讨论】:

  • 您可以通过提供一个演示问题的最小示例来改进问题。
  • 尝试在 GET 请求到此 URL 时捕获浏览器发送的标头,然后使用 python 请求在您的请求中发送这些标头。
  • @BarryHurley 太简单了,我认为没有必要,但我现在添加了一个最小的示例。
  • 我刚刚通过requestsrobobrowser 都试过了,效果很好。看起来问题出在你身上了。
  • @MuhammadTahirButt 刚刚尝试过,没有运气。

标签: python robobrowser


【解决方案1】:

正如问题中的 cmets 所建议的,这是 SSL 版本问题。解决方案是创建一个适配器类,如下所示:Choosing The SSL Version In Python Requests

我用来解决问题的代码如下:

class SSLAdapter(HTTPAdapter):
    def __init__(self, ssl_version=None, **kwargs):
        self.ssl_version = ssl_version
        self.poolmanager = PoolManager()
        super().__init__(**kwargs)

    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(num_pools=connections,
                                       maxsize=maxsize,
                                       block=block,
                                       ssl_version=self.ssl_version)

然后,在创建 RoboBrowser 实例时:

s = Session()
s.mount('https://', SSLAdapter(_ssl.PROTOCOL_TLSv1))
self.browser = RoboBrowser(parser="lxml", session=s, user_agent=user_agent)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-13
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多