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

Python网页爬取写入CSV时重复数据问题排查求助

爬取博客文章URL时重复数据的问题排查与解决

嘿,作为爬虫新手遇到重复数据太正常啦,我帮你分析下可能的问题,再给你调整方案:

先看你的代码问题点

首先从你给出的代码片段,能看出几个导致重复数据的核心原因:

  1. 文件追加模式的坑
    你用了open('test.csv', 'a+', newline='')的a+模式,这个模式是追加写入——每次运行脚本,新爬的内容会加到文件末尾,之前的旧数据不会被清空。如果多次运行代码,自然会堆积大量重复URL。

  2. 没有去重机制
    哪怕单次运行,页面里可能存在重复的qbutton类链接(比如同一篇文章的按钮在首页多个位置出现),或者后续加翻页逻辑时不小心重复爬了同一页面,都会导致重复写入。

  3. 潜在的翻页重复风险
    如果后续要加翻页代码,要是没记录已经爬过的页面URL,很可能会循环爬同一页,反复写入相同的文章链接。

给你调整后的代码方案

我把去重逻辑、文件模式都优化了,还加了基础的翻页逻辑(你可以根据网站实际翻页元素调整):

import requests
from bs4 import BeautifulSoup
import csv

startURL = 'http://esencjablog.pl/'
# 用集合存已爬取的URL,集合自带去重特性,比列表效率更高
crawled_urls = set()

# 用'w'模式打开文件,每次运行都会清空旧内容重新写入
with open('test.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['adres'])

    def parse_page(url):
        # 先检查这个页面有没有爬过,爬过就直接返回
        if url in crawled_urls:
            return
        crawled_urls.add(url)
        
        try:
            # 加异常处理,避免请求失败直接中断程序
            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(url, headers=headers, timeout=10)
            response.raise_for_status()
            soup = BeautifulSoup(response.text, 'lxml')
        except Exception as e:
            print(f"爬取{url}失败: {e}")
            return

        # 提取文章链接,先检查是否已存在再写入
        for a_tag in soup.find_all('a', {'class': 'qbutton'}):
            article_url = a_tag.get('href')
            if article_url and article_url not in crawled_urls:
                crawled_urls.add(article_url)
                writer.writerow([article_url])
                print(f"已写入: {article_url}")
        
        # 处理翻页,你需要根据网站实际的翻页按钮调整选择器
        next_page_tag = soup.find('a', text='Następna strona')  # 假设翻页按钮文字是这个
        if next_page_tag:
            next_page_url = next_page_tag.get('href')
            if next_page_url:
                parse_page(next_page_url)

    # 启动爬取
    parse_page(startURL)

额外小贴士

  • 记得先查看网站的robots.txt,确认允许爬取的内容,避免违规。
  • 给请求加User-Agent头是个好习惯,能模拟浏览器请求,降低被反爬拦截的概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:17:09