爬table数据_Wind数据个性化定制抓取:以抓取Wind研报为例

本文介绍了如何使用Python的uiautomation库爬取Wind金融终端中的研报数据。通过分析Wind页面结构,选定Wind窗口,获取研报列表并模拟点击进入详情页,最后抓取所需信息并退出详情页。这种方法适用于Windows程序自动化数据抓取。

1.前言

Wind(万德)金融终端是我校同学常用的商业软件,其中提供了大量的金融实施数据,丰富而翔实。Wind几乎是我见过的付费商业软件中用户体验最好的之一,然而正是由于其昂贵的价格,使得其保密性非常高,不容易获取其中的数据。Wind官方为我们提供了api接口,但这些接口还不能满足我们更加个性化的数据要求。

同时Wind作为PC客户端程序,抓取其中的数据并不能像在浏览器中那样方便。对于浏览器中的数据,可以用大家非常熟悉的传统爬虫来解决。然而对于这种PC程序中的数据,抓取就需要其他的办法。

如需按本文操作进行实验,建议准备一块额外的外接屏幕。

2.问题描述

这里我们的目标问题是爬取wind终端中的研报数据。wind账号异常昂贵,这里我们只好想象自己真的有一个Wind账号。37ee879909c1bc6224288f1fe3b80e4f.png
我们的目标主要是爬取每条研报中的一些具体数据,如研报撰稿人、发布时间,180天内被评测次数和EPS值(见下图红框),并写入csv文件。05208e15bbcd3c827e7ee619b47c6804.png

3.分析页面

众所周知,浏览器中的数据是以HTML的形式展现的,通过爬虫,辅之以正则表达式、xpath等工具可以轻松拿到我们需要的数据。实际上,很多Windows程序中也有类似HTML页面的结构,只不过大部分Windows程序是不提供检查功能的。我们可以使用Windows SDK提供的inspe

