1. 程式人生 > >python3 request 爬蟲 httplib.IncompleteRead() 問題的簡單解決方法

python3 request 爬蟲 httplib.IncompleteRead() 問題的簡單解決方法

起因

在一個迴圈爬取得爬蟲中,隨機出現一個 httplib.IncompleteRead() 錯誤。

分析

查詢了許多資料之後瞭解到,這個是由於 chunked 編碼不完整導致,那麼如何解決這個問題?由於這時候其實資料我們已經拿到了,但是 http_client 認為沒有結束,所以有這麼一個錯誤。具體分析過程可以看看這篇博文很詳細。博文傳送門

處理

這裡由於專案中充斥著 Request,不方便換,而且檔案不大,所以我通過最簡單的處理方式來處理這個問題(處理方式來源),這種方式可能會帶來資料丟失(在大檔案的情況下)
自己抓取到這個錯誤
通過 錯誤.partial.decode(‘utf-8’) 來獲取到檔案內容
例項程式碼:

def __init__(self, e, uri, format, uriparts):
        self.e = e
        self.uri = uri
        self.format = format
        self.uriparts = uriparts
        try:
            data = self.e.fp.read()
        except http_client.IncompleteRead as e:
            data = e.partial
        if self.e.headers.get('Content-Encoding'
) == 'gzip': buf = BytesIO(data) f = gzip.GzipFile(fileobj=buf) data = f.read() if len(data) == 0: data = {} else: data = data.decode('utf-8') if self.format == 'json': try: data = json.loads(data) except
ValueError: pass self.response_data = data super(FanfouHTTPError, self).__init__(str(self))

本文對應程式碼

    def get_cartoon_json(self,categories):
        for category in categories:
            hasMore = True
            index = 1
            while hasMore:
                try:
                    link = self.__baseUrl + '/' + category['name']+'/'+str(index)
                    # 轉換中文 url 編碼
                    link = urllib.request.quote(link)
                    print(link)
                    # 把多餘的轉換 : ==> %3A ,還原
                    link = link.replace('%3A', ':')
                    # 開啟連結
                    conn = req.urlopen(link)
                    # 以 utf-8 編碼獲取網頁內容
                    content = conn.read().decode('utf-8')

                except http_client.IncompleteRead as e:
                    # 處理 chunked 讀取錯誤,由於這裡都是 json 所以就不再作 gzip 驗證
                    content = e.partial
                    content = content.decode('utf-8')
                    if len(content) == 0:
                        content = '{}'

                print(content)
                jsonUtils = BaiDuCartoonUtils(self.__filePath)
                jsonUtils.write_json_to_jsonFile(content, self.__filePath + category['name'] + '/list/',
                                                 'data' + str(index) + '.json')

                jsonStr = json.loads(content)
                if jsonStr['data']['hasMore'] != 1:
                    hasMore = False
                index = index + 1
                # jsonUtils.write_cartoon_to_json('/api/query/'+self.__categoryName, content)

如有問題,歡迎指正

相關推薦

python3 request 爬蟲 httplib.IncompleteRead() 問題的簡單解決方法

起因 在一個迴圈爬取得爬蟲中,隨機出現一個 httplib.IncompleteRead() 錯誤。 分析 查詢了許多資料之後瞭解到,這個是由於 chunked 編碼不完整導致,那麼如何解決這個問題?由於這時候其實資料我們已經拿到了,但是 http_c

爬蟲IP被禁的簡單解決方法

clas rate HR useragent agents 時間 tst 代理服務器 github 爬蟲以前聽上去好厲害好神秘的樣子,用好了可以成就像Google、百度這樣的索索引擎,用不好可以憑借不恰當的高並發分分鐘崩掉一個小型網站。寫到這裏想到12306每年扛住的並發請

爬蟲IP被禁的簡單解決方法——切換UserAgent

-a ref 技術分享 blank bsp target log AS In 【轉載】Python爬蟲之UserAgent 用到的庫 https://github.com/hellysmile/fake-useragent 爬蟲IP被禁的簡單解決方法——切換User

Python3.4出現unable to find vcvarsall.bat的簡單解決方法

安裝wordcloud的時候,出現報錯,unable to find vcvarsall.bat。研究了好久,發現下面方法可行。 找到安裝目錄下的某個資料夾。 例如我的:F:\Python34\Lib\distutils 找到msvc9compiler.py 開啟搜尋vc_

Java中浮點數相減造成損失的簡單解決方法

今天遇到個問題:double m1 = 0.09    m1 = m1 - 0.05    結果m1卻不是0.04而是0.039999999999999994! 查資料說是java遵循IEEE754浮點數的運算規範,使用分數與指數表示浮點數 如:0.5

關於[No mapping found for HTTP request with URI]的問題解決方法

在我們將Web專案部署到伺服器時,有時會出現靜態資源找不到的問題,如在我釋出一個Spring MVC的專案時會報出這樣的錯誤“No mapping found for HTTP request with URI [/HelloWorld/login] in

