最近一段时间没有见面,期间我深入学习了一些新的技术内容,今天特地整理出来与大家分享。
对于编程初学者而言,掌握网络爬虫技术能够有效提升从互联网中获取公开数据的能力。以股吧这类股民聚集交流的平台为例,其中包含大量关于股票讨论的信息,具备较高的数据分析潜力。本文将以东方财富网股吧为案例,结合 requests 库(用于发送HTTP请求)和 Beautiful Soup(用于解析HTML页面),逐步演示如何实现网页数据的抓取。同时,重点介绍浏览器伪装以及基础的反反爬策略,帮助构建更稳定、合规的爬虫程序。
环境配置准备
在开始编码之前,首先需要确保相关依赖库已正确安装。
1. 安装必要库文件
若尚未安装核心工具包,请执行以下命令进行安装:
pip install requests beautifulsoup4
该命令将安装 requests 用于发起网络请求,以及 beautifulsoup4 用于解析返回的HTML内容。
2. 目标网站说明
本次实践选取的是东方财富网股吧中的沪深A股板块,示例地址为:
https://guba.eastmoney.com/list,zssh000001.html
主要爬取的数据包括:帖子标题、发布作者、发布时间、浏览次数等公开可见信息。
- 网站特点:页面结构相对静态,关键数据直接嵌入HTML源码中,适合使用 Beautiful Soup 进行解析;
- 合规提示:本操作仅限学习用途,禁止高频访问或尝试获取非公开内容,应遵守目标网站的
robots.txt协议。
技术原理概述
整个爬虫流程基于以下几个核心组件协同工作:
- requests 模块:模拟浏览器行为,向服务器发起HTTP GET请求,并获取响应的原始HTML内容;
- Beautiful Soup 模块:对获取到的HTML文本进行解析,通过标签名、类名等定位方式提取所需字段;
- 请求头伪装技术:设置合理的请求头参数(如 User-Agent、Referer 等),使服务器难以识别为自动化脚本,从而降低被拦截的风险。
完整代码实现(附详细注释)
import requests
from bs4 import BeautifulSoup
import time
def crawl_guba_data(page=1):
# 1. 构造目标URL(页码动态拼接)
url = f"https://guba.eastmoney.com/list,zssh000001_{page}.html"
# 2. 设置请求头,模拟真实浏览器访问(关键防检测手段)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Referer": "https://guba.eastmoney.com/",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Cookie": "你的浏览器Cookie(可在股吧页面F12→Network→Headers中复制)"
}
try:
# 3. 发起GET请求,添加超时控制与SSL证书忽略选项
response = requests.get(
url=url,
headers=headers,
timeout=10,
verify=False
)
# 4. 判断响应状态是否成功
if response.status_code != 200:
print(f"请求失败,状态码:{response.status_code}")
return None
# 5. 使用lxml解析器处理HTML内容
soup = BeautifulSoup(response.text, "lxml")
# 6. 定位所有帖子容器(根据实际DOM结构调整)
post_list = soup.find_all("div", class_="articleh")
crawl_result = []
for post in post_list:
# 跳过广告类条目(通常带有ads标识)
if "ads" in post.get("class", []):
continue
# 提取标题链接元素
title_tag = post.find("a", class_="l3 a3")
以上代码实现了基本的页面请求与数据提取框架,后续可根据需求扩展数据清洗、存储至数据库或CSV文件等功能。注意在实际运行时应合理控制请求频率,建议加入随机延时(如 time.sleep())避免触发服务器防护机制。
# 提取标题和链接(通过查找包含标题的 a 标签)
title_tag = post.find("a", class_="l3 a3")
title = title_tag.get_text(strip=True) if title_tag else "无标题"
post_url = "https://guba.eastmoney.com" + title_tag["href"] if title_tag else ""
# 获取作者信息(对应 class 为 "l4 a4" 的 a 标签)
author = post.find("a", class_="l4 a4").get_text(strip=True) if post.find("a", class_="l4 a4") else "匿名"
# 提取发布时间(定位 class 为 "l5 a5" 的 span 元素)
publish_time = post.find("span", class_="l5 a5").get_text(strip=True) if post.find("span", class_="l5 a5") else "无时间"
# 抓取浏览量数据(class 属性为 "l2 a2" 的 span 标签)
view_count = post.find("span", class_="l2 a2").get_text(strip=True) if post.find("span", class_="l2 a2") else "0"
# 汇总单条记录
crawl_result.append({
"标题": title,
"作者": author,
"发布时间": publish_time,
"浏览量": view_count,
"帖子链接": post_url
})
return crawl_result
except Exception as e:
print(f"爬取异常:{str(e)}")
return None
# 主程序入口:实现多页数据采集
if __name__ == "__main__":
total_pages = 3 # 设定需抓取的页数
all_data = []
for page in range(1, total_pages + 1):
print(f"正在爬取第{page}页...")
page_data = crawl_guba_data(page=page)
if page_data:
all_data.extend(page_data)
# 反反爬机制:添加请求延迟,防止IP被封禁(建议间隔1-3秒)
time.sleep(2)
# 输出最终采集结果
print(f"\n共爬取到{len(all_data)}条帖子数据:")
for idx, data in enumerate(all_data, 1):
print(f"\n{idx}. 标题:{data['标题']}")
print(f" 作者:{data['作者']}")
print(f" 发布时间:{data['发布时间']}")
print(f" 浏览量:{data['浏览量']}")
print(f" 链接:{data['帖子链接']}")
四、关键技术点详解
1. 模拟浏览器行为(核心反反爬手段)
服务器通常依据 User-Agent 判断请求来源。若未设置该字段,请求极易被识别为自动化脚本并遭到拦截。
- 获取真实 UA:在浏览器中打开目标页面 → 按下 F12 打开开发者工具 → 进入 Network 面板 → 刷新页面 → 点击任意网络请求 → 在 Headers 中找到 User-Agent 并复制;
- 增强请求头真实性:除 User-Agent 外,添加 Referer(标识请求来源页面)和 Cookie(维持登录状态模拟)可显著降低被检测风险。
2. 页面解析逻辑说明
使用 Beautiful Soup 进行HTML解析时,精准定位目标元素是关键步骤:
- 打开股吧网页,按下 F12 启用开发者工具;
- 点击「元素选择」图标(通常位于左上角),然后用鼠标点击所需内容(例如某篇帖子的标题);
- 右侧将高亮显示对应的 HTML 结构,记录其标签名(如 div、a)及 class 属性值(如 articleh、l3 a3);
- 利用 soup.find() 获取单一节点,或使用 soup.find_all() 提取多个匹配项。
3. 基础反反爬策略
- 请求间隔控制:通过 time.sleep(2) 设置每次请求间暂停2秒,避免高频访问触发防护机制;
- 忽略SSL证书验证:部分站点可能存在证书问题,添加 verify=False 参数可防止因SSL错误导致请求失败;
- 异常捕获处理:采用 try-except 包裹关键代码块,有效应对网络中断、解析异常等情况,提升程序鲁棒性。
五、常见问题与应对方法
1. 数据抓取为空
- 检查所使用的 class 属性是否准确——网站可能已更新前端结构,需重新通过 F12 确认最新类名;
- 验证 headers 中的 User-Agent 是否生效,可尝试更换其他主流浏览器的 UA 字符串进行测试。
2. 请求被拒绝(返回状态码 403)
- 补充完整的请求头信息,尤其是 Cookie 和 Referer 字段,有助于伪装成正常用户会话;
六、学习总结
本文以股吧数据爬取为例,深入掌握了 requests 库与 Beautiful Soup 解析工具的核心应用技巧,同时理解了爬虫伪装的关键原理——即通过模拟真实用户的访问行为来实现高效、稳定的数据采集。在实际学习过程中,可参考以下几点建议进行能力提升:
1. 多实践于不同类型的网站,例如知乎、豆瓣等,对比分析其HTML结构的异同,增强对网页布局的敏感度;
2. 向进阶方向发展:探索处理动态加载内容的技术手段,如结合 selenium 工具或对接口请求进行逆向分析;同时可学习搭建代理池以应对IP封锁问题,并掌握将数据持久化存储至 Excel 或 MySQL 等方式;
3. 始终遵守合法合规原则:避免获取非公开或受保护的数据信息,控制请求频率,防止因高频访问影响目标网站的正常服务。
[此处为图片1]
针对常见问题的应对策略:
- 若出现请求过于频繁被拦截的情况,可适当延长两次请求之间的间隔时间,推荐设置为3至5秒;对于更高阶的应用,可通过轮换IP地址的方式规避限制,使用代理池是实现该功能的有效方法之一。
- 当遇到页面加载缓慢或连接超时的问题时,建议合理调整 timeout 参数(例如设为15秒),并检查本地网络状况,确保在爬取过程中不会因带宽占用过高而影响稳定性。
通过持续的实战训练,不仅能加深对HTTP通信机制和HTML文档结构的理解,也为后续掌握更复杂的网络爬虫技术奠定了坚实基础。代码功能可根据需求进一步扩展,比如实现数据导出到Excel文件、批量抓取更多字段内容等。


雷达卡


京公网安备 11010802022788号







