2017-07-08 108 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