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.*这几个参数的问题。具体什么问题呢,多半是因为服务器反爬措施吧,没有再深入研究了,能跑起来就行了。