Windows大数据开发环境兼容指南:从工具配置到跨平台实践

核心内容摘要

跨平台VMware系统兼容性解决方案:解锁macOS虚拟机的完整指南
3步打造零延迟客厅游戏系统:家庭游戏串流技术全解析

避开这5个坑!UG NX二次开发BlockUI集列表实战避坑指南

前言对于刚入门Python爬虫的小伙伴来说爬取股票数据是一个非常好的实战案例——数据公开易获取、需求明确开盘价、收盘价、涨幅等核心指标还能结合数据可视化绘制K线图实现“爬取-分析-可视化”全流程实战。

本文全程手把手从环境搭建、爬虫编写到数据存储、K线图绘制每一步都附完整代码详细注释新手跟着敲就能跑通无多余复杂概念纯实战落地提示本文爬取的是公开的股票实时行情数据严格遵守网站robots协议仅用于学习交流不涉及商业用途和恶意爬取。

前期准备必看环境搭建一步到位本次实战用到3个核心库提前安装好避免后续报错新手直接复制命令执行即可。

1 所需库说明新手不用记知道用途就行requests发送HTTP请求获取股票网页数据核心爬虫库轻量易上手pandas处理爬取到的股票数据整理、去重、存储简化数据操作mplfinance绘制专业股票K线图专门用于金融数据可视化比matplotlib更简洁。

2 库的安装CMD/终端执行复制粘贴即可# 批量安装所需库版本兼容新手无需额外配置pip install requests pandas mplfinance--upgrade安装报错解决如果出现“pip不是内部命令”大概率是Python环境变量未配置新手可以直接在PyCharm的Terminal中执行上述命令PyCharm会自动关联Python环境。

核心步骤1确定爬取目标与分析网页结构新手爬取数据第一步千万别急着写代码先确定“爬哪里、爬什么”再分析网页数据的加载方式——这是避免爬虫报错的关键

1 爬取目标本次选择「东方财富网」的股票实时行情页公开数据反爬难度低适合新手爬取内容股票代码、股票名称实时价格、开盘价、收盘价前一交易日涨跌额、涨幅核心分析指标爬取地址可直接复制到浏览器打开https://quote.eastmoney.com/center/gridlist.html#hs_a_board

2 分析网页结构新手必学打开上述网页按「F12」打开开发者工具Chrome/Firefox浏览器都可以步骤如下点击开发者工具左上角的「箭头」选择元素点击网页中的股票数据表格会自动定位到网页源码中的表格位置观察源码可知股票数据全部放在「table」标签中每一行股票对应一个「tr」标签每一个数据字段如开盘价、涨幅对应一个「td」标签关键结论该网页数据是「静态加载」刷新网页就能看到源码中的数据无需处理AJAX异步加载新手可直接爬取难度大大降低提示如果看不到表格源码刷新一下网页即可如果是动态加载源码中找不到数据本文末尾会补充解决方法新手先专注静态加载实战。

核心步骤2编写爬虫爬取股票实时数据手把手敲代码本次爬虫分3个小模块发送请求→解析数据→保存数据每个模块单独编写方便新手调试报错时能快速定位问题完整代码附注释直接复制就能运行。

1 模块1发送请求获取网页源码核心作用模拟浏览器访问网页获取网页的HTML源码后续从源码中提取股票数据重点是添加请求头避免被网站识别为爬虫。

importrequests#

定义爬取地址东方财富网A股实时行情页urlhttps://quote.eastmoney.com/center/gridlist.html#hs_a_board#

