1. 程式人生 > 實用技巧 >scrapy 爬蟲的時候遇到的轉碼問題

scrapy 爬蟲的時候遇到的轉碼問題

問題描述

'gbk' codec can't decode byte 0x80 in position 10: incomplete multibyte sequence
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

解決過程

編寫scrapy的時候,在解碼response.body的時候一直出錯
最開始是這樣寫的

def parse(self, response):
    js = json.loads(response.body.decode('gbk'))

出現了這樣的錯誤

'gbk' codec can't decode byte 0x80 in position 10: incomplete multibyte sequence

然後我把decode方式改了一下

def parse(self, response):
    js = json.loads(response.body.decode('gbk', 'ignore'))

結果出現了這樣的錯誤

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

打印出response的編碼方式,結果是gb18030

print(response.encoding)  # gb18030

然後修改瞭解碼方式:

def parse(self, response):
    js = json.loads(response.body.decode(response.encoding, 'ignore'))

還是不對,依然出現上面第二個錯誤
最後回憶了一下以前為什麼能拿到資料,突然拿不到了,然後突然亂碼了,發現是自己加了請求頭的部分內容

headers = {
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.5',
    'Connection': 'keep-alive',
    'Host': 'club.jd.com',
    'Referer': 'https://item.jd.com/%s.html' % self.product_id,
    'User-Agent': random.choice(self.USER_AGENTS),
},

總結

本來是隻用了user-agent的,但是後來某東把根據referer限制了資料(返回狀態碼200但是body是空的),就加上了上面的一些引數。最後只保留了Host Referer User-Agent三個引數。我認為就是上面三個Accept.*這幾個引數的問題。具體什麼問題呢,多半是因為伺服器反爬措施吧,沒有再深入研究了,能跑起來就行了。