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

问题描述 投票:0回答:2

我想根据网页的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

xml scrapy web-crawler screen-scraping sitemap
2个回答
0
投票

您只需使用SgmlLinkExtractor即可。它将从页面中提供所有链接。

使用以下进口

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

在类中添加以下行并指定您在回调函数中,它将响应所有URL

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

0
投票

由于SgmlLinkExtractor现已弃用,因此应使用LxmlLinkExtractor。有关它们之间差异的更多信息,请参阅here

© www.soinside.com 2019 - 2024. All rights reserved.