Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 使用scrapy';s FormRequest未提交任何表格_Python 2.7_Web Scraping_Web Crawler_Scrapy_Scrapy Spider - Fatal编程技术网

Python 2.7 使用scrapy';s FormRequest未提交任何表格

Python 2.7 使用scrapy';s FormRequest未提交任何表格,python-2.7,web-scraping,web-crawler,scrapy,scrapy-spider,Python 2.7,Web Scraping,Web Crawler,Scrapy,Scrapy Spider,在尝试了scrapy的第一个教程之后,我真的很兴奋。所以我也想尝试表单提交 我有下面的脚本,如果我打印出response.body,我将返回到带有表单的页面,但什么也没有发生。有人能帮我到结果页面吗 # spiders/holidaytaxi.py import scrapy from scrapy.http import Request, FormRequest from scrapy.selector import HtmlXPathSelector, Selector class Ho

在尝试了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:  []
2015-07-05 16:23:59[scrapy]调试:Telnet控制台监听127.0.0.1:6023
2015-07-05 16:24:01[scrapy]调试:将(301)重定向到
2015-07-05 16:24:02[scrapy]调试:爬网(200)(参考:无)
2015-07-05 16:24:03[scrapy]调试:爬网(200)(参考:http://www.holidaytaxis.com/en)
你好,世界
200
标题:[]

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


你可能想问我是怎么得到这些身份证的。好问题-我使用浏览器开发人员工具,研究了在搜索表单提交时发出的发送的POST请求:

现在真正的问题是如何在你的代码中获得ID。预订类型很容易处理-只有3种类型的ID从1到3。实际上,国家列表可在同一搜索表单页面上的
选择
标记中使用
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"]

接送地点变得越来越困难-它们是预订类型和国家/地区相关的,并且通过对“”和“”端点的附加XHR请求进行检索。

感谢修复。无论如何,我仍然得到与响应相同的html,并且没有结果page@steph是的,
airportgroupid
参数名中有一个继承的输入错误-现已修复。对我有用。嘿,我在发送额外的XHR时遇到了麻烦。我怎样才能知道这个巨大的参数是从哪里产生的?@steph好的,你说的“这个巨大的参数”是什么意思?谢谢。很抱歉打扰你,现在我可以让它工作了!谢谢!!