2016-03-18 15 views
1

Der folgende scrapy-Code für die Rückgabe von medizinischen Behandlungsinformationen gibt die erste Menge der zurückgegebenen Ergebnisse zurück, folgt jedoch nicht den Links. Code zu lernen und ähnliche Ergebnisse hier auf stackoverflow zu überprüfen, aber die Integration funktionierte nicht. Richtig, ich lerne. Alle Hinweise würden geschätzt werden.scrapy nicht folgenden Links

import urlparse 

from scrapy.spider import BaseSpider 
from scrapy.selector import Selector 
from scrapy.http import Request 
import w3lib.url 

from yelp.items import YelpItem 


class YelpSpider(BaseSpider): 
    name = "yelp" 
    download_delay = 10 
    concurrent_requests = 1 
    concurrent_requests_per_domain = 1 
    allowed_domains = ["yelp.com"] 
    start_urls = ["http://www.yelp.com/search?find_desc=cancer+treatment&find_loc=manhattan%2Cny&start=0", 
"http://www.yelp.com/search?find_desc=cancer+treatment&find_loc=manhattan%2Cny&start=20", 
"http://www.yelp.com/search?find_desc=cancer+treatment&find_loc=manhattan%2Cny&start=30"] 

    def parse(self, response): 
     selector = Selector(response) 
     for title in selector.css("span.indexed-biz-name"): 
      page_url = urlparse.urljoin(response.url, 
             title.xpath("a/@href").extract()[0]) 
      self.log("page URL: %s" % page_url) 
      #continue 
      yield Request(page_url, 
          callback=self.parse_page) 

     for next_page in selector.css(u'ul > li > a.prev-next:contains(\u2192)'): 
      next_url = urlparse.urljoin(response.url, 
             next_page.xpath('@href').extract()[0]) 
      self.log("next URL: %s" % next_url) 
      #continue 
      yield Request(next_url, 
          callback=self.parse) 

    def parse_page(self, response): 
     selector = Selector(response) 
     item = YelpItem() 
     item["name"] = selector.xpath('.//h1[@itemprop="name"]/text()').extract()[0].strip() 
     item["addresslocality"] = u"\n".join(
      selector.xpath('.//address[@itemprop="address"]//text()').extract()).strip() 
     item["link"] = response.url 
     website = selector.css('div.biz-website a') 
     if website: 
      website_url = website.xpath('@href').extract()[0] 
      item["website"] = w3lib.url.url_query_parameter(website_url, "url") 
     return item 

Antwort

0

Ihre nächste URL-Extraktions- und Auswahllogik ist nicht korrekt. Richten Sie das Link-Element auf die Klassen next und pagination-links_anchor. Folgendes funktioniert für mich:

next_url = response.css('a.pagination-links_anchor.next::attr(href)').extract_first() 
if next_url: 
    next_url = urlparse.urljoin(response.url, next_url) 
    self.log("next URL: %s" % next_url) 
    yield Request(next_url, callback=self.parse) 
+0

dies löst teilweise die Probleme. Ich stelle jetzt fest, dass alle start_urls URLs zuerst gesammelt werden, dann beginnt die Analyse jeder einzelnen URL. Idealerweise sollte dies die ersten 10 URLs sammeln, die Analyse durchführen (tiefer in die Links eintauchen) und dann zur nächsten start_url-Liste gehen. – jeffschips

+0

@jeffschips Ich würde sagen, das ist ein anderes Folgeproblem - bitte denken Sie daran, bei Problemen ein eigenes Thema zu erstellen. Vielen Dank. – alecxe