最近股市振荡,股民会时不时查看一下上证指数信息,但是繁忙的工作却时不是让人忘记了,错过了投资的最佳时机,这时就可以通过Python来爬取网站上的上证指数,并发送到指定的邮箱,这样就不用上指定网页也以获取最新的信息。
本文中,我将带你一步步实现一个小程序——通过网上财经网站的接口获取上证指数的实时数据,并将这些信息通过邮件发送到你指定的邮箱。这一切都可以通过 Python 来实现,简单高效,适合任何有基本编程基础的朋友。接下来让我们看看具体的实现步骤吧。
第一步:安装所需的库
在我们开始编写代码之前,需要安装两个关键的 Python 库:
requests:用于获取上证指数数据。
yagmail:用来发送邮件。
如果你还没有这些库,可以通过以下命令来安装它们:
pip install requests yagmail
简单来说,requests 是我们抓取网页数据的好帮手,而 yagmail 则是一个轻量级的邮件发送工具,免去繁琐的配置步骤,几行代码就能发邮件。
第二步:获取上证指数的实时数据
为了获取上证指数的最新行情,我们可以利用新浪财经提供的免费 API。该接口能够以非常高的速度返回上证指数的实时数据。下面是获取数据的核心代码:
import requests
import time
import redef get_stock_data(stocks):timestamp = int(time.time() * 1000) # 生成当前时间戳headers = {"host": "hq.sinajs.cn","referer": "https://vip.stock.finance.sina.com.cn/","user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"}url = f"https://hq.sinajs.cn/rn={timestamp}&list={','.join(stocks)}"res = requests.get(url, headers=headers)# 使用正则表达式解析返回的数据pattern = re.compile(r'var hq_str_s_(\w+)="(.*?)";')matches = pattern.findall(res.text)parsed_data = []for code, values in matches:values_list = values.split(',')parsed_data.append({'code': code,'name': values_list[0],'current_value': values_list[1],'change': values_list[2],'change_percent': values_list[3]})return parsed_data
在这段代码中,我们通过 requests 库向新浪财经发送一个请求,并将返回的数据解析成易读的格式。关键在于用正则表达式提取我们需要的信息,比如上证指数的名称、当前点位、涨跌幅度等。
第三步:格式化股票数据
获取数据之后,接下来需要将它转化为一个更容易理解、便于阅读的文本格式。这一步可以帮助我们将数据发送给用户时更加清晰明了:
def format_stock_data(data):formatted_content = ""for stock in data:name = stock['name']current_value = stock['current_value']change = float(stock['change'])change_percent = stock['change_percent']if change > 0:change_text = f"今日涨了 {change} 点,涨幅:{change_percent}%"else:change_text = f"今日跌了 {abs(change)} 点,跌幅:{change_percent}%"formatted_content += f"{name} 当前点位: {current_value},{change_text}\n"return formatted_content
通过 format_stock_data 函数,我们将提取到的股票信息格式化为简洁的文本。比如,我们会将上证指数的点位、涨跌幅度显示出来,并且根据涨跌情况,适当调整描述的措辞。格式化的文本如下:
格式化后的文本
第四步:获取邮箱信息
为了能够成功发送邮件,我们需要得到邮箱的地址、用户名和授权密码。这里以126信箱为例,你需要进入你的126信箱,在顶部的【设置】下拉菜单中找到
找到POP3/SMTP/IMAP
点击【新增授权密码】这里一个授权密码有效期是180天,过期还需要重新申请,普通用户可以设置2个授权密码。
申请授权密码
在弹出的对话框中手机扫描二维码向绑定的手机号发送短信(按运营商规定收费),然后点击【已发送邮件】通过验证。然后就可以得到一个授权码,注意一定要保存好,因为它不会重复显示。
发送邮件
第五步:发送邮件
最后,我们使用 yagmail 库将处理好的股票数据发送到指定的邮箱。这个库的好处在于它非常易用,只需要简单配置就可以发送邮件。以下是邮件发送的代码:
import yagmail
from datetime import datetimedef send_email(user_name, recipient_email, stock_data):yag = yagmail.SMTP(user="你的邮箱地址", password="你的邮箱授权密码", host="邮箱所在smtp如:smtp.126.com") #这里输入邮箱# 定义邮件的内容contents = (f"尊敬的{user_name}, 您好!\n\n"f"以下是当前的股票数据:\n\n{stock_data}\n"f"数据更新时间:{datetime.now().strftime('%m-%d %H:%M:%S')}\n"f"祝您生活愉快!\n\n此致,\n您的股票助手")# 发送邮件yag.send(recipient_email, f'上证指数最新数据 - {datetime.now().strftime("%m-%d %H:%M:%S")}', contents)
在这里,我们使用 yagmail.SMTP 建立了与 SMTP 服务器的连接,然后构建邮件内容,最后通过 yag.send() 将邮件发送给目标用户。
你只需要替换代码中的 你的邮箱地址 和 你的邮箱密码 为你的真实信息,即可实现自动化发送邮件的功能。
第六步:整理合所有代码
采用类的写法,整合所有代码,我们可以得到发送上证指数信息的一个完整的小程序:
from datetime import datetime
import requests
import re
import yagmail
import timedef get_stock_data(stocks):timestamp = int(time.time() * 1000)headers = {"host": "hq.sinajs.cn","referer": "https://vip.stock.finance.sina.com.cn/","user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"}url = f"https://hq.sinajs.cn/rn={timestamp}&list={','.join(stocks)}"res = requests.get(url, headers=headers)parsed_data = []pattern = re.compile(r'var hq_str_s_(\w+)="(.*?)";')matches = pattern.findall(res.text)for code, values in matches:values_list = values.split(',')parsed_data.append({'code': code,'name': values_list[0],'current_value': values_list[1],'change': values_list[2],'change_percent': values_list[3]})return parsed_datadef format_stock_data(data):formatted_content = ""for stock in data:name = stock['name']current_value = stock['current_value']change = float(stock['change'])change_percent = stock['change_percent']if change > 0:change_text = f"今日涨了 {change} 点,涨幅:{change_percent}%"else:change_text = f"今日跌了 {abs(change)} 点,跌幅:{change_percent}%"formatted_content += f"{name} 当前点位: {current_value},{change_text}\n"return formatted_contentdef send_email(user_name, recipient_email, stock_data):yag = yagmail.SMTP(user="你的邮箱地址", password="你的邮箱密码", host="smtp.126.com")contents = (f"尊敬的{user_name}, 您好!\n\n"f"以下是当前的股票数据:\n\n{stock_data}\n"f"数据更新时间:{datetime.now().strftime('%m-%d %H:%M:%S')}\n"f"祝您生活愉快!\n\n此致,\n您的股票助手")yag.send(recipient_email, f'上证指数最新数据 - {datetime.now().strftime("%m-%d %H:%M:%S")}', contents)if __name__ == "__main__":stocks = ["s_sh000001"] # 上证指数代码stock_data = get_stock_data(stocks)formatted_data = format_stock_data(stock_data)send_email("Gordon", "403096966@qq.com", formatted_data)
学后总结
后续,在此基础上,我们可以把程序架设在vps上,设置定期执行发送邮件的计划任务,这样我们就可以通过邮件即时获取上证指数信息。
未来,还可以改进代码,做成一个UI界面,批量获取网上的每日一句,定时发送到指定的邮箱,帮助自己学习英语等等。