我正在尝试研究刮scrap的FormRequest
在网站上的工作方式,我有以下刮y代码:
import scrapy
import json
from scrapy.utils.response import open_in_browser
class Test(scrapy.Spider):
name = 'go2'
def start_requests(self):
url = 'http://www.webscrapingfordatascience.com/jsonajax/results2.php'
payload = {'api_code': 'C123456'}
yield scrapy.FormRequest(url,formdata=json.dumps(payload),headers={'Content-Type': 'application/json'})
#yield scrapy.FormRequest(url,formdata=payload) #dict opbject not allowed ?
def parse(self,response):
#print(response.text)
open_in_browser(response)
我似乎无法得到正确的答复,我首先尝试使用字典,但是没有用,然后我按照requests
进行了如下测试,两次尝试都有效。
import requests
url = 'http://www.webscrapingfordatascience.com/jsonajax/results2.php'
payload={'api_code': 'C123456'}
res = requests.post(url, json=payload)
res2 = requests.post(url, data=json.dumps(payload))
#res3 = requests.post(url, data=payload) doesn't work
FormRequest
接受键值而不是字符串,这就是json.dumps()
引发错误的原因。我的问题是如何使FormRequest(或任何抓取方法)在此示例上工作,即获得与请求相同的结果。
我相信res3 = requests.post(url, data=payload)
与FormRequest(url,formdata=payload)
相同,这就是为什么它不起作用的原因。
答案 0 :(得分:1)
根据scrapy docs-允许使用dict对象。
更新(由于问题不在请求正文中而不在标头中,因此并不实际)
我使用提琴手调试代理,比较不同库的请求和响应。
如您所见,Scrapy和请求库使用不同的标头发出请求。如果您需要使用有效代码接收有效请求-您需要修改标头。
UPDATE_2
class Test(scrapy.Spider):
name = 'go2'
def start_requests(self):
url = 'http://www.webscrapingfordatascience.com/jsonajax/results2.php'
payload = {'api_code': 'C123456'}
yield scrapy.FormRequest(url,body=json.dumps(payload))
def parse(self,response):
print(response.text)
#open_in_browser(response)
答案 1 :(得分:0)
这是抓狂用户的常见陷阱。 FormRequest
正在根据dict形成urlencoded有效负载,例如:
a = {'key1': 'value1', 'key2': 'value2'}
urlencode(a)
#Result: 'key2=value2&key1=value1'
在您的情况下,应将常规Request
类与body=json.dumps(your_dict)
一起使用