2016-03-19 12 views
0

İhtiyaçlarım için bir paletli bir örümcek yarattım, mükemmel çalışıyor. Ancak, taradığım sitenin bazı kategorilerinde (hepsi değil) belirli xml site haritaları var. Bu nedenle, bu kategorilerdeki .xml site haritasının ayrıştırılması ve bağlantıların alınmasının ardından, bu bağlantılara daha derinlemesine gitmek için taramayı bırakmasını istiyorum.Taramayı incelemek ve yol üzerindeki XML sayfalarından bağlantı eklemek için Crawlspider

SitemapSpider ve XMLFeedSpider olduğunu biliyorum, ancak XMLFeedSpider veya tersi ile taramalı dizinin işlevselliğine ihtiyacım var.

Herhangi bir yardım için teşekkür ederiz.

cevap

3

haritalarınızda URL'ler ile CrawlSpider çalışması için ama görünüşe: Sadece geri aramasında sitemap_xml_xpathrules üst kısmında bir kural eklemek ve düzenlemek için ihtiyaç CrawlSpider does not process XML responses gibi. Dolayısıyla, onları kabul etmek için _requests_to_follow'u geçersiz kılmanız gerekir. İşte

Sana /urlset/url/loc sayfaları ayrıştırmak istiyorum nasıl bağlı

from scrapy.spiders.crawl import CrawlSpider, Rule 
from scrapy.link import Link 
from scrapy.http import Request 


class XmlLinkExtractor(): 

    def __init__(self, xpath, namespaces): 
     self.xpath = xpath 
     self.namespaces = namespaces 

    def extract_links(self, response): 
     selector = response.selector 
     if self.namespaces: 
      for i, ns in self.namespaces.items(): 
       selector.register_namespace(i, ns) 
     for link in selector.xpath(self.xpath).extract(): 
      yield Link(link) 


class ExampleSitemapCrawlSpider(CrawlSpider): 
    name = "myspider" 
    start_urls = (
     # link to a sitemap index file 
     'http://www.example.com/sitemap.gz', 

     # link to a sitemap file 
     #'http://www.example.com/sitemaps/sitemap-general.xml', 
     ) 
    rules = (

     # this handles sitemap indexes, following links to other sitemaps 
     Rule(XmlLinkExtractor('/sm:sitemapindex/sm:sitemap/sm:loc/text()', 
       {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"}),), 

     # this is for "leaf" pages in sitemaps 
     Rule(XmlLinkExtractor('/sm:urlset/sm:url/sm:loc/text()', 
       {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"}), 
      # here, defining the callback without follow=True 
      # makes the crawler stop at these pages level, 
      # not following deeper links 
      # unset the callback if you want those pages 
      # to go through other rules once downloaded 
      callback='parse_loc'), 
     # ... other rules 
    ) 

    def _requests_to_follow(self, response): 
     # we need to override `_requests_to_follow` 
     # and comment these 2 lines, because they filter XML responses 
     #if not isinstance(response, HtmlResponse): 
     # return 
     seen = set() 
     for n, rule in enumerate(self._rules): 
      links = [lnk for lnk in rule.link_extractor.extract_links(response) 
        if lnk not in seen] 
      if links and rule.process_links: 
       links = rule.process_links(links) 
      for link in links: 
       seen.add(link) 
       r = Request(url=link.url, callback=self._response_downloaded) 
       r.meta.update(rule=n, link_text=link.text) 
       yield rule.process_request(r) 

    def parse_loc(self, response): 
     self.logger.debug("parsing %r" % response) 

(a sitemapindex içeren) ile başlamak için sitemap.gz URL ile çalıştı örnek örümcek, farklı olan geri farklı URL'ler yönlendirmek isteyebilirler (Farklı kurallar ekleyerek ve filtrelemeye izin vermek için XmlLinkExtractor'u özelleştirerek (veya süzmek için XPath'i kullanacak şekilde)

+0

Teşekkürler Paul, fark ettiğim bir başka şey de Steven'ın da doğru cevabı var. Sorun, xraw sayfalarıyla başladığımda (start_urls'u xml olarak ayarladıysam), taramayı kullanan kişide. Eğer bir html sayfası ile başlayacağım ve daha sonra bir xml sayfasına gidersiniz, taramalı süvari, Steven'ın cevabıyla hile yapıyor gibi görünüyor. Yardımlarınız için hepinize teşekkür ederim. Geç cevap verdiğim için özür dilerim. – Saitx

0

Geçerli CrawlSpider'ınıza bir kural ekleyebilir ve XML'i kendiniz ayrıştırabilirsiniz. XML yanıtları için özel bir bağlantı çıkarıcı uydurmak,

import scrapy 
import scrapy.linkextractors 
import scrapy.spiders.crawl 


class SmartlipoSpider(scrapy.spiders.crawl.CrawlSpider): 
    name = "myspider" 
    start_urls = ('http://example.com/',) 
    rules = (
     scrapy.spiders.crawl.Rule(
      scrapy.linkextractors.LinkExtractor(
       allow=r'sitemap\.xml$', 
      ), 
      callback='parse_sitemap_xml', follow=True, 
     ), 
     # the other rules... 
    ) 

    def parse_sitemap_xml(self, response): 
     sitemap_xml_xpath = '/urlset/url' 

     for url in response.xpath(sitemap_xml_xpath): 
      yield scrapy.Request(url) 

    # your other callbacks... 
+0

Parse_sitemap_xml için gelen yanıtın boş görünmesinden önce bunu denedim. HTML beklendiği gibi işlenmiyor. – Saitx

+0

Crawlspider xml sonuçları. yanıtı bir nedenle boş geliyorsa veya bir xml sayfasını başlattığımda yukarıdaki kod parse_sitemap_xml dosyasını çalıştırmıyor. – Saitx

İlgili konular