Python爬虫抓取站点博客数据出现重复记录问题求助
代码问题分析
- 核心问题1:h4与h2的嵌套遍历逻辑错误
你写了两层循环,先遍历页面所有h4标签,每个h4都再遍历页面所有h2标签做拼接。假设单页有10篇博客对应10个h4和10个h2,这个逻辑会生成10*10=100条记录,其中90条都是错误的重复拼接结果,这是数据重复的最主要原因。 - 问题2:跨分类的博客重复收录
同一篇博客可能被打上多个标签、属于多个分类,按全分类爬取时自然会多次抓取到同一篇内容,你的代码没有加去重判断。 - 问题3:页码范围设置错误
np.arange(1)生成的是数组[0],拼接出来的页码是/p0,站点第一页一般是/p1,会请求到错误页或者和/p1内容重复;如果写np.arange(1,17)生成的是1到16的整数,最多只能爬到第16页,要覆盖17页需要改成np.arange(1, 18)。 - 问题4:独立列表存储导致索引错位
你把博客基础信息和作者日期存在两个独立列表里,一旦某页抓取异常、两个列表长度不一致,后续所有记录的对应关系都会错位,也可能出现看起来重复的异常数据。
修复建议
- 修正元素遍历逻辑,不要嵌套h4和h2的循环,先定位到每篇博客的父元素,再分别取对应字段,参考代码:
# 提前初始化去重集合,用博客唯一链接做去重依据 crawled_links = set() # 遍历每篇博客的父容器,替换.post为站点实际的父元素class for post in soup.select(".post"): h4 = post.select_one("h4") h2 = post.select_one("h2") author = post.select_one(".author") if h4 and h4.a and h2 and author: blog_link = h4.a["href"] # 已爬取过的链接直接跳过 if blog_link not in crawled_links: crawled_links.add(blog_link) title_blognames_links_.append((h4.get_text(strip=True), blog_link, h2.get_text(strip=True).replace('"',"")[11:])) author_and_dates_.append(author.get_text(strip=True))
- 可以新增翻页终止判断:如果当前页没有抓取到任何博客内容,就提前终止该分类的翻页逻辑,不用硬跑完17页。
- 建议把两个列表合并成一个存储结构,比如字典或者包含所有字段的元组,避免索引错位。
内容的提问来源于stack exchange,提问作者Swas
相关产品推荐
相关产品推荐

