Python Scrapy-Follow RSS链接

Python Scrapy-Follow RSS链接,python,web-crawler,scrapy,Python,Web Crawler,Scrapy,我想知道是否有人尝试过使用 SGMLLinkedExtractor/爬行爬行器。我不能让它工作 我使用以下规则: rules = ( Rule(SgmlLinkExtractor(tags=('link',), attrs=False), follow=True, callback='parse_article'), ) 规则=( 规则(SgmlLinkExtractor(标记=('link',),attrs=False),

我想知道是否有人尝试过使用 SGMLLinkedExtractor/爬行爬行器。我不能让它工作

我使用以下规则:

rules = ( Rule(SgmlLinkExtractor(tags=('link',), attrs=False), follow=True, callback='parse_article'), ) 规则=( 规则(SgmlLinkExtractor(标记=('link',),attrs=False), follow=True, callback='parse_article'), ) (请记住,rss链接位于链接标签中)

我不知道如何告诉SGMLLinkedExtractor提取 链接,而不是搜索属性

欢迎任何帮助,
提前感谢

爬行蜘蛛规则不是这样的。您可能需要将BaseSpider子类化,并在spider回调中实现自己的链接提取。例如:

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]
scrapy shell http://blog.scrapy.org/rss.xml
您还可以在shell中尝试XPath,例如:

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]
scrapy shell http://blog.scrapy.org/rss.xml
然后在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']

我已经用爬行蜘蛛完成了:

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

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

现在有一个可以使用。

来自scrapy doc的XML示例

从scrapy.spider导入XMLFeedSpider
从myproject.items导入测试项
类MySpider(XMLFeedSpider):
name='example.com'
允许的_域=['example.com']
起始URL=['http://www.example.com/feed.xml']
迭代器='iternodes'#这实际上是不必要的,因为它是默认值
itertag='item'
def parse_节点(自身、响应、节点):
self.logger.info('您好,这是一个节点!:%s',self.itertag',.join(node.extract()))
#item=TestItem()
item={}#更改为dict以删除未找到的类错误
item['id']=node.xpath('@id').extract()
项['name']=node.xpath('name').extract()
项['description']=node.xpath('description').extract()
退货项目

您能解释一下使用爬行蜘蛛规则和在回调上实现自定义链接提取之间的区别吗?我已经挣扎了一段时间,在阅读了几篇文档之后。。。还是没什么。我之所以选择你的方法,是因为我过去在使用规则方面有过不好的经验,但我只想知道确切的原因。T.I.A现在有一个可以使用的。因为今天它是更好的解决方案+1.