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

Scrapy爬虫提取页面链接时如何过滤指定无关URL

Scrapy爬虫过滤无关提取链接方案

基础场景说明

  • 技术栈:Python + Scrapy框架
  • 目标爬取页面:https://www.ifep.ro/justice/lawyers/lawyerspanel.aspx
  • 现有逻辑:通过XPath//div[@class='list-group']//@href提取对应div下所有链接,混入了不需要的站外无关URL,需要做过滤处理。

现有原始爬虫代码

import scrapy
from scrapy.http import Request

class TestSpider(scrapy.Spider):
    name = 'test'
    start_urls = ['https://www.ifep.ro/justice/lawyers/lawyerspanel.aspx']
    custom_settings = {
        'CONCURRENT_REQUESTS_PER_DOMAIN': 1,
        'DOWNLOAD_DELAY': 1,
        'USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
    }

    def parse(self, response):
        books = response.xpath("//div[@class='list-group']//@href").extract()
        for book in books:
            url = response.urljoin(book)
            print(url)

待过滤的无关URL列表

http://www.unbr.ro
http://www.inppa.ro
http://www.uniuneanotarilor.ro/
http://www.caav.ro
http://www.executori.ro/
http://www.csm1909.ro
http://www.inm-lex.ro
http://www.just.ro

具体实现方法

方法1:集合匹配过滤(适配明确知道待排除URL的场景)

先把待过滤的URL做归一化处理(统一去掉末尾斜杠,避免因为格式差异漏判),遍历提取到的链接时,同样做归一化后和排除集合比对,不在集合内的链接才保留。
修改后的parse方法代码如下:

def parse(self, response):
    # 定义待排除的URL集合,提前统一去掉末尾斜杠做归一化
    exclude_urls = {
        'http://www.unbr.ro',
        'http://www.inppa.ro',
        'http://www.uniuneanotarilor.ro',
        'http://www.caav.ro',
        'http://www.executori.ro',
        'http://www.csm1909.ro',
        'http://www.inm-lex.ro',
        'http://www.just.ro'
    }
    raw_links = response.xpath("//div[@class='list-group']//@href").extract()
    for raw_link in raw_links:
        url = response.urljoin(raw_link)
        # 对当前链接做同样的归一化处理:去掉末尾斜杠
        normalized_url = url.rstrip('/')
        if normalized_url not in exclude_urls:
            # 此处替换为后续爬取逻辑,比如发起请求、yield数据等
            print(url)

方法2:优化XPath从根源过滤(更通用,避免后续新增无关链接漏过滤)

观察页面结构可以发现,需要爬取的律师详情链接都是当前站点同路径下的详情页,无关链接都是跳转到外部域名的友链,可以直接优化XPath规则,只提取指向律师详情页的链接,不需要后续手动过滤:

  • 律师详情链接都带有Person.aspx?路径特征,XPath可以直接限定提取符合该特征的链接
    修改后的代码如下:
def parse(self, response):
    # 直接提取带Person.aspx特征的律师详情链接,从源头排除站外友链
    raw_links = response.xpath("//div[@class='list-group']//a[contains(@href, 'Person.aspx')]/@href").extract()
    for raw_link in raw_links:
        url = response.urljoin(raw_link)
        print(url)

两种方法可以叠加使用,优先用精准XPath缩小提取范围,再配合集合过滤兜底,能完全避免无关链接进入后续爬取流程。

内容的提问来源于stack exchange,提问作者Amen Aziz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:06:21