2010-05-30 8 views
7

Zastanawiam się, czy ktoś kiedykolwiek próbował wyodrębnić/śledzić linki do pozycji RSS za pomocą SgmlLinkExtractor/CrawlSpider. Nie mogę zmusić go do pracy ...Scrapy - podążaj za linkami RSS

używam następującą regułę:

 

    rules = (
     Rule(SgmlLinkExtractor(tags=('link',), attrs=False), 
      follow=True, 
      callback='parse_article'), 
     ) 

(mając na uwadze, że linki rss znajdują się w łącza tag).

Nie jestem pewien, jak powiedzieć SgmlLinkExtractor wyodrębnić tekst() z link i nie szukać atrybuty ...

Każda pomoc jest mile widziana, góry dzięki

Odpowiedz

7

zasady CrawlSpider nie działa w ten sposób. Prawdopodobnie będziesz potrzebować podklasy BaseSpider i zaimplementować własne wyodrębnianie linków w swoim sprzężeniu zwrotnym pająka. Na przykład:

from scrapy.spider import BaseSpider 
from scrapy.http import Request 
from scrapy.selector import XmlXPathSelector 

class MySpider(BaseSpider): 
    name = 'myspider' 

    def parse(self, response): 
     xxs = XmlXPathSelector(response) 
     links = xxs.select("//link/text()").extract() 
     return [Request(x, callback=self.parse_link) for x in links] 

Można również spróbować XPath w skorupkach, uruchamiając na przykład:

scrapy shell http://blog.scrapy.org/rss.xml 

a następnie wpisując w powłoce:

>>> xxs.select("//link/text()").extract() 
[u'http://blog.scrapy.org', 
u'http://blog.scrapy.org/new-bugfix-release-0101', 
u'http://blog.scrapy.org/new-scrapy-blog-and-scrapy-010-release'] 
+0

mógłby pan wyjaśnić różnicę między pomocą reguł CrawlSpider i wdrożenie własnego wydobycia link na wywołanie zwrotne? Od pewnego czasu walczę o różnicę, a po kilku lekturach do doktora ... wciąż nic. Używam twojej metody ze względu na złe doświadczenia z używania reguł, ale chcę tylko wiedzieć, dlaczego. T.I.A – romeroqj

+1

Istnieje ['' 'XMLFeedSpider'''' (https://scrapy.readthedocs.org/en/latest/topics/spiders.html?highlight=rule#xmlfeedspider-example), którego można używać w dzisiejszych czasach. – opyate

0

Zrobiłem go przy użyciu CrawlSpider:

class MySpider(CrawlSpider): 
    domain_name = "xml.example.com" 

    def parse(self, response): 
     xxs = XmlXPathSelector(response) 
     items = xxs.select('//channel/item') 
     for i in items: 
      urli = i.select('link/text()').extract() 
      request = Request(url=urli[0], callback=self.parse1) 
      yield request 

    def parse1(self, response): 
     hxs = HtmlXPathSelector(response) 
     # ... 
     yield(MyItem()) 

, ale nie jestem pewien, czy jest to bardzo właściwe rozwiązanie ...

6

Istnieje jeden model, którego można używać w dzisiejszych czasach.

+0

Na dziś jest to lepsze rozwiązanie. +1 – Jon

-1

XML Przykład Od scrapy doc XMLFeedSpider

from scrapy.spiders import XMLFeedSpider 
from myproject.items import TestItem 

class MySpider(XMLFeedSpider): 
    name = 'example.com' 
    allowed_domains = ['example.com'] 
    start_urls = ['http://www.example.com/feed.xml'] 
    iterator = 'iternodes' # This is actually unnecessary, since it's the default value 
    itertag = 'item' 

    def parse_node(self, response, node): 
     self.logger.info('Hi, this is a <%s> node!: %s', self.itertag, ''.join(node.extract())) 

     #item = TestItem() 
     item = {} # change to dict for removing the class not found error 
     item['id'] = node.xpath('@id').extract() 
     item['name'] = node.xpath('name').extract() 
     item['description'] = node.xpath('description').extract() 
     return item