2016-01-29 2 views
0

Я новичок в scrapy и пытаюсь понять его, очищая сайт yellowpages.com.Scrapy web crawling going bad

Моя цель - написать код на Python, чтобы ввести поля поиска (бизнес и местоположение) на домашней странице yellowpages.com, а затем очистить последующие URL-адреса.

Мой код выглядит следующим образом:

import scrapy 
from scrapy.spiders import Spider 
from scrapy.selector import Selector 
from spider.items import Website 

class YellowPages(Spider): 
    name = "yellow" 
    allowed_domains = ["yellowpages.com"] 
    start_urls = [ 
     "http://www.yellowpages.com/" 
    ] 

    def parse(self, response): 
     return scrapy.FormRequest.from_response(
      response, 
      formxpath="//form[@id='search-form']", 
      formdata={ 
       "query":"business", 
       "location" : "78735" }, 
      callback=self.after_results 
     ) 

    def after_results(self, response): 
     self.logger.info("info msg") 

Я хочу, чтобы искать "бизнес" на месте "78735". Однако это не значения, которые передаются на веб-сайт. Мой журнал выглядит следующим образом:

2016-01-28 23:55:36 [scrapy] DEBUG: Crawled (200) <GET http://www.yellowpages.com/> (referer: None)

2016-01-28 23:55:36 [scrapy] DEBUG: Crawled (200) <GET http://www.yellowpages.com/search?search_terms=&geo_location_terms=Los+Angeles%2C+CA&query=business&location=78735> (referer: http://www.yellowpages.com/)

Во втором URL термины Лос-Анджелес + вставляется как-то. Когда я пытаюсь ввести поля поиска вручную и представить это как URL должен выглядеть следующим образом:

http://www.yellowpages.com/search?search_terms=business&geo_location_terms=78735

Может кто-нибудь сказать мне, что происходит не так и как это исправить?

Большое спасибо.

Просто для справки, вот часть исходного HTML кода yellowpages.com домашней страницы

<div class="search-bar"><form id="search-form" action="/search" method="GET"><div><label><span>What do you want to find?</span><input id="query" type="text" value="" placeholder="What do you want to find?" autocomplete="off" data-onempty="recent-searches" name="search_terms" tabindex="1"/></label><ul id="recent-searches" class="search-dropdown recent-searches"><li class="search-hint">Search by<b> business name,</b> or<b> keyword</b></li></ul><ul id="autosuggest-term" data-analytics='{"moi":105}' class="search-dropdown autosuggest-term"></ul></div><em>near</em><div><label><span>Where?</span> <input id="location"type="text" value="78735" placeholder="Where?" autocomplete="off" data-onempty="menu-location" name="geo_location_terms" tabindex="2"/></label>

ответ

2

Установите на search_terms и geo_location_terms образуют параметры:

def parse(self, response): 
    return scrapy.FormRequest.from_response(
     response, 
     formxpath="//form[@id='search-form']", 
     formdata={ 
      "search_terms": "business", 
      "geo_location_terms" : "78735"}, 
     callback=self.after_results 
    ) 

Протестировано следующий паук:

import scrapy 
from scrapy.spiders import Spider 


class YellowPages(Spider): 
    name = "yellow" 
    allowed_domains = ["yellowpages.com"] 
    start_urls = [ 
     "http://www.yellowpages.com/" 
    ] 

    def parse(self, response): 
     return scrapy.FormRequest.from_response(
      response, 
      formxpath="//form[@id='search-form']", 
      formdata={ 
       "search_terms":"business", 
       "geo_location_terms" : "78735"}, 
      callback=self.after_results 
     ) 

    def after_results(self, response): 
     for result in response.css("div.result a[itemprop=name]::text").extract(): 
      print(result) 

Распечатать список предприятий в "Austin, TX":

Prism Solutions 
Time Agent 
Stuart Consulting 
Jones REX L 
Medical Informatics & Tech Inc 
J E Andrews INC 
... 
Hicks Consulting