无法将信息POST到表单中的PYTHON SCRAPY。

12 浏览
0 Comments

无法将信息POST到表单中的PYTHON SCRAPY。

我认为我会请求一个非常大的帮助,因为我已经为这个问题奋斗了几天。我已经尝试了我所知道的所有可能的方法,但仍然没有结果。我做错了什么,但是我还是弄不清楚是什么。所以非常感谢愿意冒险尝试的每个人。

首要问题是:

我正在尝试使用POST方法将信息发布到delta.com上的表单上。

像这样的网站总是很复杂,因为它们涉及会话、cookie和Javascript,所以可能会有问题。

我正在使用在stackoverflow上找到的代码示例:

使用MultipartPostHandler在Python中发布表单数据

这是我为delta网页调整的代码:

from scrapy.selector import HtmlXPathSelector
from scrapy.http import FormRequest, Request
from delta.items import DeltaItem
from scrapy.contrib.spiders import CrawlSpider, Rule
class DmozSpider(CrawlSpider):
    name = "delta"
    allowed_domains = ["http://www.delta.com"]
    start_urls = ["http://www.delta.com"]
    def start_requests(self, response):
        yield FormRequest.from_response(response, formname='flightSearchForm',url="http://www.delta.com/booking/findFlights.do", formdata={'departureCity[0]':'JFK', 'destinationCity[0]':'SFO','departureDate[0]':'07.20.2013','departureDate[1]':'07.28.2013','paxCount':'1'},callback=self.parse1)
    def parse1(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//')
        items = []
        for site in sites:
            item = DeltaItem()
            item['title'] = site.select('text()').extract()
            item['link'] = site.select('text()').extract()
            item['desc'] = site.select('text()').extract()
            items.append(item)
        return items

当我在终端中指示爬虫进行爬取时,我看到:

scrapy crawl delta -o items.xml -t xml

2013-07-01 13:39:30+0300 [scrapy] INFO: Scrapy 0.16.2 started (bot: delta)

2013-07-01 13:39:30+0300 [scrapy] DEBUG: Enabled extensions: FeedExporter, LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState

2013-07-01 13:39:30+0300 [scrapy] DEBUG: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, RedirectMiddleware, CookiesMiddleware, HttpCompressionMiddleware, ChunkedTransferMiddleware, DownloaderStats

2013-07-01 13:39:30+0300 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware

2013-07-01 13:39:30+0300 [scrapy] DEBUG: Enabled item pipelines:

2013-07-01 13:39:30+0300 [delta] INFO: Spider opened

2013-07-01 13:39:30+0300 [delta] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

2013-07-01 13:39:30+0300 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023

2013-07-01 13:39:30+0300 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080

2013-07-01 13:39:33+0300 [delta] DEBUG: Crawled (200) (referer: None)

2013-07-01 13:39:33+0300 [delta] INFO: Closing spider (finished)

2013-07-01 13:39:33+0300 [delta] INFO: Dumping Scrapy stats:

{'downloader/request_bytes': 219,

'downloader/request_count': 1,

'downloader/request_method_count/GET': 1,

'downloader/response_bytes': 27842,

'downloader/response_count': 1,

'downloader/response_status_count/200': 1,

'finish_reason': 'finished',

'finish_time': datetime.datetime(2013, 7, 1, 10, 39, 33, 159235),

'log_count/DEBUG': 7,

'log_count/INFO': 4,

'response_received_count': 1,

'scheduler/dequeued': 1,

'scheduler/dequeued/memory': 1,

'scheduler/enqueued': 1,

'scheduler/enqueued/memory': 1,

'start_time': datetime.datetime(2013, 7, 1, 10, 39, 30, 734090)}

2013-07-01 13:39:33+0300 [delta] INFO: Spider closed (finished)

如果你和链接中的示例进行比较,你会发现我甚至没有成功进行POST方法,即使我使用的几乎是相同的代码。

我甚至尝试了非常简单的HTML/PHP表单,将其放在服务器上,但结果都一样。无论我做了什么,都无法创建POST。

我认为问题很简单,但是我只有Scrapy这么多Python知识,而我找到的所有Scrapy都是在线上找到的(它有很好的文档)和例子,但对我来说还不够。所以如果有人能至少指出正确的方法,那将是非常大的帮助。

0
0 Comments

在这个例子中,出现了一个使用`Request.from_response`无法向表单提交信息的问题。出现这个问题的原因是使用了错误的spider方法,并且`allowed_domains`设置不正确。此外,`delta.com`网站使用了大量的动态ajax调用来加载内容,这就是问题的根源。在`parse1`方法中,`response`并不包含任何搜索结果,而是包含一个用来加载结果的html页面。要解决这个问题,可以使用浏览器开发工具来模拟这些ajax调用,或者使用像`selenium`这样的工具,它使用真实的浏览器(也可以与`scrapy`结合使用)。如果需要获取所有可能的自动补全列表,可以向例如`http://en.wikipedia.org/wiki/List_of_airports_by_IATA_code:_A`这样的网址发送请求,并解析出机场列表。

0