问题表象
近期在抓取数据的时候,数据是用Js通过接口加载的,需要POST form-data数据过去抓取。
yield scrapy.FormRequest(url=url, method='POST',headers=self.headers, formdata=self.data,
callback=self.parse,
dont_filter=True, errback=self.errback)
这时候返回来的数据是,中文都是问号:
原因分析
数据已经返回了,为啥中文是问号呢,还不是那种编码乱码,是问号,然后我就看到response回来的header里边是这样的数据:
Content-Type是’text/html; charset=utf-8’,而我自己写的抓取程序里的header是这样写的
headers = {
'Cookie': 'JSESSIONID=2A152F94CADDCBD472F8F4B4BFC235D0; Hm_lvt_c08a19591b74fa5d84b25c45965983f9=1605776233; '
'Hm_lpvt_c08a19591b74fa5d84b25c45965983f9=1605776239',
'Host': 'xxx.sss.com',
'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
"Accept-Language": 'zh-CN,zh;q=0.9'
}
这时候回来的就是中文就是问号,然后我又看浏览器的Content-Type,是这样的,得到的数据就是正常的。
问题原因应该是Content_Type的问题,改成程序返回的类型。
处理办法
抓取程序的Header改成如下:
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Cookie': 'JSESSIONID=2A152F94CADDCBD472F8F4B4BFC235D0; Hm_lvt_c08a19591b74fa5d84b25c45965983f9=1605776233; '
'Hm_lpvt_c08a19591b74fa5d84b25c45965983f9=1605776239',
'Host': 'xxx.sss.com',
'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
"Accept-Language": 'zh-CN,zh;q=0.9'
}
增加’Accept’: 'application/json, text/javascript, /; q=0.01’问题就解决了。Header中Accept的介绍如下:
Accept
作用: 浏览器端可以接受的媒体类型,
例如: Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的html文档,
如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)
通配符 * 代表任意类型
例如 Accept: / 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)
以上记录在抓取过程中遇到的一个问题,希望能帮到遇到同样问题的人,欢迎指正。
PS:第一次用Markdown编写博客,排版还有点不适应。