添加请求头模拟浏览器访问关键避免被反爬headers{User-Agent:Mozilla/

0 (Windows NT

1

0; Win64; x

AppleWebKit/

5

36 (KHTML, like Gecko) Chrome/

120.

0.

0 Safari/

5

36,Referer:https://quote.eastmoney.com/,# 模拟从东方财富网首页跳转过来更真实Accept-Language:zh-CN,zh;q

9# 模拟中文浏览器环境}#

发送GET请求获取网页源码try:responserequests.get(urlurl,headersheaders,timeout

response.encodingutf-8# 设置编码避免中文乱码# 验证请求是否成功状态码200表示成功ifresponse.status_code200:print(请求成功已获取网页源码)htmlresponse.text# 提取网页源码后续用于解析数据else:print(f请求失败状态码{response.status_code})exceptExceptionase:print(f请求报错错误信息{e})

2 模块2解析数据提取核心字段核心作用从网页源码中提取我们需要的股票数据代码、名称、开盘价等这里用「正则表达式」解析新手易上手无需额外学BeautifulSoup。

补充正则表达式匹配规则已帮大家写好新手不用深究直接复用即可重点看注释理解每一步的作用。

importreimportpandasaspd# 定义一个列表用于存储所有股票数据stock_data[]# 用正则表达式解析网页源码提取股票核心数据# 匹配规则根据网页源码的结构编写精准匹配每一行股票数据patternre.compile(rtr class[^]*.*?tda href[^]* target_blank([

]{6})/a/td.*?# 股票代码rtda href[^]* target_blank class[^]*([^]*)/a/td.*?# 股票名称rtd class[^]*([

]\.[

])/td.*?# 实时价格rtd class[^]*([

]\.[

])/td.*?# 开盘价rtd class[^]*([

]\.[

])/td.*?# 收盘价前一交易日rtd class[^]*([-]?[

]\.[

])/td.*?# 涨跌额rtd class[^]*([-]?[

]\.[

])%/td,# 涨幅带%re.S# 忽略换行符确保能匹配到完整的一行股票数据)# 查找所有匹配的数据matchespattern.findall(html)# 遍历匹配结果整理数据将每一只股票的数据存入列表formatchinmatches:stock_codematch[0]# 股票代码stock_namematch[1]# 股票名称current_pricefloat(match[2])# 实时价格转换为浮点数方便后续计算open_pricefloat(match[3])# 开盘价close_pricefloat(match[4])# 收盘价前一交易日change_amountfloat(match[5])# 涨跌额change_ratefloat(match[6])# 涨幅去掉%转换为浮点数# 将单只股票数据存入字典再添加到列表中stock_dict{股票代码:stock_code,股票名称:stock_name,实时价格:current_price,开盘价:open_price,收盘价(前一交易日):close_price,涨跌额:change_amount,涨幅(%):change_rate}stock_data.append(stock_dict)# 验证解析结果打印前5只股票数据查看是否解析成功print(解析成功前5只股票数据如下)print(pd.DataFrame(stock_data).head())

3 模块3保存数据方便后续分析核心作用将解析后的股票数据保存为Excel文件新手易查看、易复用用pandas实现一行代码就能搞定无需手动创建Excel。

# 用pandas将列表中的数据转换为DataFrame表格形式dfpd.DataFrame(stock_data)# 保存为Excel文件保存路径可自定义这里保存在当前文件夹文件名股票实时数据.xlsxdf.to_excel(股票实时数据.xlsx,indexFalse)# indexFalse不保存行索引更整洁print(数据保存成功已保存为股票实时数据.xlsx)print(f共爬取到{len(stock_data)}只股票的数据)

4 完整爬虫代码整合版直接复制运行将上述3个模块整合添加异常处理避免报错终止程序新手直接复制到PyCharm中点击运行即可。

importrequestsimportreimportpandasaspddefcrawl_stock_data():#

发送请求获取网页源码urlhttps://quote.eastmoney.com/center/gridlist.html#hs_a_boardheaders{User-Agent:Mozilla/

