如何在scrapy蜘蛛中使用url的站点地图?

如何在scrapy蜘蛛中使用url的站点地图?

问题描述:

我想根据网页的sitemap.xml创建一个抓取网址的蜘蛛。所以我没有start_urls。我想确定使用sitemap.xml刮掉哪些网址。如何在scrapy蜘蛛中使用url的站点地图?

我曾考虑添加方法_parse_sitemap并使用requestslxml解析它,但它可能是一种矫枉过正。

是否有一些内置方法可以获得<loc>标签中的所有url?

我迄今所做的:

蜘蛛得到一个URL和meta = {'sitemap':True}如此分析方法知道它必须调用基于从地图网址有哪些_parse_sitemap小号yield对象Request

import scrapy 
from scrapy import Request 


class MainSpider(scrapy.Spider): 
    name = 'main_spider' 
    allowed_domains = ['www.example.com'] 
    sitemap = 'www.example.com/sitemap.xml' 
    start_urls = [sitemap] 

    def start_requests(self): 
     yield Request(url=self.sitemap,meta={'sitemap':True}) 

    def parse(self, response): 
     if response.meta.get('sitemap'): 
      self._parse_sitemap(response) 
     else: 
      # parse normal url 

    def _parse_sitemap(self, response): 
     # how to get urls? 
     urls = [] 
     for url in urls: 
      yield Request(url=url,callback=self.parse) 

这只是一个xml所以我觉得我不应该使用SitemapSpider。你有什么建议?正如你可以看到我不知道如何解析urls里面的_parse_sitemap蜘蛛。

+1

为什么你认为你不应该使用SitemapSpider,因为你只有一个文件?您的蜘蛛可能非常简单,就像来自文档的第一个示例:https://doc.scrapy.org/en/latest/topics/spiders.html#sitemapspider-examples – elacuesta

+0

您可以简单地使用SgmlLinkExtractor.It将给所有来自页面的链接。 使用下面从scrapy.contrib.spiders从scrapy.contrib.linkextractors.sgml进口SgmlLinkExtractor 进口 导入CrawlSpider,规则 添加以下行类,并指定你的回调函数,它将性反应的所有URL 规则= (Rule(SgmlLinkExtractor(),callback ='parse_url',follow = False)) –

您可以简单地使用SgmlLinkExtractor。它会给出页面上的所有链接。下面进口

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.contrib.spiders import CrawlSpider, Rule 

使用添加以下行类,并指定你的回调函数,它将性反应的所有URL

rules = (Rule(SgmlLinkExtractor(), callback='_parse_sitemap', follow=False),) 

由于SgmlLinkExtractor现在已经废弃,LxmlLinkExtractor应该被使用。有关它们之间的区别的更多信息,请参阅here