我认为,几天后我会为这个问题挣扎,我会非常感激。我尝试了所有可能的(以我的最佳知识)方式但仍然没有结果。我做错了什么,但仍然无法弄清楚它是什么。非常感谢每一位愿意参加这次冒险的人。 首先要做的事情: 我正在尝试使用POST方法将信息发布到delta.com上的表单 与往常一样,这些网站很复杂,因为他们参加会话,cookie和Javascript,所以它可能是那里的问题。 我正在使用我在stackoverflow中找到的代码示例: Using MultipartPostHandler to POST form-data with 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) <GET http://www.delta.com> (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方法。 我甚至试过W3schools中非常简单的HTML / PHP表单,我把它放在服务器上,但在那里也一样。我做过什么从未设法创建POST。 我认为这个问题很简单,但是因为我所拥有的Python知识是Scrapy和所有Scrapy都是我在网上发现的(我记录得很清楚)和实例,但对我来说还不够。因此,如果任何人至少能够以正确的方式展示它将会是非常大的帮助。
答案 0 :(得分:11)
以下是使用Request.from_response
delta.com
:
from scrapy.item import Item, Field
from scrapy.http import FormRequest
from scrapy.spider import BaseSpider
class DeltaItem(Item):
title = Field()
link = Field()
desc = Field()
class DmozSpider(BaseSpider):
name = "delta"
allowed_domains = ["delta.com"]
start_urls = ["http://www.delta.com"]
def parse(self, response):
yield FormRequest.from_response(response,
formname='flightSearchForm',
formdata={'departureCity[0]': 'JFK',
'destinationCity[0]': 'SFO',
'departureDate[0]': '07.20.2013',
'departureDate[1]': '07.28.2013'},
callback=self.parse1)
def parse1(self, response):
print response.status
您使用了错误的蜘蛛方法,加上allowed_domains
设置错误。
但是,无论如何,delta.com
大量使用动态ajax调用来加载内容 - 这是你的问题开始的地方。例如。 response
方法中的parse1
不包含任何搜索结果 - 而是包含用于加载AWAY WE GO. ARRIVING AT YOUR FLIGHTS SOON
页面的html,其中结果是动态加载的。
基本上,您应该使用浏览器开发人员工具并尝试模拟蜘蛛内的那些ajax调用,或者使用selenium这样使用真实浏览器的工具(您可以将其与scrapy
结合使用)
另见:
希望有所帮助。