python-2.7 - 使用scrapy的FormRequest没有提交表单

标签 python-2.7 web-scraping web-crawler scrapy

在尝试了 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:  []

最佳答案

主要问题在于如何传递预订类型、国家/地区、接送服务。您需要传递相应的“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
)

请注意,我还修复了 arrivaldatedeparturedate 参数名称。


您可能想问我是如何获得这些 ID 的。好问题 - 我使用了浏览器开发人员工具并研究了在搜索表单提交上发出的传出 POST 请求:

enter image description here

现在真正的问题是如何在 Scrapy 代码中获取 ID。预订类型很容易处理 - 只有 3 种类型的 id 从 1 到 3。国家列表实际上可以在同一搜索表单页面上的 select 标记中使用 id="获取airportgroupid" - 您可以在国家/地区名称与其内部 ID 之间构建映射字典,例如:

countries = {
    option.xpath("@label").extract()[0]: option.xpath("@value").extract()[0]
    for option in response.xpath("//select[@id='airportgroupid']//option")
}

country_id = countries["Turkey"]

接送地点变得越来越困难 - 它们取决于预订类型和国家/地区,并通过向“http://www.holidaytaxis.com/en/search/getpickup”和“http://www.holidaytaxis.com/en/search/getdropoff”端点发送额外的 XHR 请求来检索。

关于python-2.7 - 使用scrapy的FormRequest没有提交表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31231410/

相关文章:

python - 清理使用Scrapy抓取的数据

python - Scrapy蜘蛛索引错误

Python-Pygame 不工作

python - 打开 : differences between python 2 and 3

python - 使用 Saver v2 的 Tensorflow 加载模型

使用 R 检索期刊论文的引用

web-scraping - scrapy-如何停止重定向(302)

java - 有没有办法在爬行过程中清除crawler4j中的访问队列

java - 使用 jsoup 提取 https url

python-jira获取json