2017-07-08 104 views
1

我有一个简单的屏幕抓取例程获得通过BeautifulSoup HTML页面,使用代理爬行服务(Scrapinghub):URL请求使用Python失败 - 找不到SSL证书

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证书有关。那么为什么它似乎在抱怨它无法找到证书文件呢?

回答

3

通过在拨打requests.get的电话中指定verify='static/crawlera-ca.crt',您表示您访问的所有站点都必须拥有由crawlera-ca.crt签署的证书。如果您的代理不在重写请求/响应和服务器证书(它不应该,但检查更新在以下),那么您的所有请求将以https网站将失败。

此外,如果仔细阅读错误消息,则可以看到磁盘上甚至没有该crawlera-ca.crt文件。

要解决您的问题,只需删除verify参数。那样requests will use the defaultcertifi捆绑(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 protected] 
* compression: NULL 

注意的CN=google.com有被O=ScrapingHub,CN=Crawlera CA发出。

这意味着Crawlera/ScrapingHub会重新加密您对目标URL进行的每个请求,并且会读取您与该站点交换的所有私密和敏感数据!我知道这是他们缓存原始请求并为所有刮着同一网站的用户节省一些带宽的唯一方法,也是检查内容合法性的唯一方法。他们应该放在常见问题解答中,我不确定他们是否确实如此。

+0

感谢您的支持。该文件在磁盘上,但事实证明,它突然停止工作的原因是因为我将包含'make_soup'的python文件移动到较低级别的文件夹。改成'verify ='../static/crawlera-ca.crt')'解决了这个问题。 – RubyNoob

+0

结果Crawlera正在检查您的所有流量,并为您连接的所有站点颁发证书。在这种情况下,'crawlera-ca.crt'是必要的。但请注意,他们可以阅读与第三方网站交换的任何私人数据。 – randomir

相关问题