python爬蟲ssl錯誤_Python爬蟲:Requests的SSLError:certificate verify failed問題解決方案6條...

問題:腳本是用Python寫的,用到開源庫play-scraper,調用其collectionAPI來獲取Google Play的Top App列表。該庫使用了requests作為客戶端來對Google Play進行操作。當腳本執行時,會報如下錯誤:certificate verify failed。

File "/home/me/py3.4/lib/python3.4/site-packages/urllib3/util/ssl_.py", line 325, in ssl_wrap_socket

return context.wrap_socket(sock, server_hostname=server_hostname)

File "/usr/local/lib/python3.4/ssl.py", line 365, in wrap_socket

_context=self)

File "/home/me/py3.4/lib/python3.4/site-packages/gevent/_ssl3.py", line 232, in __init__

raise x

File "/home/me/py3.4/lib/python3.4/site-packages/gevent/_ssl3.py", line 228, in __init__

self.do_handshake()

File "/home/me/py3.4/lib/python3.4/site-packages/gevent/_ssl3.py", line 545, in do_handshake

self._sslobj.do_handshake()

ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File "/home/me/py3.4/lib/python3.4/site-packages/requests/adapters.py", line 440, in send

timeout=timeout

File "/home/me/py3.4/lib/python3.4/site-packages/urllib3/connectionpool.py", line 630, in urlopen

raise SSLError(e)

urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)

定位過程

仔細分析Traceback,發現問題出在def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None)中。注意verify參數,默認為True。在play-scraper中也是將其設為True的,說明在SSL握手過程中要驗證certificate的。

Google了一下錯誤信息,大致有以下幾種解決方法:

1. 將verify設為False,不驗證certificate

參考:https://stackoverflow.com/a/30373147/2510797

簡單粗暴,但是有效。不報錯誤了,但總是有Insecure request的告警。對于有代碼潔癖的本人來說,這顯然是不能接受的,除非時間非常緊迫。繼續定位。

2. 更新系統的certificate。

參考:https://stackoverflow.com/a/24212501/2510797

sudo apt-get install ca-certificates

看了一下所用Linux系統的ca-certificates package,確實比較老了,但之前一直沒有問題。死馬當活馬醫試試吧,但問題依舊。

3. 指定系統certificate的路徑

參考: https://stackoverflow.com/a/16085737/2510797

Linux系統certificate的certificate路徑在/etc/ssl/certs。使用verify="/etc/ssl/certs"試試,發現確實不報錯誤了。但是這個方法的弊端也是顯而易見:play-scraper并沒有在API中提供傳入參數verify,必須要修改其代碼才行。不同的操作系統,其certificate存放的位置肯定不一樣,要是代碼支持跨平臺,就需要判斷操作系統的類型,然后傳入相應的verify值。對于一個相對使用比較廣泛的requests庫來說,這么做顯然不太合理。

4. 使用certifi的certitificate路徑

參考:https://stackoverflow.com/a/35791445/2510797

看了一下requests的文檔,發現它使用了certifi package。然后再去看certifi的文檔,發現其certificate路徑有兩個:certifi.where()和certifi.old_where()。快速瀏覽了一下requests的源碼,發現如果verify=True的話,所用的certificate就是certifi.where(),所以就試了一下old_where(),居然不報錯了。但看到certifi的文檔中建議盡量不要用old_where(),所以還是不甘心,繼續定位。

5. 安裝requests的security extras

參考:https://stackoverflow.com/a/39580231/2510797

pip install -U requests[security]

注意后面的方括號,pip會安裝三個security相關的package:pyopenssl cryptography idna。

試了一下,果然有效,不再報錯。再去讀requests和urllib3的源碼,發現確實使用了pyopenssl。具體是怎么用的,還沒有來得及分析。

至此個人覺得比較好的解決方法基本成型:修改play-scraper的dependency,使用requests[security]來安裝那三個安全相關的包。

另外,系統的openssl版本太舊或太新也可能會造成問題。在目前最新版本的openssl上,該解決方法是有效的。

6.anaconda版的python問題

