我使用scrapy.FormRequest.from_response
发布。我正在通过验证码,所有数据都就位,但是没有得到我期望的表。
这是我的有效载荷
{
'captcha': '680336',
'districtCode': '714',
'sroVal': 'TADIKONDA(714)',
'selectedSroId': 'null',
'sroId': '7',
'path': '/APCARDECClient',
'regyear': '2018',
'docSel': '1',
'doct': '861'
}
还有我用于发布请求的标头。
{
'origin': 'http://registration.ap.gov.in',
'accept-language': 'en-US,en;q=0.9,ru;q=0.8,uk;q=0.7',
'accept-encoding': 'gzip, deflate',
'accept': 'text/html,application/xh tml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'upgrade-insecure-requests': '1',
'referer': 'http://registration.ap.gov.in/APCARDECClient/ecSearchByDocAu to.jsp?distcode=&distname=&srocode=&sroname=',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'dnt': '1',
'Cookie': 'JSESSIONID=dQJTbqhpYdg1PMjJZkYT9bTyLLnMqV43zxj2sws1gZ2fQ8fJn0CQ!-392092779',
'cache-control': 'no-cache',
'content-type': 'application/x-www-form-urle ncoded'
}
当我使用相同的数据模仿Postman中的Post时,它工作正常,并且可以按预期收到该表。 这是邮递员的有效载荷:
captcha:331683
districtCode:7
docSel:1
doct:861
path:/APCARDECClient
regyear:2018
selectedSroId:null
sroId:714
sroVal:TADIKONDA(714)
和邮递员的标头:
Origin:http://registration.ap.gov.in
Upgrade-Insecure-Requests:1
DNT:1
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer:http://registration.ap.gov.in/APCARDECClient/FetchHelpDetails
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.9,ru;q=0.8,uk;q=0.7
Cookie:JSESSIONID=dQJTbqhpYdg1PMjJZkYT9bTyLLnMqV43zxj2sws1gZ2fQ8fJn0CQ!-392092779
Content-Type:application/x-www-form-urlencoded
请指出我在哪里错了? 我看到的唯一可能性是这一行:
Content-Type:application/x-www-form-urlencoded
我需要在Scrapy中显式地对这样的有效载荷进行编码吗?
P.S。当我裸露
yield scrapy.Request(url, method ="POST", body=json.dumps(payload),headers=headers, callback = self.details1)
答案 0 :(得分:0)
不要使用FormRequest
-它只是注入一些头文件并具有一些正文快捷方式。如果您要复制请求,则只需使用准系统Request
。
import headers
headers = {
# make sure Content Type is set
'Content-Type': 'application/x-www-form-urlencoded',
# some other headers
}
payload = """foobar"""
Request(
url,
headers=headers,
method='POST',
body=payload,
)
答案 1 :(得分:0)
好的。所以问题出在'Content-Type': 'application/x-www-form-urlencoded',
我在一开始就注意到了,但没有进一步关注。这么笨。
为了通过此页面,有效负载应为urlencoded
,如Content_Type
所示。
这是这样做的方法。
import urllib
payload = {'captcha': '865944',
'sroVal': 'TADIKONDA(714)',
'sroId': '714',
'regyear': '2017',
'doct': '1',
'districtCode': '7',
'path': '/APCARDECClient',
'selectedSroId': 'null',
'docSel': '1',
}
payload = urllib.urlencode(payload)
yield scrapy.Request(url, method ="POST", body=payload ,headers=headers,
callback = self.details1)