[E 160329 11:32:22 base_handler:194] HTTP 599: SSL certificate problem: self signed certificate in certificate chain
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\pyspider\libs\base_handler.py", line 187, in run_task
result = self._run_task(task, response)
File "C:\Python27\lib\site-packages\pyspider\libs\base_handler.py", line 166, in _run_task
response.raise_for_status()
File "C:\Python27\lib\site-packages\pyspider\libs\response.py", line 183, in raise_for_status
raise http_error
HTTPError: HTTP 599: SSL certificate problem: self signed certificate in certificate chain
網上有遇到相似錯誤的:
解壓後是兩個文件:ca-bundle.crt和curl.exe,也知道https的請求須要證書,也知道ca-bundle.crt就是這個證書,關鍵是不知道怎麼讓pyspider使用起來。
先驗證一下,在pycharm裏編寫腳本:
import pycurl
#建立一個同libcurl中的CURL處理器相對應的Curl對象
c = pycurl.Curl()
c.setopt(pycurl.URL, 'https://mm.taobao.com/json/request_top_list.htm?page=1')
# 設置證書
# c.setopt(pycurl.CAINFO, 'C:\\Python27\\curl\\curl-ca-bundle.crt') #執行上述訪問網址的操做 c.perform()
運行後輸出錯誤:
Traceback (most recent call last):
File "F:/PycharmProjects/test/pycurlStudy.py", line 90, in <module>
c.perform()
pycurl.error: (
60, 'SSL certificate problem: self signed certificate in certificate chain')
能夠看到錯誤信息是和上面的如出一轍的(錯誤碼不同這個不重要,可能pyspider有二次封裝),而後把上面的驗證代碼的註釋去掉,也就是設置一下證書,再次運行,OK!
思路是對了,關鍵是不知道怎麼讓pyspider使用起證書ca-bundle.crt。
發現有一個標記能夠用
validate_cert:
validate_cert
- For HTTPS requests, validate the server’s certificate? default: True
也就是這樣使用
self.crawl(url, callback=self.index_page, validate_cert=False)
可是運行依然報錯,提示validate_cert不存在該key,草泥馬!
而後通篇搜索D:\Python27\Lib\site-packages\pyspider目錄根本沒有發現validate_cert,草泥馬!
可是網上搜索能找到,就是在github上,也就是說最新的pyspider源碼裏是有validate_cert的,而後懷疑本身的pyspider安裝的是不是最新版的,當天才安裝的,應該不至於,因而
pip install --upgrade pyspide
r也提示已是最新版了。
那麼只有一個可能了:
pyspider最新源碼和最新文檔裏都有,可是可能還未更新到最新的安裝包裏。因而先git下來最新的pyspider源碼,把
C:\Python27\Lib\site-packages\pyspider-0.3.10.dev0-py2.7.egg目錄下的pyspider整個文件夾刪除,用git下的源碼裏的pyspider總體複製過去,重啓pyspider all,再次瀏覽器中運行,成功!