如果你在第一次使用requests時出現SSL錯誤:SSLError("Can’t connect to HTTPS URL because the SSL " urllib3.exceptions.SS,如果你是用的anaconda版的python,那么只要裝python原版就好了,原帖附上:

大致就是說anaconda版的python是用的anaconda自己的SSL庫,所以會報錯,換回原版python就不會有這個問題。

總結:使用開源軟件的好處是可以看實現源碼,花點時間讀源碼,調試定位,問題基本不難解決。但是文檔有可能不是那么完備,需要進行Google或仔細讀源碼。希望自己的分析思路對別人有所幫助吧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537223.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537223.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537223.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2019年1月3日

數組 字面量創建數組 1. var arr[]; []里邊可以放數字,字符串,true,false,null,undefined,數組([1,2,3]),對象{x:1,y:2} var arr[1,2…

vertex 3.0 與SpringBoot混合開發之初探

SpringBoot是最近幾年比較流行的web應用開發框架,它是微服務的一個開發框架。它的Web服務器內核為Tomcat或Jetty,它們作為Servlet容量來對客戶端的http/https請求進行解析。最近,spring.io又出推出一套新的服務器內核框架,它就是W…

switch芯片和phy芯片的區別_感應式芯片卡CPU卡的FM1208-9和FM1208-10有什么區別,你知道嗎?...

感應式CPU卡是目前芯片卡中安全系統較高的芯片,使用范圍也較為廣泛,但是這款CPU分為FM1208-9和FM1208-10,那你們知道分別代表什么意思呢?他們之間有什么不同呢?CPU白卡FM是什么?首先,我們來說下…

每次登陸都要滑動驗證_湖人隊冠軍成員卡魯索很吃香:每次談判都有N支球隊點名要他...

10月24日NBA直播臺訊:洛杉磯湖人隊助理教練邁克-彭伯西在接受媒體采訪時透露,湖人隊替補控球后衛卡魯索目前在聯盟中很吃香。湖人隊每次進行交易談判時,對方球隊都點名想要卡魯索。彭伯西表示:“每一次我們在休賽期或者交易截止日…

[HAOI2015]按位或

樸素的 f[S]表示S到(1<<n)的期望次數 發現1的個數只增加不減少 所以可以類似拓撲序的圖&#xff0c;然后枚舉子集O(3^n)轉移 沒有優化的余地 另辟蹊徑&#xff1a; 拆開每一位來看 t[i]表示第i位變成1的次數 ansE(max(t[i])) 根據min-max容斥 得到&#xff1a;ans∑E(t[i…

MySQL在DOS指令里面的使用以及增刪改查的使用

本人的第一條博客&#xff0c;選中我的電腦單機右鍵&#xff0c;點開管理&#xff0c;選中服務找到MySQL57.啟動該服務。回退至桌面&#xff0c;按住winR 輸入cmd打開DOS指令的窗口。 在窗口輸入: mysql -h localhost -u root -p 顯示password輸入提示&#xff1a;表示已經…

node+socket.io 實現一個聊天室

我們只做簡單的實現&#xff0c;不接入數據庫&#xff0c;nodejs也不使用express和koa等框架 因此依賴只有兩個&#xff1a; 1、socket.io 2、mime&#xff08;用于獲取靜態資源時獲取文件的mime類型&#xff09; 安裝命令&#xff1a; npm install socket.io mime --save 其他…

安卓應用用戶數據_用戶指標數據應用

一、如何理解數據用戶數據&#xff1a;gender:性別、 birthday:出生日期行為數據&#xff1a;user_id:用戶id、auction_id:購買行為編號、buy_mount:購買數量、day:購買時間商品數據&#xff1a;cat_id:商品種類ID、cat1:商品類別、property:商品屬性二、用戶數據指標1.用戶數據…

三大數據庫數據庫端口號及連接jdbc驅動下載

Jdbc連接三大數據庫&#xff08;mysql sqlserver oracle&#xff09; Mysql:端口號為&#xff1a;3306&#xff08;默認&#xff09; 用java連接mysql數據庫 Try{Class.forName(“com.mysql.jdbc.Driver”); //DatabaseName:需要連接的數據庫名稱 String url”jdbc:mysql://12…

webgis從基礎到開發實踐_開源WebGIS教程系列——11.1 GISLite 的開發背景與設計

地理信息門戶可以幫助人們更容易地發現、訪問和使用地理空間信息&#xff0c; 是地理信息發布、服務和共享的重要環節。許多國家都很重視地理信息門戶的 建設&#xff0c;把它作為國家空間數據基礎設施(spatial data infrastructure&#xff0c;SDI)的重要組成部分。GISLite 是…

Oracle數據庫及在DOS命令下面的簡單操作

在Oracle數據庫注釋用--表明為注釋&#xff0c;但以下用//或--代表解釋;數據庫不怎么區分大小寫&#xff1b; 先說說一些簡單Oracle數據庫操作的語句&#xff1a; 使用語句創建普通用戶&#xff1a; Create user username identified by password; //創建普通用戶 Grant reso…

CSS屬性(display)

1.display屬性 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>08display屬性</title><style>.c1 {background-color: red;/*display: none; !* 讓其在頁面上不顯示 *!*//*display: i…

產品發布系統_【產品發布】第3期|閥門遙控系統

更多精彩&#xff0c;請點擊上方藍字關注我們&#xff01;常熟瑞特電氣股份有限公司的閥門遙控系統是一款經典的產品線&#xff0c;包括了全系列的液壓執行器&#xff0c;電液執行器&#xff0c;微型動力單元&#xff0c;液壓動力泵站&#xff0c;液壓電磁閥箱等產品。閥門遙控…

大數據就業前景,分析的太到位了

大數據廣泛應用于電網運行、經營管理及優質服務等各大領域&#xff0c;并正在改變著各行各業&#xff0c;也引領了大數據人才的變革。大數據就業前景怎么樣&#xff1f;這對于在就業迷途中的我們是一個很重要的信息。 隨著大數據時代的到來【這次國家教育部也改革動真格了】&am…

常用集合(List,Set,Map)的基本定義和操作

集合類存放于java.util包中。 集合類存放的都是對象的引用&#xff0c;而非對象本身&#xff0c;出于表達上的便利&#xff0c;我們稱集合中的對象就是指集合中對象的引用&#xff08;reference)。 常用的集合類型主要有3種&#xff1a;set(集&#xff09;、list(列表&#x…

多麥克風做拾音的波束_麥克風丨人聲應該用動圈話筒還是電容話筒?

無論是在您最喜歡的樂隊的紀錄片中&#xff0c;還是在電影中那些有關錄音棚里的場景中&#xff0c;似乎都存在著一個共同的主題&#xff0c;那就是&#xff1a;歌手們都在使用大振膜的電容麥克風進行錄音。我知道人們應該從別人的經驗中汲取精華&#xff0c;事半功倍。但是我并…

MYSQL安裝與庫的基本操作

mysql數據庫 什么是數據庫 # 用來存儲數據的倉庫 # 數據庫可以在硬盤及內存中存儲數據 數據庫與文件存儲數據區別 數據庫本質也是通過文件來存儲數據, 數據庫的概念就是系統的管理存儲數據的文件 數據庫介紹 數據庫服務器端: 存放數據的主機集群數據庫端: 可以連接數據庫的任意…

java框架mybatis配置文件總結一

先新建個java EE的項目 該配置文件必須在src的目錄下面&#xff0c; 新建一個xml 文件&#xff1a; 建完后發現它會自動建在web目錄下面&#xff0c;我們把這個文件移到src目錄下面&#xff1a; &#xff08;注&#xff1a;對了&#xff0c;該文件的編碼最好用utf-8的no bom,…

python第六周實驗_第六周實驗四

二.實驗的內容(1)根據下面的要求實現圓類Circle。1.圓類Circle的成員變量&#xff1a;radius表示圓的半徑。2.圓類Circle的方法成員&#xff1a;Circle():構造方法&#xff0c;將半徑置0Circle(double r)&#xff1a;構造方法&#xff0c;創建Circle對象時將半徑初始化為rdoubl…

測試:脫離VS2010使用自動化測試時出現 6DA215C2-D80D-42F2-A514-B44A16DCBAAA 錯誤

在前一系列IronRuby中一直是圍繞這UI自動化測試來寫的&#xff0c;今天基本測試框架完成了&#xff0c;測試人員沒有安裝VS2010&#xff0c;不知道能否跑&#xff0c;所以就在測試人員機器上跑跑看&#xff0c;但是問題就出現了 現象 運行run.bat跑單元測試時&#xff0c;出現以…