WIN7部分程式中文亂碼的簡單解決方法

控制面板——區域和語言——設定——在彈出的視窗中將系統區域設定成“英語(英國)”,然後點選確定,重啟電腦。這裡需要提醒的是,重啟後可能會全是亂碼,因此我們需要牢記如何從桌面進入到這個介面,可以用筆記錄點選的位置和步驟 重啟完成後,我們按照上面記錄的再次來到區域和語言設定這一視窗,這次我們選擇“中

Nginx 出現 413 Request Entity Too Large錯誤解決方法

Nginx出現的413 Request Entity Too Large錯誤,這個錯誤一般在上傳檔案的時候出現,開啟nginx主配置檔案nginx.conf,找到http{}段,新增 解決方法就是 開啟nginx主配置檔案nginx.conf,一般在/usr/local/nginx/co

python3.6+selnium3+IE11問題及解決方法

環境:python3.6+selnium3+IE11+win7 一、輸入框輸入字元很慢,大概5秒輸入一個字元     解決方法:把IEDriverServer.exe替換成32位的 二、用例異常後不繼續執行剩餘的用例     解決方法:       1、在“執行”中輸入regedit開啟登錄檔  

413 Request Entity Too Large 的解決方法

增加如下兩行到nginx.conf的http{}段, 增大nginx上傳檔案大小限制 #設定允許釋出內容為8M client_max_body_size 8M; client_body_buffer_size 128k; 另外如果執行的是php,那麼還要檢查php.ini,

Nginx出現413 Request Entity Too Large錯誤解決方法,phpmyadmin匯入mysql資料庫提示,您想上傳更大的檔案/您可能想上傳更大的檔案的解決方法

Nginx出現413 Request Entity Too Large錯誤解決方法Nginx出現的413 Request Entity Too Large錯誤,這個錯誤一般在上傳檔案的時候出現解決方法:開啟nginx主配置檔案nginx.conf,一般在/usr/local/

提示:413 Request Entity Too Large 的解決方法

一、nginx伺服器 nginx出現這個問題的原因是請求實體太長了。一般出現種情況是Post請求時Body內容Post的資料太大了, 如上傳大檔案過大、POST資料比較多。 處理方法 在nginx.conf增加 client_max_body_siz

python3提示sqlite3模組不存在解決方法

首先 yum install sqlite-devel -y 然後重灌下python3(一定要重灌) # cd Python-3.4.2 # ./configure --prefix=/usr/loc

windows安裝centos7雙系統後丟失windows啟動項的簡單解決方法

來源自我的部落格 windows 7、8/10 安裝centos7雙系統後,預設會將mbr改寫成為grub2,而預設的centos7不識別windows 的ntfs分割槽,所以啟動項沒有windows。 可以用3條命令,即可將windows新增到grub

【福利!】Android SDK安裝、更新速度慢,必須用VPN的簡單解決方法

配置SDK這個東西很複雜,因為貌似和諧國內IP,更新無速度,VPN更新僅100K,實在讓人抓狂 嘗試了下GAE,結果妥妥的解決了 偷個懶,梯子地址:點我開啟梯子  配置GAE和瀏覽器fq 內容的

python 爬蟲 網頁亂碼問題 解決方法

        在使用python爬取網頁時,經常會遇到亂碼問題,一旦遇到亂碼問題,就很難得到有用的資訊。本人遇到亂碼問題,一般有以下幾個方式:1、檢視網頁原始碼中的head標籤,找到編碼方式,例如:            在上圖中,可以看到charset='utf-8',說

U盤啟動 Ubuntu 等系統,修復 PBR 引導的簡單解決方法

首先看看你的U盤下有一個 syslinux 目錄 然後下載 BOOTICE 這個東西 然後開啟它,按圖依次操作: 1、選擇你的啟動盤,千萬別錯了。。。 2、MBR 3、改成 USB-HD

Unable to read the project file ... 簡單解決方法

原來好好的solution, 在硬碟上移動了下位置後就每次開啟都出現unable to read the project file ...的錯誤 如果remove the web project from solution and then add it again, it

使用Struts2繼承ActionSupport出現錯誤,簡單解決方法

首先,這是第一次寫部落格,不太會用這個編輯器,不喜勿噴。 這是一個簡單的錯誤,相信安裝了JDK 1.8 又要使用Struts2進行開發的小夥伴都遇到了這個問題,那就是繼承ActionSupport這個類時出現如下錯誤: 這是JDK版本過高導致的,怎麼辦呢?

Eclipse "no make found in PATH" 簡單解決方法

下載了一個新的eclipse,高高興興地把自己的專案導進去。啊咧!居然報錯了圖一,我也是醉了。然後各種百度,上面的解決方法都用了,還是不行。苦逼了一整天,剛開始想著可能是ndk沒有的問題,看了一下,哎呀果然沒有ndk,如何把ndk加到eclipse裡面,還是不行!好吧,再次