我正在练习“Web Scraping with Python”中的代码,但我一直遇到这个证书问题:
from urllib.request import urlopen from bs4 import BeautifulSoup import re pages = set() def getLinks(pageUrl): global pages html = urlopen("http://en.wikipedia.org"+pageUrl) bsObj = BeautifulSoup(html) for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")): if 'href' in link.attrs: if link.attrs['href'] not in pages: #We have encountered a new page newPage = link.attrs['href'] print(newPage) pages.add(newPage) getLinks(newPage) getLinks("")
错误是:
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 1319, in do_open raise URLError(err) urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1049)>
顺便说一句,我也在练习scrapy,但一直遇到问题:command not found: scrapy(我在网上尝试了各种解决方案,但都没有用……真的很沮丧)
对于第一个问题,你遇到了 SSL 证书验证失败的错误。这是由于 Python 默认会尝试验证 HTTPS 连接的 SSL 证书,而在某些情况下,可能无法成功验证证书。
为了解决这个问题,你可以尝试禁用 SSL 证书验证。在 urlopen() 方法中,通过设置 context 参数可以实现禁用验证。下面是修改后的代码示例:
urlopen()
context
import ssl from urllib.request import urlopen from bs4 import BeautifulSoup import re pages = set() def getLinks(pageUrl): global pages # Create an SSL context with certificate verification disabled context = ssl._create_unverified_context() html = urlopen("https://en.wikipedia.org"+pageUrl, context=context) bsObj = BeautifulSoup(html, 'html.parser') for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")): if 'href' in link.attrs: if link.attrs['href'] not in pages: newPage = link.attrs['href'] print(newPage) pages.add(newPage) getLinks(newPage) getLinks("")
在上面的代码中,我们创建了一个禁用证书验证的 SSL 上下文 context,然后将其传递给 urlopen() 方法的 context 参数。
对于第二个问题,command not found: scrapy,这可能是由于 Scrapy 框架没有正确安装或配置导致的。确保你已经正确安装了 Scrapy,并且其可执行文件路径已经包含在系统的 PATH 环境变量中。
command not found: scrapy
如果你已经安装了 Scrapy,但仍然遇到该问题,可以尝试以下步骤:
pip show scrapy
which scrapy
pip uninstall scrapy
pip install scrapy
如果问题仍然存在,你可以提供更多关于你的操作系统、Python 版本和安装环境的信息,以便更详细地诊断和解决问题。