如何在scrapy蜘蛛中使用url的站点地图?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在scrapy蜘蛛中使用url的站点地图?相关的知识,希望对你有一定的参考价值。
我想根据网页的sitemap.xml
创建一个抓取网址的蜘蛛。所以我没有start_urls
。我想确定使用sitemap.xml
刮哪些网址。
我想添加一个方法_parse_sitemap
并使用requests
和lxml
解析它,但它可能是一个矫枉过正。
是否有一些内置的方法来获取<loc>
标签内的所有网址?
到目前为止我做了什么:
蜘蛛得到一个网址和meta = {'sitemap':True}
所以解析方法知道它必须根据站点地图的网址调用_parse_sitemap
yield
s 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的站点地图?的主要内容,如果未能解决你的问题,请参考以下文章