2016-03-18 13 views
1

Aşağıdaki tıbbi tedavi bilgisini geri döndürmek için kullanılan scrapy kodu, ilk döndürülen sonuçlar kümesini döndürür, ancak bağlantıları takip etmez. Öğrenme kodunu kontrol edin ve burada benzer sonuçları kontrol edin, ancak bunları entegre edin. Doğru, öğreniyorum. Herhangi bir işaretçi takdir edilecektir.scrapy aşağıdaki bağlantıları takip etmemektedir

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 

cevap

0

Sonraki URL ayıklama ve seçim mantığınız doğru değil. next ve pagination-links_anchor sınıflarına sahip bağlantı öğesini hedefleyin. Aşağıdaki işler benim için bu sorunları kısmen çözer:

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

. Artık tüm start_urls URL'lerinin toplandığını görüyorum, daha sonra analiz her bir URL'nin başlıyor. İdeal olarak bunun ilk 10 URL'yi toplaması, analizi yapması (linkleri daha derinlemesine incelemek), ardından listelenen bir sonraki start_url'e geçmesi gerekiyor. – jeffschips

+0

@jeffschips Bunun farklı bir takip sorunu olduğunu söyleyebilirim - lütfen zorluklarla karşılaşırsanız bunun için ayrı bir konu oluşturmayı düşünün. Teşekkürler. – alecxe