No se puede pasar por un formulario con scrapy

Soy nuevo en el uso de scrapy y estoy tratando de obtener información de un sitio web de bienes raíces. El sitio tiene una página de inicio con un formulario de búsqueda (método GET). Estoy intentando ir a la página de resultados en mis solicitudes de inicio (recherche.php) y configurar todos los parámetros de obtención que veo en la barra de direcciones en el parámetro formdata. También instalé las cookies que tenía, pero él tampoco trabajó …

Aquí está mi araña:

from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from scrapy.http import FormRequest, Request from robots_immo.items import AnnonceItem class ElyseAvenueSpider(BaseSpider): name = "elyse_avenue" allowed_domains = ["http://www.elyseavenue.com/"] def start_requests(self): return [FormRequest(url="http://www.elyseavenue.com/recherche.php", formdata={'recherche':'recherche', 'compteurLigne':'2', 'numLigneCourante':'0', 'inseeVille_0':'', 'num_rubrique':'', 'rechercheOK':'recherche', 'recherche_budget_max':'', 'recherche_budget_min':'', 'recherche_surface_max':'', 'recherche_surface_min':'', 'recherche_distance_km_0':'20', 'recherche_reference_bien':'', 'recherche_type_logement':'9', 'recherche_ville_0':'' }, cookies={'PHPSESSID':'4e1d729f68d3163bb110ad3e4cb8ffc3', '__utma':'150766562.159027263.1340725224.1340725224.1340727680.2', '__utmc':'150766562', '__utmz':'150766562.1340725224.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', '__utmb':'150766562.14.10.1340727680' }, callback=self.parseAnnonces )] def parseAnnonces(self, response): hxs = HtmlXPathSelector(response) annonces = hxs.select('//div[@id="contenuCentre"]/div[@class="blocVignetteBien"]') items = [] for annonce in annonces: item = AnnonceItem() item['nom'] = annonce.select('span[contains(@class,"nomBienImmo")]/a/text()').extract() item['superficie'] = annonce.select('table//tr[2]/td[2]/span/text()').extract() item['prix'] = annonce.select('span[@class="prixVignette"]/span[1]/text()').extract() items.append(item) return items SPIDER = ElyseAvenueSpider() 

Cuando ejecuto la araña, no hay problema, pero la página cargada no es la correcta (dice “Por favor, especifique su búsqueda” y no obtengo ningún resultado …)

 2012-06-26 20:04:54+0200 [elyse_avenue] INFO: Spider opened 2012-06-26 20:04:54+0200 [elyse_avenue] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2012-06-26 20:04:54+0200 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023 2012-06-26 20:04:54+0200 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080 2012-06-26 20:04:54+0200 [elyse_avenue] DEBUG: Crawled (200)  (referer: None) 2012-06-26 20:04:54+0200 [elyse_avenue] INFO: Closing spider (finished) 2012-06-26 20:04:54+0200 [elyse_avenue] INFO: Dumping spider stats: {'downloader/request_bytes': 808, 'downloader/request_count': 1, 'downloader/request_method_count/POST': 1, 'downloader/response_bytes': 7590, 'downloader/response_count': 1, 'downloader/response_status_count/200': 1, 'finish_reason': 'finished', 'finish_time': datetime.datetime(2012, 6, 26, 18, 4, 54, 924624), 'scheduler/memory_enqueued': 1, 'start_time': datetime.datetime(2012, 6, 26, 18, 4, 54, 559230)} 2012-06-26 20:04:54+0200 [elyse_avenue] INFO: Spider closed (finished) 2012-06-26 20:04:54+0200 [scrapy] INFO: Dumping global stats: {'memusage/max': 27410432, 'memusage/startup': 27410432} 

Gracias por tu ayuda !

FormRequest.from_response() que hace todo el trabajo por usted, ya que todavía podría perder algunos campos:

 from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from scrapy.http import FormRequest, Request from robots_immo.items import AnnonceItem class ElyseAvenueSpider(BaseSpider): name = "elyse_avenue" allowed_domains = ["elyseavenue.com"] # i fixed this start_urls = ["http://www.elyseavenue.com/"] # i added this def parse(self, response): yield FormRequest.from_response(response, formname='moteurRecherche', formdata={'recherche_distance_km_0':'20', 'recherche_type_logement':'9'}, callback=self.parseAnnonces) def parseAnnonces(self, response): hxs = HtmlXPathSelector(response) annonces = hxs.select('//div[@id="contenuCentre"]/div[@class="blocVignetteBien"]') items = [] for annonce in annonces: item = AnnonceItem() item['nom'] = annonce.select('span[contains(@class,"nomBienImmo")]/a/text()').extract() item['superficie'] = annonce.select('table//tr[2]/td[2]/span/text()').extract() item['prix'] = annonce.select('span[@class="prixVignette"]/span[1]/text()').extract() items.append(item) return items 

En la salida de su registro, dice que la araña hizo una solicitud POST a http://www.elyseavenue.com/recherche.php , pero usted dijo que el formulario usa GET.

Por supuesto, si realiza una solicitud POST a la URL y busca “Especifique su búsqueda”:

 ➜ curl -d "" http://www.elyseavenue.com/recherche.php | grep "Merci de préciser votre recherche." % Total % Received % Xferd Average Speed Time Time Time Dload Upload Total Spent Left Speed 100 37494 0 37494 0 0 54582 0 --:--:-- --:--:-- --:--:-- 60866 Merci de préciser votre recherche. 

FormRequest es una subclase de Request , que le permite especificar el tipo de solicitud. Debes especificar GET , como:

 FormRequest(url="http://www.elyseavenue.com/recherche.php", formdata={'recherche':'recherche', 'compteurLigne':'2', 'numLigneCourante':'0', 'inseeVille_0':'', 'num_rubrique':'', 'rechercheOK':'recherche', 'recherche_budget_max':'', 'recherche_budget_min':'', 'recherche_surface_max':'', 'recherche_surface_min':'', 'recherche_distance_km_0':'20', 'recherche_reference_bien':'', 'recherche_type_logement':'9', 'recherche_ville_0':'' }, cookies={'PHPSESSID':'4e1d729f68d3163bb110ad3e4cb8ffc3', '__utma':'150766562.159027263.1340725224.1340725224.1340727680.2', '__utmc':'150766562', '__utmz':'150766562.1340725224.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', '__utmb':'150766562.14.10.1340727680' }, callback=self.parseAnnonces, method="GET" )