我有一个简单的屏幕抓取程序,通过BeautifulSoup获取HTML页面,使用代理抓取服务(Scrapinghub):
def make_soup(self,current_url):
soup = None
r = requests.get(current_url, proxies=self.proxies, auth=self.proxy_auth,
verify='static/crawlera-ca.crt')
if r.status_code == 200:
soup = bs4.BeautifulSoup(r.text, "html.parser")
if soup:
return soup
return False
当我在http://网站上运行它时,它可以正常工作。
当我在https://网站上运行它时会返回:
Traceback (most recent call last):
File "/home/danny/Documents/virtualenvs/AskArbyEnv/lib/python3.5/site-packages/requests/packages/urllib3/util/ssl_.py", line 295, in ssl_wrap_socket
context.load_verify_locations(ca_certs, ca_cert_dir)
FileNotFoundError: [Errno 2] No such file or directory
甚至更奇怪的是,当我在访问相同https://站点的单元测试中运行它时,它可以工作。
单元测试和正在运行的代码之间唯一变化的是我附加到传递给'make_soup'的URL的搜索项。每个生成的URL格式正确,我可以在浏览器中访问它们。
这让我觉得它与丢失的SSL证书无关。那么为什么它似乎抱怨它无法找到证书文件呢?
答案 0 :(得分:3)
通过在对verify='static/crawlera-ca.crt'
的通话中指定requests.get
,您说您访问的所有网站都必须拥有crawlera-ca.crt
签名的证书。如果您的代理不是重新写入请求/响应和服务器证书(它不应该,但检查下面的更新),那么您对https
站点的所有请求都将失败。< / p>
此外,如果您仔细阅读错误消息,您可能会发现磁盘上甚至没有crawlera-ca.crt
个文件。
要解决您的问题,只需删除verify
参数即可。这样requests
will use the default,certifi
捆绑(requests>=2.4.0
)。对于非侵入性代理,这是正确的解决方案。或者,如果您确实需要,可以将您信任的一些CA证书添加到本地certifi
商店,但要非常小心您要添加哪些证书。
<强>更新即可。看起来像Crawlera代理是一个中间人毕竟! Bad Crawlera,坏,坏,坏!
$ curl -vvv -x proxy.crawlera.com:8010 --cacert crawlera-ca.crt https://google.com/
[...snip...]
* Proxy replied OK to CONNECT request
* found 1 certificates in crawlera-ca.crt
* found 697 certificates in /etc/ssl/certs
* ALPN, offering http/1.1
* SSL connection using TLS1.2 / ECDHE_RSA_AES_256_GCM_SHA384
* server certificate verification OK
* server certificate status verification SKIPPED
* common name: google.com (matched)
* server certificate expiration date OK
* server certificate activation date OK
* certificate public key: RSA
* certificate version: #1
* subject: CN=google.com
* start date: Sat, 08 Jul 2017 13:33:53 GMT
* expire date: Tue, 06 Jul 2027 13:33:53 GMT
* issuer: C=IE,ST=Munster,L=Cork,O=ScrapingHub,OU=Leading Technology and Professional Services,CN=Crawlera CA,EMAIL=support@scrapinghub.com
* compression: NULL
请注意CN=google.com
发布的O=ScrapingHub,CN=Crawlera CA
。
这意味着Crawlera / ScrapingHub会重新加密您对目标网址的每个请求,并读取您与该网站交换的所有私人和敏感数据!据我所知,这是他们缓存原始请求并在刮擦同一站点的所有用户之间节省一些带宽的唯一方法,也是检查内容合法性的唯一方法,但仍然如此。他们应该放在FAQ的某个地方,我不确定他们会这样做。