0 (Windows NT

1

0; Win64; x

AppleWebKit/

5

36 (KHTML, like Gecko) Chrome/

120.

0.

0 Safari/

5

36,Referer:https://quote.eastmoney.com/,Accept-Language:zh-CN,zh;q

9}try:responserequests.get(urlurl,headersheaders,timeout

response.encodingutf-8ifresponse.status_code!200:print(f请求失败状态码{response.status_code})returnNonehtmlresponse.textexceptExceptionase:print(f请求报错{e})returnNone#

解析数据提取核心字段stock_data[]patternre.compile(rtr class[^]*.*?tda href[^]* target_blank([

]{6})/a/td.*?rtda href[^]* target_blank class[^]*([^]*)/a/td.*?rtd class[^]*([

]\.[

])/td.*?rtd class[^]*([

]\.[

])/td.*?rtd class[^]*([

]\.[

])/td.*?rtd class[^]*([-]?[

]\.[

])/td.*?rtd class[^]*([-]?[

]\.[

])%/td,re.S)matchespattern.findall(html)formatchinmatches:stock_dict{股票代码:match[0],股票名称:match[1],实时价格:float(match[2]),开盘价:float(match[3]),收盘价(前一交易日):float(match[4]),涨跌额:float(match[5]),涨幅(%):float(match[6])}stock_data.append(stock_dict)ifnotstock_data:print(未解析到任何股票数据请检查正则表达式匹配规则)returnNone#

保存数据为Exceldfpd.DataFrame(stock_data)df.to_excel(股票实时数据.xlsx,indexFalse)print(f爬取成功共获取{len(stock_data)}只股票数据已保存为股票实时数据.xlsx)returndf# 执行爬虫函数获取股票数据DataFrame后续用于绘制K线图stock_dfcrawl_stock_data()爬虫运行结果说明运行成功后控制台会打印“请求成功”“爬取成功”的提示以及前5只股票的数据在当前Python文件所在的文件夹中会生成一个「股票实时数据.xlsx」文件打开后就能看到所有爬取的股票数据格式整洁可直接编辑常见报错解决如果未解析到数据大概率是网页结构更新正则表达式匹配规则失效可重新按F12查看网页源码调整正则表达式新手可留言我会补充最新匹配规则如果保存Excel报错重新安装pandas库即可。

核心步骤3绘制K线图分析股票走势新手也能画爬取到数据后重点是通过K线图分析股票走势——K线图是股票分析的核心工具能直观展示开盘价、收盘价、涨跌情况。

本次用mplfinance库无需手动调整参数一行代码就能绘制专业K线图。

1 补充K线图绘制的前提新手必看K线图需要「时间序列数据」即某只股票连续多日的开盘价、收盘价、最高价、最低价而我们上面爬取的是「实时行情数据」单时间点的所有股票数据因此需要补充一步获取单只股票的历史数据连续多日。

下面补充代码基于上面的爬虫添加“获取单只股票历史数据”的函数再绘制K线图整合到完整代码中直接运行。

2 完整代码获取单只股票历史数据绘制K线图importmplfinanceasmpfimportdatetimedefget_stock_history(stock_code,start_date,end_date): 获取单只股票的历史数据用于绘制K线图 :param stock_code: 股票代码如600000浦发银行 :param start_date: 开始日期格式YYYY-MM-DD如

:param end_date: 结束日期格式YYYY-MM-DD如

:return: 股票历史数据DataFrame # 东方财富网股票历史数据接口公开接口无需登录urlfhttps://q.stock.sohu.com/hisHq?codecn_{stock_code}start{start_date}end{end_date}stat1orderDperioddcallbackhistorySearchHandlerrtjsonpr

0.

8

6352749954223633headers{User-Agent:Mozilla/

0 (Windows NT

1

0; Win64; x

AppleWebKit/

5

36 (KHTML, like Gecko) Chrome/

120.

0.

0 Safari/

5

36}try:responserequests.get(urlurl,headersheaders,timeout

response.encodingutf-8ifresponse.status_code!200:print(f获取历史数据失败状态码{response.status_code})returnNone# 解析接口返回的数据JSON格式需要处理字符串提取有效数据data_strresponse.text.lstrip(historySearchHandler().rstrip())importjson data_jsonjson.loads(data_str)# 提取历史数据整理为DataFramehistory_data[]foritemindata_json[0][hq]:dateitem[0]# 日期open_pricefloat(item[1])# 开盘价close_pricefloat(item[2])# 收盘价high_pricefloat(item[3])# 最高价low_pricefloat(item[4])# 最低价change_ratefloat(item[8].strip(%))# 涨幅history_dict{日期:date,开盘价:open_price,收盘价:close_price,最高价:high_price,最低价:low_price,涨幅(%):change_rate}history_data.append(history_dict)# 转换为DataFrame调整日期格式用于mplfinance绘制K线图dfpd.DataFrame(history_data)df[日期]pd.to_datetime(df[日期])# 将日期转换为datetime格式df.set_index(日期,inplaceTrue)# 将日期设为索引mplfinance要求dfdf.sort_index()# 按日期升序排列print(f成功获取{stock_code}股票{start_date}至{end_date}的历史数据共{len(df)}条)returndfexceptExceptionase:print(f获取历史数据报错{e})returnNone# 示例获取「浦发银行600000」2024年1月1日至2024年12月31日的历史数据stock_code600000# 可替换为其他股票代码如000001平安银行start_date

end_date

history_dfget_stock_history(stock_code,start_date,end_date)# 绘制K线图专业美观新手无需调整参数ifhistory_dfisnotNone:# 设置K线图样式默认样式即可也可自定义颜色mpf_stylempf.make_mpf_style(base_mpf_styleyahoo,rc{font.size:10})# 绘制K线图添加涨幅均线MA

MA10更直观分析走势mpf.plot(history_df,typecandle,# 图表类型K线图candle蜡烛图即K线图stylempf_style,# 图表样式titlef{stock_code}股票K线图{start_date}-{end_date},# 图表标题ylabel价格元,# Y轴标签ylabel_lower涨幅%,# 下方Y轴标签addplot[mpf.make_addplot(history_df[涨幅(%)],panel1,colorred,label涨幅(%))# 下方添加涨幅曲线],mav(5,

,# 添加5日、10日均线用于分析短期走势volumeFalse,# 不显示成交量新手可先关闭简化图表show_nontradingFalse,# 不显示非交易日figratio(12,

,# 图表比例宽12高8美观tight_layoutTrue# 紧凑布局避免标签遮挡)K线图绘制结果说明运行代码后会自动弹出一个窗口显示股票K线图包含红色K线收盘价 开盘价上涨绿色K线收盘价 开盘价下跌黄色线5日均线短期走势参考紫色线10日均线短期走势参考下方红色曲线每日涨幅直观查看涨跌波动。

自定义调整新手可替换「stock_code」为其他股票代码如000001平安银行、601318中国平安调整「start_date」和「end_date」更换时间范围报错解决如果弹出的K线图空白大概率是日期格式错误确保start_date和end_date的格式为“YYYY-MM-DD”如果获取不到历史数据更换股票代码即可。

新手实战拓展可选进阶提升学会基础爬取和K线图绘制后新手可尝试以下拓展提升实战能力

1 拓展1爬取多只股票的历史数据批量绘制K线图将股票代码存入列表循环调用「get_stock_history」函数批量获取多只股票的历史数据批量绘制K线图代码示例如下# 批量爬取多只股票的历史数据批量绘制K线图stock_codes[600000,000001,601318]# 浦发银行、平安银行、中国平安start_date

end_date

forcodeinstock_codes:dfget_stock_history(code,start_date,end_date)ifdfisnotNone:mpf.plot(df,typecandle,stylempf.make_mpf_style(base_mpf_styleyahoo),titlef{code}股票K线图,ylabel价格元,mav(5,

,show_nontradingFalse,figratio(12,

)

2 拓展2添加数据筛选功能筛选涨幅大于5%的股票利用pandas筛选爬取到的实时数据筛选出涨幅大于5%的股票保存为新的Excel文件方便重点分析# 筛选涨幅大于5%的股票基于之前爬取的实时数据stock_dfifstock_dfisnotNone:high_growth_stockstock_df[stock_df[涨幅(%)]5]ifnothigh_growth_stock.empty:high_growth_stock.to_excel(涨幅大于5%的股票.xlsx,indexFalse)print(f已筛选出{len(high_growth_stock)}只涨幅大于5%的股票保存为涨幅大于5%的股票.xlsx)else:print(暂无涨幅大于5%的股票)

3 拓展3设置定时爬取实时更新股票数据利用「time」库设置定时爬取如每10分钟爬取一次实时数据自动更新Excel文件实现实时监控importtime# 定时爬取每10分钟一次600秒whileTrue:print(f\n{datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)}开始定时爬取股票实时数据)crawl_stock_data()# 调用爬虫函数print(定时爬取完成等待10分钟后再次爬取...)time.sleep(

# 等待600秒10分钟

六、

常见问题汇总新手必看避坑指南问题1请求成功但解析不到股票数据解决网页结构更新正则表达式匹配规则失效重新按F12查看网页源码调整正则表达式的匹配内容。

问题2绘制K线图时报错“没有索引”解决忘记将日期设为索引确保调用「df.set_index(“日期”, inplaceTrue)」且日期格式为datetime格式。

问题3获取历史数据时接口返回空解决股票代码错误A股代码为6位数字如600开头、000开头或时间范围过大缩小时间范围即可。

问题4中文乱码解决设置response.encoding “utf-8”保存Excel时无需额外设置pandas会自动处理中文编码。

问题5被网站封禁IP解决添加请求头降低爬取频率如定时爬取每10分钟一次避免高频请求新手无需使用代理IP公开股票数据反爬宽松。

七、

总结与学习建议本次实战我们完成了「股票实时数据爬取→数据保存→历史数据获取→K线图绘制」的全流程核心重点爬虫部分重点是模拟浏览器请求添加请求头、解析静态网页数据正则表达式复用、数据保存pandas简化操作新手无需追求复杂的解析库先掌握基础正则表达式即可可视化部分mplfinance库专门用于股票可视化无需手动调整参数重点是获取符合要求的历史数据时间序列、包含开盘价/收盘价/最高价/最低价学习建议新手先跟着代码敲一遍确保能运行成功再逐步修改参数如更换股票代码、时间范围尝试拓展功能批量爬取、数据筛选遇到报错不要慌对照“

常见问题汇总”排查多调试几次就能掌握。

后续可尝试爬取基金数据、期货数据或结合机器学习实现股票走势预测逐步提升Python实战能力。

17c永久登录入口:让你畅享无缝体验-17c永久登录入口:让你畅享无缝体验应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123