如何在scrapy蜘蛛中使用url的站点地图?
问题描述:
我想根据网页的sitemap.xml
创建一个抓取网址的蜘蛛。所以我没有start_urls
。我想确定使用sitemap.xml
刮掉哪些网址。如何在scrapy蜘蛛中使用url的站点地图?
我曾考虑添加方法_parse_sitemap
并使用requests
和lxml
解析它,但它可能是一种矫枉过正。
是否有一些内置方法可以获得<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
蜘蛛。
答
您可以简单地使用SgmlLinkExtractor。它会给出页面上的所有链接。下面进口
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
使用添加以下行类,并指定你的回调函数,它将性反应的所有URL
rules = (Rule(SgmlLinkExtractor(), callback='_parse_sitemap', follow=False),)
为什么你认为你不应该使用SitemapSpider,因为你只有一个文件?您的蜘蛛可能非常简单,就像来自文档的第一个示例:https://doc.scrapy.org/en/latest/topics/spiders.html#sitemapspider-examples – elacuesta
您可以简单地使用SgmlLinkExtractor.It将给所有来自页面的链接。 使用下面从scrapy.contrib.spiders从scrapy.contrib.linkextractors.sgml进口SgmlLinkExtractor 进口 导入CrawlSpider,规则 添加以下行类,并指定你的回调函数,它将性反应的所有URL 规则= (Rule(SgmlLinkExtractor(),callback ='parse_url',follow = False)) –