You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:06:18