PYTHON SCRAPY No se puede enviar información a FORMULARIOS,

Creo que voy a pedir un gran favor ya que estoy luchando con este problema durante varios días. Intenté todas las formas posibles (en mi mejor conocimiento) y aún no he obtenido ningún resultado. Estoy haciendo algo mal, pero todavía no puedo entender qué es. Así que gracias a todos los que estén dispuestos a ir a esta aventura. Lo primero es lo primero: estoy tratando de usar el método POST para publicar información en el formulario que se encuentra en delta.com Como siempre, con estos sitios web es complicado, ya que están en las sesiones y las cookies y Javascript, por lo que puede haber problemas allí. Estoy usando el ejemplo de código que encontré en stackoverflow: uso de MultipartPostHandler para POST datos de formulario con Python Y aquí está mi código que modifiqué para la página web 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 

Cuando le pido a la araña que se arrastre en la terminal veo:

  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) 

Si se compara con el ejemplo del enlace, no veo que logré hacer el método POST incluso cuando estoy usando casi el mismo código. Incluso probé con un formulario HTML / PHP muy simple de W3schools que coloqué en el servidor, pero igual allí. Lo que nunca logré crear POST. Creo que el problema es simple, pero como el único conocimiento de Python que tengo es Scrapy y todo Scrapy es lo que encontré en línea (I está bien documentado) y de ejemplos, pero aún así no es suficiente para mí. Entonces, si al menos alguien pudiera mostrar el camino correcto, sería una gran ayuda.

Este es un ejemplo Request.from_response del uso de Request.from_response para 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 

Has utilizado métodos de araña incorrectos, además de allowed_domains se configuró incorrectamente.

Pero, de todos modos, delta.com usa mucho las llamadas dinámicas ajax para cargar el contenido, aquí es donde comienzan sus problemas. Por ejemplo, la response en el método parse1 no contiene ningún resultado de búsqueda, en su lugar contiene un html para cargar AWAY WE GO. ARRIVING AT YOUR FLIGHTS SOON AWAY WE GO. ARRIVING AT YOUR FLIGHTS SOON página donde los resultados se cargan dinámicamente.

Básicamente, deberías trabajar con las herramientas de desarrollo de tu navegador e intentar simular esas llamadas ajax dentro de tu araña o usar herramientas como el selenium que usa el navegador real (y puedes combinarlo con scrapy ).

Ver también:

  • Raspado de páginas ajax usando python
  • ¿Se puede usar scrapy para raspar contenido dynamic de sitios web que usan AJAX?
  • Paginación utilizando scrapy

Espero que ayude.