当前位置: 首页 > news >正文

实战:Python爬取东方财富股吧财经新闻与动态评论(附完整代码)

1. 环境准备与工具选择

做爬虫项目前,选对工具相当于厨师选好了菜刀。我推荐用Python 3.8+版本,主要依赖这几个库:

  • requests:比urllib更人性化的网络请求库
  • BeautifulSoup:HTML解析神器
  • lxml:XPath解析必备
  • openpyxl:处理Excel文件

安装这些库特别简单,一行命令搞定:

pip install requests beautifulsoup4 lxml openpyxl

新手常犯的错误是直接上手写代码,结果被反爬机制按在地上摩擦。建议先准备好这些防封杀装备:

  1. 随机User-Agent池(至少准备10个不同浏览器标识)
  2. 代理IP池(免费的可试试快代理、站大爷)
  3. 请求间隔随机化(1-3秒比较安全)

2. 静态页面抓取实战

东方财富股吧的新闻列表页是典型的分页结构,URL规律很明显:

http://guba.eastmoney.com/list,股票代码,1,f_页码.html

比如贵州茅台(600519)的第2页:

base_url = "http://guba.eastmoney.com/list,600519,1,f_{}.html"

抓取标题和阅读量的核心代码:

def parse_news_list(html): soup = BeautifulSoup(html, 'html.parser') titles = [a['title'] for a in soup.select('.l3.a3 a')] reads = [span.text for span in soup.select('.l1.a1 span')] return list(zip(titles, reads))

这里有个坑要注意:东方财富的阅读量数据有时候会藏在>reads = [span['data-read'] for span in soup.select('.l1.a1 span')]

3. 动态评论抓取技巧

动态内容才是真正的挑战。通过Chrome开发者工具(F12),我发现了评论数据的API接口:

http://guba.eastmoney.com/interface/GetData.aspx

关键参数是postid,这个ID藏在新闻详情页的URL里。比如这个链接:

https://guba.eastmoney.com/news,600519,123456789.html

其中的123456789就是postid。

模拟请求的代码示例:

def get_comments(postid): url = 'http://guba.eastmoney.com/interface/GetData.aspx' headers = { 'Referer': f'https://guba.eastmoney.com/news,600519,{postid}.html', 'User-Agent': 'Mozilla/5.0...' } data = { 'param': f'postid={postid}&sort=1&sorttype=1&p=1&ps=50', 'path': 'reply/api/Reply/ArticleNewReplyList', 'env': '2' } response = requests.post(url, headers=headers, data=data) return response.json()['re'] # 返回评论列表

4. 反爬策略实战心得

我连续抓取50页后被封IP的经历告诉大家,这些防护措施必须做:

  1. 随机延时:别用固定间隔
from random import uniform sleep(uniform(1.5, 3)) # 1.5-3秒随机间隔
  1. 请求头伪装:特别是Cookie和Referer
headers = { 'User-Agent': random.choice(user_agents), 'Referer': random.choice(referers), 'X-Requested-With': 'XMLHttpRequest' }
  1. 异常处理:遇到429状态码立即暂停
try: response = requests.get(url, timeout=10) if response.status_code == 429: print("触发反爬!等待5分钟...") sleep(300) except Exception as e: print(f"请求失败:{str(e)}")

5. 数据存储优化方案

原始代码用Excel存储,当数据量超过1万条时会变得很卡。我推荐三种进阶方案:

  1. CSV分批存储:每1000条存一个文件
import csv def save_to_csv(data, filename): with open(filename, 'a', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(data.values())
  1. MySQL存储:适合长期积累数据
import pymysql conn = pymysql.connect(host='localhost', user='root', password='123456', database='guba') cursor = conn.cursor() sql = "INSERT INTO news(title,read_count) VALUES(%s,%s)" cursor.execute(sql, ('茅台股价创新高', '10000')) conn.commit()
  1. MongoDB存储:处理非结构化评论更方便
from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') db = client['guba'] db.comments.insert_one({ 'postid': '123456', 'content': '茅台永远的神!', 'like': 15 })

6. 完整代码示例

把上述技巧整合后的完整流程:

import requests from bs4 import BeautifulSoup from time import sleep from random import uniform, choice import csv user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit...', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...' ] def crawl_stock_news(stock_code, max_page=10): base_url = f"http://guba.eastmoney.com/list,{stock_code},1,f_" with open('result.csv', 'w', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['标题', '阅读量', '评论数']) for page in range(1, max_page+1): sleep(uniform(1, 3)) url = base_url + str(page) + '.html' try: html = requests.get(url, headers={'User-Agent': choice(user_agents)}).text soup = BeautifulSoup(html, 'html.parser') # 解析新闻列表 news_items = soup.select('.articleh') for item in news_items: title = item.select('.l3 a')[0]['title'] read = item.select('.l1')[0].text comment = item.select('.l2')[0].text writer.writerow([title, read, comment]) except Exception as e: print(f"第{page}页抓取出错:{str(e)}") continue

