Python 如何在Scrapy中发出需要请求负载的POST请求
我正试图从中解析数据。Python 如何在Scrapy中发出需要请求负载的POST请求,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我正试图从中解析数据。 在inspect元素的网络部分,我找到了用于返回我感兴趣的JSON的POST请求的链接。 但是对于发出这个POST请求,有一个带有一些字典的请求负载 我假设它与我们在scrapy中用于发出FormRequest的普通formdata一样,但它返回403错误。 我已经尝试了以下方法。 url = "https://busfor.pl/api/v1/searches" formdata = {"from_id" : d_id ,"to_id"
在inspect元素的网络部分,我找到了用于返回我感兴趣的JSON的POST请求的链接。
但是对于发出这个POST请求,有一个带有一些字典的请求负载
我假设它与我们在scrapy中用于发出FormRequest的普通formdata一样,但它返回403错误。
我已经尝试了以下方法。
url = "https://busfor.pl/api/v1/searches"
formdata = {"from_id" : d_id
,"to_id" : a_id
,"on" : '2019-10-10'
,"passengers" : 1
,"details" : []
}
yield scrapy.FormRequest(url, callback=self.parse, formdata=formdata)
这将返回403错误
我还参考了StackOverflow post中的一个来尝试这一点。url = "https://busfor.pl/api/v1/searches"
payload = [{"from_id" : d_id
,"to_id" : a_id
,"on" : '2019-10-10'
,"passengers" : 1
,"details" : []
}]
yield scrapy.Request(url, self.parse, method = "POST", body = json.dumps(payload))
但即使这样也会返回相同的错误。有人能帮我吗。要了解如何使用Scrapy解析所需数据。使用json数据发送POST请求的方法是后者,但您将错误的json传递到站点,它需要一个字典,而不是字典列表。 因此,不是:
payload = [{"from_id" : d_id
,"to_id" : a_id
,"on" : '2019-10-10'
,"passengers" : 1
,"details" : []
}]
你应使用:
payload = {"from_id" : d_id
,"to_id" : a_id
,"on" : '2019-10-10'
,"passengers" : 1
,"details" : []
}
您没有注意到的另一件事是传递到POST请求的标题
,有时站点使用ID和哈希来控制对其API的访问,在本例中,我发现了两个似乎需要的值,X-CSRF-Token
和X-NewRelic-ID
。幸运的是,我们可以在搜索页面上找到这两个值
这是一个正在工作的爬行器,搜索结果可通过方法self.parse\u search
获得
import json
import scrapy
class BusForSpider(scrapy.Spider):
name = 'busfor'
start_urls = ['https://busfor.pl/autobusy/Sopot/Gda%C5%84sk?from_id=62113&on=2019-10-09&passengers=1&search=true&to_id=3559']
search_url = 'https://busfor.pl/api/v1/searches'
def parse(self, response):
payload = {"from_id" : '62113',
"to_id" : '3559',
"on" : '2019-10-10',
"passengers" : 1,
"details" : []}
csrf_token = response.xpath('//meta[@name="csrf-token"]/@content').get()
newrelic_id = response.xpath('//script/text()').re_first(r'xpid:"(.*?)"')
headers = {
'X-CSRF-Token': csrf_token,
'X-NewRelic-ID': newrelic_id,
'Content-Type': 'application/json; charset=UTF-8',
}
yield scrapy.Request(self.search_url, callback=self.parse_search, method="POST", body=json.dumps(payload), headers=headers)
def parse_search(self, response):
data = json.loads(response.text)
使用json数据发送POST请求的方法是后者,但是您将错误的json传递到站点,它需要一个字典,而不是字典列表。 因此,不是:
payload = [{"from_id" : d_id
,"to_id" : a_id
,"on" : '2019-10-10'
,"passengers" : 1
,"details" : []
}]
你应使用:
payload = {"from_id" : d_id
,"to_id" : a_id
,"on" : '2019-10-10'
,"passengers" : 1
,"details" : []
}
您没有注意到的另一件事是传递到POST请求的标题
,有时站点使用ID和哈希来控制对其API的访问,在本例中,我发现了两个似乎需要的值,X-CSRF-Token
和X-NewRelic-ID
。幸运的是,我们可以在搜索页面上找到这两个值
这是一个正在工作的爬行器,搜索结果可通过方法self.parse\u search
获得
import json
import scrapy
class BusForSpider(scrapy.Spider):
name = 'busfor'
start_urls = ['https://busfor.pl/autobusy/Sopot/Gda%C5%84sk?from_id=62113&on=2019-10-09&passengers=1&search=true&to_id=3559']
search_url = 'https://busfor.pl/api/v1/searches'
def parse(self, response):
payload = {"from_id" : '62113',
"to_id" : '3559',
"on" : '2019-10-10',
"passengers" : 1,
"details" : []}
csrf_token = response.xpath('//meta[@name="csrf-token"]/@content').get()
newrelic_id = response.xpath('//script/text()').re_first(r'xpid:"(.*?)"')
headers = {
'X-CSRF-Token': csrf_token,
'X-NewRelic-ID': newrelic_id,
'Content-Type': 'application/json; charset=UTF-8',
}
yield scrapy.Request(self.search_url, callback=self.parse_search, method="POST", body=json.dumps(payload), headers=headers)
def parse_search(self, response):
data = json.loads(response.text)