使用Scrapy时XHR出现413,但在Requests库中正常工作
我正在尝试从一个在线的地理信息系统(GIS)抓取一些数据,这个系统使用的是XML格式。我用requests库写了一个简单的脚本,成功地发送了请求,并得到了HTTP 200的响应,结果也正确。但当我把这个请求转到scrapy时,我总是收到一个413
的错误。我用Wireshark检查了这两个请求,发现了一些不同之处,但我不太确定自己是否完全理解这些差异。
在scrapy中的请求看起来是这样的:
yield Request(
self.parcel_number_url,
headers={'Accept': '*/*',
'Accept-Encoding': 'gzip,deflate,sdch',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive',
'Content-Length': '823',
'Content-Type': 'application/xml',
'Host': 'xxxxxxxxxxxx',
'Origin': 'xxxxxxxxxxx',
'Referer': 'xxxxxxxxxxxx',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'},
method='POST',
cookies={'_ga': 'GA1.3.1332485584.1402003562', 'PHPSESSID': 'tpfn5s4k3nagnq29hqrolm2v02'},
body=PAYLOAD,
callback=self.parse
)
我检查的网络数据包可以在这里找到:http://justpaste.it/fxht
这个链接包含了使用requests库时的HTTP请求和使用scrapy的Request对象时的HTTP请求。看起来在使用scrapy时,请求的大小更大,第二个TCP段比使用requests库时的第二个TCP段大了21个字节。而且在scrapy的请求中,Content-Length这个头信息被设置了两次。
有没有人遇到过这种在scrapy中出现的问题?我以前抓取数据时从来没有遇到过413的错误。
1 个回答
1
我解决这个问题的方法是删除了cookies,并且在我发送的请求中没有手动设置“Content-Length”这个头信息。看起来这两件事导致了第二个TCP段多了21个字节,从而引发了413的响应。也许服务器把“Content-Length”当成了两个“Content-Length”头信息的总和,所以才返回了413,但我不太确定。