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

posted @ 2020-10-28 17:13  wunai006  阅读(450)  评论(0)    收藏  举报