7. 常见问题解决方案

问题1:返回数据乱码

  • 解决方法:强制指定编码
response.encoding = 'utf-8' # 或者 response.apparent_encoding

问题2:动态加载内容缺失

  • 解决方案:用Selenium模拟浏览器
from selenium import webdriver driver = webdriver.Chrome() driver.get(url) html = driver.page_source

问题3:验证码拦截

  • 应对策略:
  1. 降低采集频率
  2. 使用打码平台(如超级鹰)
  3. 保存Cookies维持会话

最后提醒:爬虫要遵守robots.txt规则,控制请求频率,建议在非交易时段(如凌晨)运行采集任务。完整项目代码我已经上传到GitHub,包含异常处理、日志记录等工业级实现,需要的话可以私信我获取

http://www.jsqmd.com/news/1190712/

相关文章:

  • MATLAB弹道仿真GUI:内置三种比例导引律,实时绘出轨迹、视线角、过载与视线转率曲线
  • 解锁完整游戏体验:KK-HF Patch全面指南与最佳实践
  • 热图进阶:巧用ComplexHeatmap实现关键基因的精准标注与高亮
  • 跳转汇编指令解读
  • 3分钟终极指南:免费解锁Microsoft 365完整功能的简单方法
  • 2026年台州专业打合伙纠纷的律师有哪些 - 品牌排行榜
  • 模板驱动型文档自动化:企业级结构化文档生成原理与实践
  • Kimi LeetCode 3563. 移除相邻字符后字典序最小的字符串 Rust实现
  • 探究-Java字符串比较:从==与equals的误区到字符串常量池的深度解析
  • Rust 为 Python 补位:CPU密集、高并发、内存敏感与系统级扩展四大场景
  • 大学物理C:从真题拆解到核心概念贯通【个人学习笔记】【欢迎探讨指正】
  • (2026最新)南充防水补漏本地人必选的正规靠谱公司推荐-房屋漏水检测维修师傅上门-卫生间/厨房/阳台/房顶/外墙漏水检测精准测漏 - 即刻修防水
  • 2026年金相仪器品牌推荐榜:金相切割机/镶嵌机/研磨抛光机/显微镜源头厂家实力解析与选购指南 - 甄选服务推荐
  • STM32F407驱动HC-SR04实现厘米级超声波测距的Keil工程源码
  • ggplot2条形图原理精讲:geom_bar与geom_col的本质区别
  • (2026最新)南昌防水补漏本地人必选的正规靠谱公司推荐-房屋漏水检测维修师傅上门-卫生间/厨房/阳台/房顶/外墙漏水检测精准测漏 - 即刻修防水
  • WPF应用启动性能优化与启动画面实践
  • Matplotlib安装全攻略:从新手到专家的环境搭建指南
  • 基于STM32F103和AD9851的可调波形信号发生器工程包(含LCD菜单、DAC输出与完整驱动)
  • (2026最新)南充漏水检测维修师傅上门-正规防水补漏公司本地居民实测推荐五家-卫生间/屋顶/厨房/阳台/外墙/地下室专业仪器精准检测漏水点 - 安佳防水
  • 黄金分割法:从数学之美到工程优化的实战解析
  • 终极指南:基于真实充电数据的电动汽车电池健康度预测
  • Rerank 为什么重要?RAG 不只是把 TopK 塞给模型
  • 2026 年现阶段四子王旗值得关注的中厚板切割厂家哪家强,千万别让这玩意儿毁了你的预算,内行人揭秘省钱门道。 - 行业甄选官
  • Matlab(R2014a版本)一阶、二阶系统响应:从极点分布到系统稳定性实战解析
  • 2026年衢州市防油汉堡盒源头厂家综合体验测评 - 热点品牌推荐
  • 亲身探访北京泰格豪雅官方售后服务中心|官方电话及详细网点地址(2026年7月最新) - 亨得利官方服务中心
  • 数据挖掘-实战解析(二)基于多算法对比的乳腺癌数据聚类评估与优化
  • AI研发中的优化陷阱:当目标函数掩盖了真实问题
  • 从零到一:基于T265与PX4的无人机室内VIO自主飞行系统搭建全攻略