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

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:独立列表存储导致索引错位
    你把博客基础信息和作者日期存在两个独立列表里,一旦某页抓取异常、两个列表长度不一致,后续所有记录的对应关系都会错位,也可能出现看起来重复的异常数据。
修复建议
  1. 修正元素遍历逻辑,不要嵌套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))
  1. 可以新增翻页终止判断:如果当前页没有抓取到任何博客内容,就提前终止该分类的翻页逻辑,不用硬跑完17页。
  2. 建议把两个列表合并成一个存储结构,比如字典或者包含所有字段的元组,避免索引错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:15:03