Scrapy爬虫问题:爬取站点地图后提取页面内指定链接内容
解决方案
你的问题出在对SitemapSpider的sitemap_rules理解上——这个规则只用来匹配站点地图里的URL,分配对应的解析函数,没法处理从已爬页面里提取的新链接。要实现“爬取sitemap页面→提取指定链接→爬取该链接内容”的流程,得在第一个解析函数里主动生成新的请求,具体步骤如下:
1. 调整sitemap_rules
只保留匹配sitemap中URL的规则,去掉第二条规则,因为后续要爬的链接不在sitemap里:
class SiteSpider(SitemapSpider): name = 'site' allowed_domains = ['domain.fr'] sitemap_urls = ["https://domain.fr/mainsitemap.xml"] # 只处理sitemap里符合规则的URL,交给parse_step1解析 sitemap_rules = [('^.*\/([a-zA-Z]{2})\/\/?.*', 'parse_step1')]
2. 实现parse_step1提取指定链接并生成请求
在parse_step1里,用Scrapy的选择器(XPath/CSS)提取页面中的目标链接(比如你说的linkA),然后生成Request对象,指定回调函数为parse_step2:
def parse_step1(self, response): # 示例:用CSS选择器提取指定链接,根据实际页面结构调整选择器 # 比如linkA的class是"target-link",或者href包含特定关键词 target_links = response.css('a.target-link::attr(href)').getall() for link in target_links: # 拼接完整URL(如果提取的是相对路径) full_link = response.urljoin(link) # 生成请求,交给parse_step2处理 yield scrapy.Request(full_link, callback=self.parse_step2)
3. 实现parse_step2处理目标链接内容
在这个函数里提取你需要的内容即可:
def parse_step2(self, response): # 示例:提取页面标题和正文,根据实际需求调整 yield { 'title': response.css('h1::text').get(), 'content': response.css('div.content p::text').getall(), 'url': response.url }
关键说明
sitemap_rules仅作用于sitemap返回的URL,后续页面里的链接需要手动生成请求- 提取链接时要注意处理相对路径,用
response.urljoin()转换为绝对URL - 选择器(CSS/XPath)需要根据目标页面的实际HTML结构调整,确保能准确提取到目标链接
内容的提问来源于stack exchange,提问作者lilouch
相关产品推荐
相关产品推荐

