Python网页爬取写入CSV时重复数据问题排查求助
爬取博客文章URL时重复数据的问题排查与解决
嘿,作为爬虫新手遇到重复数据太正常啦,我帮你分析下可能的问题,再给你调整方案:
先看你的代码问题点
首先从你给出的代码片段,能看出几个导致重复数据的核心原因:
文件追加模式的坑
你用了open('test.csv', 'a+', newline='')的a+模式,这个模式是追加写入——每次运行脚本,新爬的内容会加到文件末尾,之前的旧数据不会被清空。如果多次运行代码,自然会堆积大量重复URL。没有去重机制
哪怕单次运行,页面里可能存在重复的qbutton类链接(比如同一篇文章的按钮在首页多个位置出现),或者后续加翻页逻辑时不小心重复爬了同一页面,都会导致重复写入。潜在的翻页重复风险
如果后续要加翻页代码,要是没记录已经爬过的页面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
相关产品推荐
相关产品推荐

