7 Stimmen

Scrapy - RSS-Links folgen

Ich habe mich gefragt, ob jemand schon einmal versucht hat, RSS-Links zu extrahieren/zu verfolgen mit SgmlLinkExtractor/CrawlSpider zu extrahieren. Ich kann es nicht zum Laufen bringen...

Ich verwende die folgende Regel:

   rules = (
       Rule(SgmlLinkExtractor(tags=('link',), attrs=False),
           follow=True,
           callback='parse\_article'),
       )

(wobei zu beachten ist, dass die RSS-Links in der Link Tag).

Ich bin mir nicht sicher, wie ich SgmlLinkExtractor anweisen kann, den Text() des des Links zu extrahieren und nicht die Attribute zu durchsuchen ...

Jede Hilfe ist willkommen, Vielen Dank im Voraus

7voto

Pablo Hoffman Punkte 1533

Die CrawlSpider-Regeln funktionieren so nicht. Sie müssen wahrscheinlich BaseSpider subclass und implementieren Sie Ihre eigenen Link-Extraktion in Ihrem Spider Callback. Zum Beispiel:

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]

Sie können den XPath auch in der Shell ausprobieren, indem Sie zum Beispiel Folgendes ausführen

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

Und dann die Eingabe in der Shell:

>>> 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 Stimmen

Könnten Sie bitte den Unterschied zwischen der Verwendung von CrawlSpider-Regeln und der Implementierung einer benutzerdefinierten Link-Extraktion für den Rückruf erklären? Ich habe für eine Weile kämpfen, den Unterschied zu fangen, und nach mehreren Lesungen zu docs... immer noch nichts. Ich entscheide mich für Ihre Methode, weil ich in der Vergangenheit schlechte Erfahrungen mit Regeln gemacht habe, aber ich möchte einfach genau wissen, warum. T.I.A.

1 Stimmen

Es gibt eine XMLFeedSpider die man heutzutage verwenden kann.

6voto

opyate Punkte 5279

Es gibt eine XMLFeedSpider die man heutzutage verwenden kann.

0 Stimmen

Für heute ist das die bessere Lösung. +1

0voto

pour toi Punkte 1006

Ich habe es mit CrawlSpider gemacht:

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())

aber ich bin mir nicht sicher, ob das eine sehr gute Lösung ist...

-2voto

NGloom Punkte 388

XML Beispiel aus 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X