Scrapy - 跟踪RSS链接

7 投票
4 回答
5590 浏览
提问于 2025-04-15 23:20

我在想有没有人尝试过用 SgmlLinkExtractor 或 CrawlSpider 来提取或跟踪 RSS 项目的链接。我一直没能成功...

我使用的规则是:


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

(我知道 RSS 链接是在 link 标签里面的)。

我不太确定怎么告诉 SgmlLinkExtractor 去提取链接的文本,而不是去找属性...

任何帮助都很欢迎,提前谢谢大家!

4 个回答

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 的工具可以使用。

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]

你也可以在命令行中尝试使用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']

撰写回答