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
相关产品推荐
相关产品推荐

