2013-07-01 18 views
8

POST Ich denke, dass ich sehr großen Gefallen fragen werde, wie ich mit diesem Problem mehrere Tage kämpfe. Ich habe alles versucht (in meinem besten Wissen) und immer noch kein Ergebnis. Ich mache etwas falsch, kann aber immer noch nicht herausfinden, was es ist. Also vielen Dank an alle, die bereit sind, zu diesem Abenteuer zu gehen. Erste Dinge zuerst: Ich versuche, POST-Methode zu verwenden, um Informationen in das Formular zu posten, das auf delta.com Wie immer mit diesen Websites ist es kompliziert, wie sie in den Sitzungen und Cookies und Javascript sind, so kann es ein Problem sein Dort. Ich verwende Codebeispiel, das ich in stackoverflow gefunden habe: Using MultipartPostHandler to POST form-data with Python Und hier ist mein Code, den ich für Delta-Web-Seite optimiert.PYTHON SCRAPY Kann nicht Informationen zu FORMS,

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 

Wenn ich Spinne im Terminal zu kriechen anweisen, ich sehe:

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) 

Wenn Sie mit Beispiel von Link vergleichen Ich sehe nicht, dass ich auch POST-Methode zu machen geschaffen, wenn ich fast bin mit der gleiche Code. Ich habe es sogar mit sehr einfachen HTML/PHP-Form aus W3schools versucht, die ich auf den Server gestellt habe, aber das selbe dort. Was auch immer ich getan habe, nie geschafft, POST zu erstellen. Ich denke, das Problem ist einfach, aber als nur Python-Wissen, das ich habe, ist Scrapy und alle Scrapy, was ich Online (ich es ist gut dokumentiert) und von Beispielen gefunden, aber immer noch ist es nicht genug für mich. Wenn also jemand wenigstens den richtigen Weg zeigen könnte, wäre das eine große Hilfe.

+0

wird die cite lassen Sie Beiträge machen, werfen Sie einen Blick auf die cite 'robot.txt' –

+0

Hm ... guter Punkt, aber ich habe den gleichen Code (http://www.w3schools.com/php/php_forms .asp) um das Formular zu testen, das ich auf meinem Server platziert habe und ich habe keine robot.txt Datei. Es gab mir das gleiche Ergebnis. –

Antwort

11

Hier ist ein funktionierendes Beispiel für Request.from_response für delta.com mit:

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 

Sie falsche Spinnverfahren verwendet haben, und allowed_domains wurde falsch eingestellt.

Aber, delta.com verwendet stark dynamische Ajax fordert zum Laden der Inhalte - hier ist, wo Ihre Probleme beginnen. Z.B. response in parse1 Methode enthält keine Suchergebnisse - stattdessen enthält es eine HTML zum Laden AWAY WE GO. ARRIVING AT YOUR FLIGHTS SOON Seite, wo die Ergebnisse dynamisch geladen werden.

Grundsätzlich sollten Sie mit Ihren Browser-Entwicklertools arbeiten und versuchen, diese Ajax-Aufrufe in Ihrem Spider zu simulieren oder Tools wie selenium verwenden, die den echten Browser verwendet (und Sie können es mit scrapy kombinieren). auch

Siehe:

Hoffnung, das hilft.

+2

Danke Alecxe. Es hat mit POST sehr gut funktioniert und neue Fragen aufgeworfen, mit denen ich festhalte, aber ich werde versuchen, es alleine zu machen. Mindestens ein paar Tage. In jedem Fall ist Ihre Antwort eine große Hilfe. Und ich habe keinen anständigen Ruf, um es entsprechend zu bewerten. Die Welt ist sicher besser, wenn du hier bist ...Lächeln –

+1

Sie sind herzlich eingeladen, danke, zögern Sie nicht, weitere Fragen zu dem Thema in einem separaten Thread zu stellen. – alecxe

+1

@alecxe Ich schätze Ihre Informationen wirklich sehr. +1. Mit Ihrem Beispiel über Delta-Airlines ... Gibt es sowieso (mit scrapy) alle möglichen Auto-Vervollständigungen zu wissen? In diesem Fall zum Beispiel die genaue Bezeichnung der Flughäfen? Gibt es ein Tutorial oder ein Dokument, wo ich diese Art von Informationen bekommen kann? – DanielTheRocketMan

Verwandte Themen