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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在scrapy蜘蛛中使用url的站点地图?相关的知识,希望对你有一定的参考价值。

我想根据网页的sitemap.xml创建一个抓取网址的蜘蛛。所以我没有start_urls。我想确定使用sitemap.xml刮哪些网址。

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

是否有一些内置的方法来获取<loc>标签内的所有网址?

到目前为止我做了什么:

蜘蛛得到一个网址和meta = {'sitemap':True}所以解析方法知道它必须根据站点地图的网址调用_parse_sitemap yields 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

答案

您只需使用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

以上是关于如何在scrapy蜘蛛中使用url的站点地图?的主要内容,如果未能解决你的问题,请参考以下文章

Scrapy - 如何启动同一个蜘蛛进程的多个实例?

如何在我的 Scrapy 蜘蛛代码中使用项目加载器?

如何将 URL 提供给 scrapy 进行抓取?

在 Celery 任务中运行 Scrapy 蜘蛛

制作scrapy蜘蛛跟随给定起始URL的链接

Scrapy 从站点下载 json 文件?