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
相关产品推荐
相关产品推荐

