如何在网页爬虫中对页面重复URL仅记录一次?
解决爬虫页面URL去重问题:同一URL仅记录一次
要实现爬虫爬取页面时,同一URL即使多次出现也只记录一次,最简洁高效的方式是利用Python的**集合(set)**特性——集合会自动过滤重复元素。以下是具体实现方案:
核心思路
- 爬取目标页面并解析HTML结构。
- 提取页面中所有目标URL。
- 将提取到的URL存入集合,集合会自动忽略重复项。
- 后续可将集合转为列表或直接处理集合内的唯一URL。
代码示例(基于requests + BeautifulSoup)
import requests from bs4 import BeautifulSoup # 目标页面URL target_page = "https://www.ig.com/uk/news-and-trade-ideas/" # 请求头模拟浏览器,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } # 获取页面内容并解析 response = requests.get(target_page, headers=headers) response.encoding = response.apparent_encoding soup = BeautifulSoup(response.text, "html.parser") # 初始化集合存储去重后的URL unique_article_urls = set() # 提取所有文章URL(需根据页面实际HTML结构调整选择器) # 示例:假设文章链接的a标签href包含"/news/"路径 for link in soup.select("a[href*='/news/']"): raw_url = link.get("href") # 处理相对URL,转换为绝对URL if raw_url.startswith("/"): full_url = f"https://www.ig.com{raw_url}" else: full_url = raw_url # 添加到集合,自动去重 unique_article_urls.add(full_url) # 输出结果 print(f"去重后共获取 {len(unique_article_urls)} 个唯一文章URL:") for url in unique_article_urls: print(url)
关键说明
- 选择器调整:代码中的
soup.select("a[href*='/news/']")是示例选择器,你需要根据目标页面的实际HTML结构修改(比如检查文章链接的a标签是否有特定class,如class="article-link",则选择器改为soup.select("a.article-link"))。 - 效率对比:集合去重的时间复杂度远低于列表判断(
if url not in list),当页面URL数量较多时,集合的优势更明显。 - 有序需求:如果需要保持URL的提取顺序,可以改用
dict.fromkeys()方法(Python 3.7+字典保持插入顺序):# 有序去重 ordered_unique_urls = list(dict.fromkeys(extracted_url_list))
内容的提问来源于stack exchange,提问作者Mark Leach
相关产品推荐
相关产品推荐

