我在这里有点疯狂,觉得自己一定是漏掉了什么明显的东西。
我试图使用python和urllib3从一个网站上抓取数据。我的代码是这样的
>>> import urllib3
>>> from bs4 import BeautifulSoup
>>>
>>> http = urllib3.PoolManager()
>>> url = 'https://www.google.com/'
>>> r = http.request('GET', url)
>>> data = BeautifulSoup(r.data)
如果我打开我的终端(我在mac上),激活我的conda虚拟环境,然后调出python解释器,这段代码就会像预期的那样工作,调出html请求并解析数据。
当我把这段代码放到Python IDE中,并将其设置为完全相同的虚拟环境时,HTTP get请求失败,并收到以下错误信息
{MaxRetryError}HTTPSConnectionPool(host='www.nts.live', port=443): Max retries exceeded with url: /api/v2/shows/powell/episodes?offset=0&limit=12 (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))
我过去也做过类似的请求,在Pycharm内也能正常工作,所以这肯定是某个阶段的用户错误。我不知道除了我的虚拟环境是相同的以外,我应该检查什么?我已经尝试了多个不同的链接,但问题依然存在。如果有任何关于为什么会出现这个错误的想法,我将非常感激。
这个错误不是来自IDE,而是在一个模块中使用了其他方法检索http请求的代码。以上住在我的 data_pull.py
文件,但我有另一个文件 spotify_request.py
也被导入。而不是 urllib3,这个文件使用了 import requests
然后 requests.get(url)
.
当我在终端中独立运行我的代码时,这第二个导入从来没有被执行过,代码运行得很流畅。为了解决这个问题,我将所有的urllib3获取请求替换为requests库(https:/pypi.orgprojectrequests。). 我还测试了一下,让所有的请求都使用 urllib3,代码也运行得很好。我不知道为什么这两种方法都不能用,但这解决了我的错误。
TLDR; 我无法在我的包中同时使用 urllib3 和 requests 进行 http 调用,请坚持使用其中一种。