无法将信息POST到表单中的PYTHON SCRAPY。
无法将信息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)
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都是在线上找到的(它有很好的文档)和例子,但对我来说还不够。所以如果有人能至少指出正确的方法,那将是非常大的帮助。
在这个例子中,出现了一个使用`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`这样的网址发送请求,并解析出机场列表。