2010-05-30 90 views
7

我想知道是否有人试图用 SgmlLinkExtractor/CrawlSpider提取/关注RSS项链接。我无法得到它的工作...Scrapy - 关注RSS链接

我使用以下规则:

 

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

(记住具有RSS链接位于链接标签)。

我不知道如何告诉SgmlLinkExtractor提取的 文本()的链接,而不是搜索属性...

任何帮助是值得欢迎的, 在此先感谢

回答

7

CrawlSpider规则不要那样工作。您可能需要继承BaseSpider并在您的蜘蛛回调中实现您自己的链接提取。例如:

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] 

您也可以尝试在shell中的XPath,通过运行例如:

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

然后键入壳:

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

请你解释一下使用CrawlSpider规则和回调实现自定义链接提取的区别?我一直在努力寻找差异,并且在多次阅读文档之后...仍然没有任何结果。由于过去使用规则的不好经历,我会采用你的方法,但我只想知道原因。 T.I.A – romeroqj 2011-07-06 03:23:19

+1

现在可以使用['''XMLFeedSpider'''](https://scrapy.readthedocs.org/en/latest/topics/spiders.html?highlight=rule#xmlfeedspider-example)。 – opyate 2013-04-19 12:15:52

0

我已经做到了使用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()) 

但我不确定这是一个非常合适的解决方案...

6

有一个XMLFeedSpider现在可以使用。

+0

今天它是更好的解决方案。 +1 – Jon 2013-12-09 11:03:36

-1

XML实例从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