<think>我们计划从中国天气网(www.weather.com.cn)抓取一年的天气数据。由于全国天气网数据按城市发布,我们需要先确定城市,然后抓取该城市一整年的历史天气数据。步骤:1.确定目标城市和对应的URL。如,北京的历史天气URL格式为:http://www.weather.com.cn/history/101010100.shtml?year=2021&month=12(注意:101010100是北京的城市代码,year和month参数指定年月)2.由于历史天气数据是按月展示的,我们需要遍历12个月,分别抓取每个月的天气数据。3.解析每个月的页面,提取每天的天气数据。4.将数据存储到CSV文件中。注意:中国天气网对虫有一定反措施,我们需要设置合理的请求头,并控制请求频率。实现步骤:1.获取城市代码:我们可以在网站上查找城市的代码,如北京是101010100。2.构造URL列表:对于指定年份(如2021)和城市代码,生成12个月的URL。3.发送HTTP请求获取页面内容,使用BeautifulSoup解析HTML。4.从HTML中提取每天的天气数据。历史天气数据在表格中,我们可以通过查找表格元素来解析。5.将提取的数据存储到PandasDataFrame中,最后保存为CSV。示代码:我们将以北京2021年的天气数据。注意:在运行虫前,请确保遵守网站的使用条款,并尊重网站的robots.txt。本示仅用于教育目的。代码实现:我们将使用requests和BeautifulSoup库。请确保已安装这些库。由于历史天气页面可能有动态加载,我们需要注意。但观察中国天气网的历史天气页面,发现是静态页面,所以可以直接抓取。具体步骤:1.设置请求头,模拟浏览器访问。2.循环遍历12个月。3.对于每个月,构造URL并请求页面。4.解析页面,提取表格数据。5.将数据整理成DataFrame,并追加到总数据中。6.保存为CSV。但是注意:中国天气网的历史天气数据页面中,表格的HTML结构如下:<divclass="tqtongji2"><ul><!--表头--><ul><!--每天的数据,每个ul代表一行,每个li代表一个单元格-->因此,我们可以通过查找class为"tqtongji2"的div,然后找到所有的ul标签。第一个ul是表头,后面的ul是每天的数据。表头示:<ul><li>日期</li><li>最高气温</li><li>最低气温</li><li>天气</li><li>风向风力</li></ul>数据行示:<ul><li>1日</li><li>28℃</li><li>18℃</li><li>多云转晴</li><li>微风</li></ul>注意:日期在数据行中是“1日”这样的格式,我们需要将其转换为完整的日期(如2021-12-01)。注意,有些月份可能没有31天,所以要根据月份调整。另外,注意页面可能包含多个表格(比如有广告),所以我们要准确找到历史天气的表格。代码示:</think>我将为您详细介绍如何使用 Python 虫从中国天气网抓取一年的天气数据,并提供完整的代码实现。 ### 抓取天气数据的步骤 1. **分析目标网站结构** 中国天气网历史天气数据 URL 格式为: `http://www.weather.com.cn/history/城市代码/month/年月.html` 如北京 2023 年 1 月数据: `http://www.weather.com.cn/history/101010100/month/202301.html` 2. **获取城市代码** 城市代码可在官网查询(如北京 101010100),或通过 API 接口获取: ```python import requests city_code_url = "http://www.weather.com.cn/data/city3jdata/china.html" response = requests.get(city_code_url) city_codes = response.json() # 返回省份和城市代码字典 ``` 3. **构造请求头** 避免被反机制拦截: ```python headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Referer': 'http://www.weather.com.cn/' } ``` ### 完整虫代码 ```python import requests from bs4 import BeautifulSoup import pandas as pd import time import re def get_weather_data(city_code, year): """ 获取指定城市一年的天气数据 :param city_code: 城市代码 (如北京101010100) :param year: 年份 (如2023) :return: 包含天气数据的DataFrame """ all_data = [] for month in range(1, 13): # 构造月度URL url = f"http://www.weather.com.cn/history/{city_code}/month/{year}{month:02d}.html" try: response = requests.get(url, headers=headers) response.encoding = 'utf-8' soup = BeautifulSoup(response.text, 'html.parser') # 定位数据表格 table = soup.find('table', class_='tqtongji2') if not table: continue # 提取表头 headers = [th.get_text(strip=True) for th in table.find('tr').find_all('th')] # 提取每日数据 for row in table.find_all('tr')[1:]: row_data = [td.get_text(strip=True) for td in row.find_all('td')] # 补全年份信息 if len(row_data) > 0: row_data[0] = f"{year}-{month:02d}-{row_data[0].replace('日', '')}" all_data.append(row_data) print(f"已获取 {year}年{month}月数据") time.sleep(1) # 避免请求过快 except Exception as e: print(f"获取{year}年{month}月数据失败: {e}") # 创建DataFrame df = pd.DataFrame(all_data, columns=headers) return df # 使用示 if __name__ == "__main__": headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } # 北京城市代码 beijing_code = "101010100" year = 2023 weather_df = get_weather_data(beijing_code, year) # 数据清洗 weather_df = weather_df.dropna() # 删除空行 weather_df['日期'] = pd.to_datetime(weather_df['日期']) # 保存为CSV weather_df.to_csv(f"北京_{year}年天气数据.csv", index=False, encoding='utf_8_sig') print(f"数据已保存至 北京_{year}年天气数据.csv") ``` ### 数据处理要点 1. **字段拆分**(参考您提供的示): ```python # 拆分风向风力字段 weather_df[['风向', '风力']] = weather_df['风向风力'].str.split('转', expand=True) # 拆分温度字段 weather_df['最高气温'] = weather_df['气温'].str.split('/').str[0] weather_df['最低气温'] = weather_df['气温'].str.split('/').str[1] ``` 2. **数据清洗**: ```python # 转换温度格式 weather_df['最高气温'] = weather_df['最高气温'].str.replace('℃', '').astype(int) weather_df['最低气温'] = weather_df['最低气温'].str.replace('℃', '').astype(int) # 提取星期信息 weather_df['星期'] = weather_df['日期'].dt.day_name() ``` ### 注意事项 1. **反措施**: - 使用随机 User-Agent(可通过 `fake_useragent` 库实现) - 添加请求延迟(`time.sleep(random.uniform(1, 3))`) - 使用代理 IP(重要数据采集时建议使用) 2. **数据完整性**: - 网站可能缺失部分日期数据 - 建议添加异常重试机制 ```python for retry in range(3): try: response = requests.get(url, timeout=10) break except: time.sleep(5) ``` 3. **合法合规**: - 遵守网站 robots.txt 协议 - 控制请求频率(建议每秒不超过1次) - 仅用于个人学习究 ### 数据分析示 获取数据后,您可以进行以下分析: ```python # 月平均温度分析 monthly_avg = weather_df.groupby(weather_df['日期'].dt.month)[['最高气温', '最低气温']].mean() # 天气类型统计 weather_count = weather_df['天气'].value_counts() # 风向频率分析 wind_direction_freq = weather_df['风向'].value_counts(normalize=True) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值