在尝试scrapy的第一个教程之后,我对此感到非常兴奋。所以我也想尝试表单提交。
我有以下脚本,如果我打印出response.body,我回到了带有表单的页面,没有任何反应。有人可以帮我看看如何进入结果页面吗?
# spiders/holidaytaxi.py
import scrapy
from scrapy.http import Request, FormRequest
from scrapy.selector import HtmlXPathSelector, Selector
class HolidaytaxiSpider(scrapy.Spider):
name = "holidaytaxi"
allowed_domains = ["holidaytaxis.com"]
start_urls = ['http://holidaytaxis.com/en']
def parse(self, response):
return [FormRequest.from_response(
response,
formdata={
'bookingtypeid':'Return',
'airpotzgroupid_chosen':'Turkey',
'pickup_chosen':'Antalya Airport',
'dropoff_chosen':'Alanya',
'arrivaldata':'12-07-2015',
'arrivalhour':'12',
'arrivalmin':'00',
'departuredata':'14-07-2015',
'departurehour':'12',
'departuremin':'00',
'adults':'2',
'children':'0',
'infants':'0'
},
callback=self.parseResponse
)]
def parseResponse(self, response):
print "Hello World"
print response.status
print response
heading = response.xpath('//div/h2')
print "heading: ", heading
输出结果为:
2015-07-05 16:23:59 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2015-07-05 16:24:01 [scrapy] DEBUG: Redirecting (301) to <GET http://www.holidaytaxis.com/en> from <GET http://holidaytaxis.com/en>
2015-07-05 16:24:02 [scrapy] DEBUG: Crawled (200) <GET http://www.holidaytaxis.com/en> (referer: None)
2015-07-05 16:24:03 [scrapy] DEBUG: Crawled (200) <POST http://www.holidaytaxis.com/en/search> (referer: http://www.holidaytaxis.com/en)
Hello World
200
<200 http://www.holidaytaxis.com/en/search>
heading: []
答案 0 :(得分:4)
主要问题在于您如何通过预订类型,国家/地区,接送和下车。您需要传递相应的“id”而不是文字字符串。
以下内容适用于您的情况:
return FormRequest.from_response(
response,
formxpath="//form[@id='transfer_search']",
formdata={
'bookingtypeid': '1',
'airportgroupid': '14',
'pickup': '121',
'dropoff': '1076',
'arrivaldate': '12-07-2015',
'arrivalhour': '12',
'arrivalmin': '00',
'departuredate': '14-07-2015',
'departurehour': '12',
'departuremin': '00',
'adults': '2',
'children': '0',
'infants': '0',
'submit': 'GET QUOTE'
},
callback=self.parseResponse
)
请注意,我还修复了arrivaldate
和departuredate
参数名称。
您可能想问我是如何获得这些ID的。好问题 - 我使用了浏览器开发人员工具并研究了在搜索表单上发出的传出POST请求:
现在真正的问题是如何在Scrapy代码中获取ID。预订类型易于处理 - 只有3种类型的ID为1到3.国家/地区列表实际上位于带select
的{{1}}标记的同一搜索表单页面上 - 您可以构建国家/地区名称与内部ID之间的映射字典,例如:
id="airportgroupid"
接送地点变得越来越困难 - 它们是预订类型和国家/地区,并且通过向“http://www.holidaytaxis.com/en/search/getpickup”和“http://www.holidaytaxis.com/en/search/getdropoff”端点的其他XHR请求进行检索。