最近随着硅谷银行破产、瑞信暴雷引发全球金融风险担忧加剧,叠加美联储加息预期放缓,国际金价逼近2000美元/盎司关口。据中国基金报报道,在经历近一个月的震荡下跌后,本周现货黄金价格持续走高,现货黄金收报1989美元/盎司,涨幅3.64%,且已突破2月初的金价高位,创下近11个月以来新高,其中有多重因素影响,不过欧美银行业危机引发市场避险情绪升温是主要推动因素。
最近也有些关于黄金相关分析的项目需要用到金交所数据,这里直接获取权威的交易数据,上海黄金交易所官网就有历年的交易数据。直接用熟悉的Python写个爬虫自动获取。
首先进行简单的网站分析,找到上海黄金交易所每日行情页列表(首页 > 数据资讯 > 历史行情数据 > 每日行情。分析发现网站还存在反爬机制,对访问的IP的有爬频率限制。所以爬虫程序里面直接python使用aiohttp 通过设置代理IP,多线程并发采集,这样能更高效的获取数据。代理IP最好是选择付费的优质代理服务商,不管是代理的连通率,延迟,速度,带宽都有保证。实现代码如下:
# 导入相关库 import asyncio import aiohttp from aiohttp_socks import ProxyConnector from bs4 import BeautifulSoup # 定义目标网站和代理服务器的参数 url = "https://www.sge.com.cn/sjzx/mrhqsj" proxy = "socks5://16yun:16ip@www.16yun.cn:11111" # 定义异步函数来发送GET请求,并使用代理服务器来连接目标网站 async def fetch(session, url): try: async with session.get(url) as response: # 检查响应状态码是否为200,否则抛出异常 if response.status != 200: raise Exception(f"Bad status code: {response.status}") # 返回响应内容的文本格式 return await response.text() except Exception as e: # 打印异常信息,并返回None print(e) return None # 定义异步函数来处理响应结果,并解析HTML内容 async def parse(html): # 如果响应结果不为空,则进行解析操作 if html is not None: # 使用bs4库来创建BeautifulSoup对象,并指定解析器为html.parser soup = BeautifulSoup(html, "html.parser") # 提取网页中的标题标签,并打印其文本内容 title = soup.find("title") print(title.text) else: # 否则打印None表示无效结果 print(None) # 定义异步函数来统计成功次数,并打印结果 async def count(results): # 初始化成功次数为0 success = 0 # 遍历所有的结果,如果不为空,则增加成功次数,否则跳过 for result in results: if result is not None: success += 1 # 打印总共的请求数和成功次数 print(f"Total requests: {len(results)}") print(f"Success requests: {success}") # 定义异步主函数来创建并运行多个协程任务,并控制并发数量和超时时间等参数 async def main(): # 创建一个aiohttp_socks.ProxyConnector对象,用来设置代理服务器的参数 connector = ProxyConnector.from_url(proxy) # 创建一个aiohttp.ClientSession对象,用来发送HTTP请求,并传入connector参数 async with aiohttp.ClientSession(connector=connector) as session: # 创建一个空列表,用来存储所有的协程任务 tasks = [] # 循环10000次,每次创建一个fetch函数的协程任务,并添加到列表中 for i in range(10000): task = asyncio.create_task(fetch(session, url)) tasks.append(task) # 使用asyncio.gather函数来收集并执行所有的协程任务,并返回一个包含所有结果的列表 results = await asyncio.gather(*tasks) # 创建一个空列表,用来存储所有的解析任务 parse_tasks = [] for result in results: parse_task = asyncio.create_task(parse(result)) parse_tasks.append(parse_task) await asyncio.gather(*parse_tasks) await count(results) # 在程序入口处调用异步主函数,并启动事件循环 if __name__ == "__main__": asyncio.run(main())