2013-07-01 1 views
8

私はこの問題で数日間苦労しているので非常に大きな賛成を求めると思います。私はすべての可能な(私の最善の知識で)道を試みましたが、まだ結果はありませんでした。私は間違ったことをしていますが、それが何であるか把握できません。この冒険に行くのに十分なことをしてくれている皆さん、ありがとうございます。 最初のもの: 私はPOSTメソッドを使用してdelta.comにあるフォームに情報を投稿しようとしています いつもこのWebサイトではセッションやクッキー、Javascriptのように複雑なので問題になる可能性がありますそこ。 私はstackoverflowで見つけたコード例を使用しています: Using MultipartPostHandler to POST form-data with Python そしてここで私はdeltaのWebページのために微調整したコードです。PYTHON SCRAPY FORMSに情報をPOSTできない

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

引用をして、引用の 'robot.txt'を見てください。 –

+0

うーん、いい点ですが、私は同じコードを使っています(http://www.w3schools.com/php/php_forms私のサーバーに置いたフォームでテストするために、私はrobot.txtファイルを持っていません。それは私に同じ結果をもたらしました。 –

答えて

11

ここdelta.comためRequest.from_responseを使用しての作業例です:

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呼び出しを頻繁に使用します。ここで問題がどこから始まるのですか。例えば。 responseparse1メソッドには検索結果が含まれていません。代わりに結果が動的に読み込まれるAWAY WE GO. ARRIVING AT YOUR FLIGHTS SOON ページを読み込むためのhtmlが含まれています。

基本的には、ブラウザの開発ツールを使用してスパイダー内でajax呼び出しをシミュレートするか、実際のブラウザを使用するseleniumなどのツールを使用してください(scrapyと組み合わせることもできます)。

参照:助け

希望。

+2

Alecxeありがとうございます。私はPOSTでとてもうまく働いていました。新しい質問を作成しましたが、私はそれを自分で作成しようとします。少なくともカップル日。いずれにしても、あなたの答えは大きな助けになります。私はそれに応じてそれを評価するためのまともな評判を持っていません。あなたがここにいるとき、世界は確かに良い場所です...smile –

+1

あなたは、ありがたいことに、別のスレッドで件名に関する質問をしてください。 – alecxe

+1

@alecxeあなたの情報+1に本当に感謝しています。デルタ航空会社についてのあなたの例を使用します...可能なすべての自動補完を(治療を使用して)知ってもらえますか?この場合、例えば空港の正確な名前は?この種の情報を入手できるチュートリアルや文書はありますか? – DanielTheRocketMan

関連する問題