请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于header中Content-Length的一个奇怪问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class LagouSpider(scrapy.Spider):
    name = 'lagou'
    allowed_domains = ['www.lagou.com']
    start_urls = []
    headers = {
        "Accept""application/json, text/javascript, */*; q=0.01",
        "Accept-Encoding""gzip, deflate, br",
        "Accept-Language""zh-CN,zh;q=0.9",
        "Connection""keep-alive",
        # "Content-Length": "25",
        "Content-Type""application/x-www-form-urlencoded; charset=UTF-8",
        "Host""www.lagou.com",
        "Origin""https://www.lagou.com",
        "Referer""https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=",
        "User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36",
        "X-Anit-Forge-Code""0",
        "X-Anit-Forge-Token""None",
        "X-Requested-With""XMLHttpRequest"
    }
     
    def start_requests(self):
    api = 'https://www.lagou.com/jobs/positionAjax.json?px=new&city=%E6%B7%B1%E5%9C%B3&needAddtionalResult=false'
    post_data = {
        "first""true",
        "pn""1",
        "kd""python"
    }
    yield FormRequest(url=api, formdata=post_data, headers=self.headers, callback=self.parse)

老师这里的header中不带content-length可以正常爬 状态码200 ,但是带上后就成302了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
api = 'https://www.lagou.com/jobs/positionAjax.json?px=new&city=%E6%B7%B1%E5%9C%B3&needAddtionalResult=false'
headers = {
    "Accept""application/json, text/javascript, */*; q=0.01",
    "Accept-Encoding""gzip, deflate, br",
    "Accept-Language""zh-CN,zh;q=0.9",
    "Connection""keep-alive",
    "Content-Length""25",
    "Content-Type""application/x-www-form-urlencoded; charset=UTF-8",
    "Host""www.lagou.com",
    "Origin""https://www.lagou.com",
    "Referer""https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=",
    "User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36",
    "X-Anit-Forge-Code""0",
    "X-Anit-Forge-Token""None",
    "X-Requested-With""XMLHttpRequest"
}
 
data = {
    "first"" true",
    "pn"" 1",
    "kd"" python"
}
 
= requests.post(api, headers=headers, data=data)
print(r.status_code, r.history, r.encoding, r.text, sep='\n')

而使用requests模块来爬的话,不管header中是否有content-length都可以正常爬取 状态码都为200

这是为什么呢。。百思不得其解。。

正在回答 回答被采纳积分+3

插入代码

1回答

bobby 2018-06-21 10:16:57

这个问题比较有意思,对于后端来说 直观发送过来的数据是什么 不管具体是什么客户端,你可以使用抓包工具分析一下请求的具体参数是什么? 比如有没有可能scrapy或者requests会自动加上这个参数,最好的分析方式就是抓包分析具体请求参数是什么。 而不只是根据自己在代码中添加的参数

0 回复 有任何疑惑可以回复我~
  • 老师 我还是没明白。为什么scrapy 携带 content-length 请求头就会出问题,但是requests就丝毫不受影响。
    回复 有任何疑惑可以回复我~ 2021-03-31 00:52:04
  • bobby 回复 花王子 #2
    说明两者的headers中有其他的字段不一样 比如user-agent
    回复 有任何疑惑可以回复我~ 2021-04-01 09:40:14
  • 花王子 回复 bobby #3
    我启了一个服务 测试一下发现 scrapy中请求头加content_length 其实是没发送请求直接400的,而requests会自动计算请求报文长度并添加到请求头中,不知道为什么scrapy 在配置content_length时就会直接400掉
    回复 有任何疑惑可以回复我~ 2021-04-01 09:46:38
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号