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

Python爬取多URL博客时如何分别统计文章及作者的词数

爬虫功能扩展修复方案

你遇到的问题核心有两点:一是原列表页嵌套循环抓取逻辑会导致字段交叉匹配错误,二是详情页抓取时没有为每篇文章单独存储统计结果,变量被循环覆盖所以只能拿到最后一条数据。以下是可直接运行的修复后完整代码:

import requests
import pandas as pd
import numpy as np
from time import sleep
from random import randint
from bs4 import BeautifulSoup

# 配置请求头降低反爬拦截概率
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"
}

# 定义爬取页数范围
pages = np.arange(1, 2)
# 总结果存储列表,每个元素对应一篇文章的7个字段
result = []

for page in pages:
    page_url = "https://www.bartonassociates.com/blog/tag/Infographics/p" + str(page) 
    sleep(randint(2,10))
    resp = requests.get(page_url, headers=HEADERS)
    resp.encoding = "utf-8"
    soup = BeautifulSoup(resp.content, 'html.parser')
     
    # 分别获取当前页所有的标题链接、分类、作者日期,三个列表长度一致、一一对应
    h4_list = soup.select("h4")
    h2_list = soup.select("h2")
    author_list = soup.find_all(class_="author")
    
    # 同步遍历三个列表,保证字段对应关系正确
    for h4, h2, author_tag in zip(h4_list, h2_list, author_list):
        # 提取5个基础字段
        blog_title = h4.get_text(strip=True)
        blog_link = h4.a["href"]
        blog_category = h2.get_text(strip=True)[11:]
        author_date = author_tag.get_text(strip=True).split("|")
        author = author_date[0].strip()
        publish_date = author_date[1].strip() if len(author_date)>=2 else ""
        
        # 请求详情页统计两个词数字段
        sleep(randint(1,3))
        detail_resp = requests.get(blog_link, headers=HEADERS)
        detail_resp.encoding = "utf-8"
        detail_soup = BeautifulSoup(detail_resp.content, 'html.parser')
        
        # 提取正文和作者简介内容,可根据实际网站结构调整选择器
        p_list = detail_soup.select("div.cf > p")
        if not p_list:
            desc_count = 0
            about_count = 0
        else:
            # 按网站默认结构:前面所有p为正文,最后一个p为作者简介
            desc_text = " ".join([p.get_text(strip=True) for p in p_list[:-1]])
            about_text = p_list[-1].get_text(strip=True)
            # 统计英文词数(按空格分割计数,要统计字符数可直接用len(text))
            desc_count = len(desc_text.split())
            about_count = len(about_text.split())
        
        # 合并所有字段存入结果集
        result.append({
            "作者": author,
            "发布日期": publish_date,
            "博客名称": blog_title,
            "文章链接": blog_link,
            "博客分类": blog_category,
            "正文描述词数": desc_count,
            "作者简介词数": about_count
        })

# 导出为CSV文件
df = pd.DataFrame(result)
df.to_csv("博客完整数据.csv", index=False, encoding="utf-8-sig")

关键修改说明

  • 取消原嵌套循环抓取逻辑,用zip同步遍历三类元素,完全避免字段匹配错乱
  • 不再单独存储链接列表,获取到单篇文章基础信息后立即请求对应详情页,统计完词数直接和基础字段绑定存储,从逻辑上避免映射错误
  • 每个详情页的统计结果直接写入总结果列表,不会出现变量被后续循环覆盖的问题
  • 新增空值判断逻辑,避免网站结构变动导致的运行报错
  • 最终导出的CSV文件直接包含全部7个字段,可直接做后续分析使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:36:01