Python 实战2:新浪新闻静态 + 动态数据采集与清洗全流程

张开发
2026/5/10 21:56:10 15 分钟阅读

分享文章

Python 实战2:新浪新闻静态 + 动态数据采集与清洗全流程
在大数据分析的工作中数据采集是一切的基础而实际的网页数据分为服务器端渲染的静态数据和接口动态加载的动态数据二者的采集思路和方法差异显著。本次以新浪新闻为采集对象用 Python 实现了单篇新闻静态正文 动态评论的全流程采集、解析、清洗与存储全程整合Requests、BeautifulSoup、re、Pandas等核心库下文分享完整的实现思路和代码细节。一、技术栈与采集对象说明1. 核心技术模块本次采集从请求、解析、存储到预处理各环节选用轻量且高效的 Python 库各司其职又相互配合请求模块Requests库模拟浏览器请求头支持会话保持适配静态页面和动态 API 请求解析模块BeautifulSoup4re正则前者解析结构化 HTML 提取静态内容后者匹配 JS 代码中的隐藏参数存储模块Pandas库将数据规整为 DataFrame一键导出 CSV/TXT 格式方便后续分析预处理模块Python 字符串方法 BeautifulSoup文本提取实现空白符、HTML 标签的快速清洗。2. 采集对象以新浪新闻news.sina.com.cn单篇新闻为目标拆分两类采集内容静态数据新闻标题、发布信息、正文内容服务器端渲染直接嵌入 HTML 源码动态数据新闻下方的用户评论通过独立 API 接口动态加载需解析请求参数和返回的 JSON 数据。二、静态新闻数据采集解析 HTML 源码静态数据的核心是获取 HTML 并精准提取结构化内容同时一个关键任务是从页面 JS 代码中提取动态评论 API 的调用参数为后续采集评论做准备。2.1 核心思路构造请求头User-Agent、Referer、Cookie用Requests获取新闻详情页 HTML用BeautifulSoup解析 HTML通过标签 / ID 选择器定位新闻标题、正文用正则表达式匹配页面 JS 代码提取调用评论 API 的核心参数channel、newsid。2.2 静态采集核心代码import requests import json import time import random import pandas as pd import re from bs4 import BeautifulSoup class SinaNewsRealScraper: 新浪新闻静态正文动态评论采集器 def __init__(self, news_url, cookie): self.news_url news_url self.session requests.Session() # 构造请求头模拟浏览器行为 self.session.headers.update({ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36, Cookie: cookie, Referer: https://news.sina.com.cn/ }) def scrape_static_info(self): 采集新闻静态信息提取标题、正文及评论API参数 print(f---开始采集新闻静态信息:{self.news_url}---) try: # 获取页面HTML response self.session.get(self.news_url, timeout20) response.raise_for_status() # 抛出请求异常 # 自动识别编码解决中文乱码 response.encoding response.apparent_encoding soup BeautifulSoup(response.text, lxml) # 提取新闻标题 title soup.find(h1, class_main-title).text.strip() # 提取新闻正文 article_body soup.find(div, idarticle) content \n.join([p.text.strip() for p in article_body.find_all(p)]) # 从JS代码中提取评论API的channel和newsid参数 script_text response.text channel_match re.search(rchannel: (\w), script_text) newsid_match re.search(rnewsid: (\w-[\w]), script_text) # 校验参数是否提取成功 if not (channel_match and newsid_match): print(错误:未能在页面源码中找到API所需的channel和newsid参数。) return None # 整理API参数和静态信息 api_params { channel: channel_match.group(1), newsid: newsid_match.group(1) } static_info { title: title, content: content, api_params: api_params } print(静态信息及API参数采集成功!) return static_info except requests.RequestException as e: print(f采集静态信息失败:{e}) return None except Exception as e: print(f解析静态信息或提取参数时失败:{e}) return None三、动态评论数据采集请求 API 接口新闻评论并非直接嵌入 HTML而是通过前端 JS 调用 API 接口动态加载因此核心是构造合法的 API 请求 URL分页获取 JSON 数据并解析。3.1 核心思路利用静态采集得到的channel和newsid拼接评论 API 的请求 URL循环修改page参数实现分页请求获取所有评论的 JSON 数据解析 JSON 数据提取评论用户名、发布时间、内容、地理位置等信息对评论内容做简单清洗规整为统一的字典格式。3.2 动态采集核心代码在上述SinaNewsRealScraper类中继续添加动态采集方法def scrape_dynamic_comments(self, api_params): 采集动态评论数据分页请求API接口 all_comments [] page 1 # 分页请求直到无新评论返回 while True: try: # 构造评论API请求URL新浪新闻评论API通用格式 comment_api fhttps://comment.sina.com.cn/page/info?version1formatjsonchannel{api_params[channel]}newsid{api_params[newsid]}page{page} response self.session.get(comment_api, timeout20) response.raise_for_status() comment_data json.loads(response.text) # 解析评论列表 cmnt_list comment_data.get(result, {}).get(data, {}).get(cmntlist, []) if not cmnt_list: print(f第{page}页无评论评论采集完成) break # 遍历评论清洗并整理数据 for cmnt in cmnt_list: comment { user_name: cmnt.get(nick, 匿名用户), location: cmnt.get(area, 未知地区), time: cmnt.get(time, ), content: cmnt.get(content, ).strip() # 去除空白符 } all_comments.append(comment) print(f第{page}页评论采集完成共{len(cmnt_list)}条) page 1 # 随机休眠避免请求过快被限制 time.sleep(random.uniform(0.5, 1.5)) except Exception as e: print(f第{page}页评论采集失败:{e}) break return all_comments四、数据清洗与存储规整并导出文件采集到的静态新闻信息和动态评论数据需要统一清洗并存储为易读、易分析的格式本次实现CSV结构化数据TXT纯文本双格式导出兼顾后续数据分析和人工查看。4.1 核心思路对采集数据做最终校验过滤空数据用Pandas将评论数据转为 DataFrame导出 CSV 文件方便后续 NLP 分析将新闻标题、正文与评论整合按固定格式写入 TXT 文件方便人工查看处理文件写入异常保证存储过程的稳定性。4.2 数据存储核心代码继续在类中添加保存方法并实现主调用逻辑def save_data(self, static_info, comments): 将采集数据保存为CSV评论和TXT新闻评论 if not static_info or not comments: print(无有效数据可保存) return print(\n---开始保存文件---) # 保存评论为CSV文件 try: df pd.DataFrame(comments) csv_filename sina_news_real.csv df.to_csv(csv_filename, indexFalse, encodingutf-8-sig) print(f评论数据已成功保存到{csv_filename}) except Exception as e: print(f保存CSV文件时出错:{e}) # 保存新闻评论为TXT文件 try: txt_filename sina_news_real.txt with open(txt_filename, w, encodingutf-8) as f: f.write(f新闻标题:{static_info[title]}\n) f.write(*40 \n) f.write(f新闻正文:\n{static_info[content]}\n\n) f.write(*40 \n) f.write(f用户评论共{len(comments)}条:\n) for comment in comments: f.write(f---\n用户:{comment[user_name]}({comment[location]})\n) f.write(f时间:{comment[time]}\n内容:{comment[content]}\n) print(f新闻及评论数据已成功保存到{txt_filename}) except Exception as e: print(f保存TXT文件时出错:{e}) # 主调用函数 if __name__ __main__: # 替换为目标新闻URL和自己的新浪Cookie NEWS_URL https://news.sina.com.cn/s/2025-06-15/doc-imyfkzsy8999912.shtml COOKIE 你的新浪Cookie值 # 初始化采集器并执行采集 scraper SinaNewsRealScraper(NEWS_URL, COOKIE) static_info scraper.scrape_static_info() if static_info: comments scraper.scrape_dynamic_comments(static_info[api_params]) scraper.save_data(static_info, comments) print(---整个采集流程执行完毕---)五、采集结果与分析本次以新浪新闻《多地出现蜱虫伤人事件严重可致死医生提醒》为采集目标最终实现了完整的数据采集数据量成功采集到新闻完整正文以及 48 条有效用户评论无缺失、无乱码文件输出生成新浪_news_real.csv和sina_news_real.txt两个文件CSV 文件包含评论用户名、地理位置、时间、内容四列结构化数据TXT 文件整合了新闻全文和评论格式清晰采集效率分页请求加随机休眠全程无请求被限制采集 存储耗时约 10 秒。从采集结果也能发现一个行业现象传统门户网站的用户互动数据量大幅减少这与社交媒体、垂直 APP 的兴起相关用户更倾向于在专属平台发表观点门户网站的流量和粘性呈下降趋势。六、关键问题解决与实战技巧本次采集的核心难点是从页面 JS 代码中提取评论 API 的隐藏参数这也是现代网页采集的常见痛点分享解决方法和实战技巧JS 参数提取将页面源码作为字符串用正则表达式匹配变量名: 值的固定模式注意添加r前缀避免 Python 转义精准捕获分组中的参数值请求头构造必须添加Cookie新浪评论需要登录态、Referer模拟主站跳转否则会被服务端拒绝请求编码处理使用response.apparent_encoding自动识别页面编码解决新浪新闻 GBK/UTF-8 混合的中文乱码问题反爬规避分页请求时添加随机休眠random.uniform避免请求频率过高被 IP 限制使用requests.Session()保持会话减少连接建立开销异常处理对请求、解析、文件写入全环节做异常捕获避免单个环节出错导致整个程序崩溃。七、应用前景与技术展望1. 实际应用前景本次采集的新闻正文和用户评论是舆情分析、热点事件追踪、公众观点挖掘的优质数据源对评论做情感分析可判断公众对热点事件的正面 / 负面 / 中立态度结合地理位置信息分析不同地区用户的关注重点对新闻正文和评论做关键词提取挖掘事件的核心讨论点。这些分析结果可应用于新闻传播学研究、市场营销、公共政策制定等领域。2. 技术优化与展望本次实现的是单篇新闻的采集后续可从以下方面优化实现规模化采集增加新闻列表爬取模块遍历新浪新闻栏目实现多新闻自动采集添加IP 代理池和Cookie 池解决大规模采集的反爬限制整合多进程 / 多线程提高批量采集的效率增加数据去重、关键词过滤等预处理功能提升数据质量将采集结果存入 MySQL/MongoDB 数据库替代本地文件支持大数据量存储。八、实战总结本次实战完成了从静态 HTML 解析到动态 API 请求的全流程网页采集核心收获有两点现代网页的数据来源是多样化的不能仅局限于 HTML 标签必须具备前端代码分析能力能从 JS、API 接口中找到数据线索Python 数据采集的核心是库的灵活组合和细节的把控请求头的构造、编码的处理、反爬的规避每一个细节都决定采集的成败。

更多文章