scrapy 爬蟲的時候遇到的轉碼問題
阿新 • • 發佈:2020-10-28
問題描述
'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.*這幾個引數的問題。具體什麼問題呢,多半是因為伺服器反爬措施吧,沒有再深入研究了,能跑起來就行了。