鱼C论坛

 找回密码
 立即注册
查看: 2258|回复: 5

[作品展示] 自动爬取单只股票价格并在Windows上实时通知,达到目标价格即发邮件

[复制链接]
发表于 2021-5-20 14:01:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
此脚本只能在windows系统下正常运行,需要安装bs4、requests、win10toast、keyboard四个外部包。

  1. pip install bs4
复制代码
  1. pip install requests
复制代码
  1. pip install win10toast
复制代码
  1. pip install keyboard
复制代码


执行以上代码安装!

脚本会在py文件目录生成一个config.txt文件,里面存储着邮箱地址和密码,属于私人信息。

想要让此脚本发送邮件(目前只限QQ邮箱发送),需要在邮箱账户里设置POP3/SMTP服务,并复制授权码到控制台。

注意,这个py主程序需要调用一个.ico文件,不然Windows10通知的时候会报错,ico文件和py主程序文件需要在同一文件夹下。但是,最好不要将这个文件夹放在桌面,不然有些时候会出bug。

爬取股票价格的时候,会出现超过我能力之外的bug,这个概率大约是1%。

文件夹已上传Github,链接是https://github.com/YouCam-X/Apps

也可以在百度网盘直接下载打包好的程序,链接:https://pan.baidu.com/s/1DHCSobFVCVqw0OlAxPztOw   提取码:hmf4

以下是源代码:

  1. import os
  2. from bs4 import BeautifulSoup
  3. import requests
  4. import time
  5. from urllib.request import quote, unquote
  6. from win10toast import ToastNotifier
  7. import smtplib
  8. from email.mime.text import MIMEText
  9. import keyboard


  10. def edit_data():

  11.     global from_addr
  12.     global to_addr
  13.     global password
  14.     global user_agent

  15.     from_addr = input('请输入发送邮件的邮箱地址')
  16.     to_addr = input('请输入接收邮件的邮箱地址')
  17.     password = input('请输入授权码')
  18.     user_agent = input('请在浏览器中复制User-Agent参数,贴到这里')

  19.     data = [from_addr,to_addr,password,user_agent]

  20.     file = open('config.txt','w')

  21.     for i in data:
  22.         file.write(i)
  23.         file.write('\n')

  24.     file.close()

  25. def load_previous():

  26.     global from_addr
  27.     global to_addr
  28.     global password
  29.     global user_agent

  30.     if os.path.isfile('config.txt'):
  31.         file = open('config.txt','r')
  32.         data = file.readlines()
  33.    
  34.         for i in data:
  35.             from_addr = data[0].strip('\n')
  36.             to_addr = data[1].strip('\n')
  37.             password = data[2].strip('\n')
  38.             user_agent = data[3].strip('\n')

  39.         file.close()

  40.     else:
  41.         print('没有已存在的信息,请现在输入')

  42.         from_addr = input('请输入发送邮件的邮箱地址')
  43.         to_addr = input('请输入接收邮件的邮箱地址')
  44.         password = input('请输入授权码')
  45.         user_agent = input('请在浏览器中复制User-Agent参数,贴到这里')

  46.         data = [from_addr,to_addr,password,user_agent]

  47.         file = open('config.txt','w')
  48.         for i in data:
  49.             file.write(i)
  50.             file.write('\n')

  51.         file.close()

  52. def sendemail():

  53.     message = name + '\n' + str(price.text)
  54.     msg = MIMEText(message)
  55.     msg['Subject'] = '股票价格预警'
  56.     msg['From'] = from_addr
  57.     msg['To'] = to_addr
  58.     stmp_server = 'smtp.qq.com'


  59.     server = smtplib.SMTP_SSL(stmp_server,465,timeout = 2)
  60.     server.login(from_addr,password)
  61.     server.sendmail(from_addr,[to_addr],msg.as_string())
  62.     server.quit()


  63. def main():

  64.     global name
  65.     global price
  66.     loop_number = 0

  67.     print('''           欢迎来到股票通知系统''')
  68.     name = input('请输入需要跟踪的股票名称\n')
  69.     expectation = input('请输入此股票的预警价格,如>100,<50\n')

  70.     number = expectation[1:]
  71.     number_without_period = ''

  72.     for i in number:

  73.         if i == '.':
  74.             continue

  75.         else:
  76.             number_without_period = number_without_period + i

  77.     while not str.isdigit(number_without_period):

  78.         print('价格输入有误,请重新输入')
  79.         expectation = input('请输入预警价格,如>100,<50\n')
  80.         number = expectation[1:]
  81.         number_without_period = ''

  82.         for i in number:

  83.             if i == '.':
  84.                 continue

  85.             else:
  86.                 number_without_period = number_without_period + i

  87.     print('是否沿用上一次的邮箱地址和密码?是请按Enter键,重新设置请按Esc键。')

  88.     while True:

  89.         if keyboard.is_pressed('enter'):
  90.             buffer = input('')
  91.             load_previous()
  92.             break

  93.         elif keyboard.is_pressed('esc'):
  94.             keyboard.wait('esc',True,True)
  95.             edit_data()
  96.             break

  97.         else:
  98.             continue

  99.     encodedname = quote(name)

  100.     url = 'https://www.baidu.com/s?wd='+ encodedname + '&rsv_spt=1&rsv_iqid=0xc84846ff00069f4b&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=10&rsv_sug1=10&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=4866&rsv_sug4=4866'

  101.     headers = {
  102.             'referer':'https://www.baidu.com/s?wd='+ encodedname + '&rsv_spt=1&rsv_iqid=0xc84846ff00069f4b&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=10&rsv_sug1=10&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=4866&rsv_sug4=4866',
  103.             'user-agent':user_agent}


  104.     while True:
  105.         toaster = ToastNotifier()
  106.         searchpage = requests.get(url,headers=headers)

  107.         loop_number += 1

  108.         soup = BeautifulSoup(searchpage.text,'html.parser')
  109.         price = soup.find(srcid = '5432').find(class_= 'price_2jYb9')

  110.         toaster.show_toast(name,price.text,icon_path = 'icon.ico')

  111.         print('第%s次请求成功!'%(str(loop_number)))

  112.         if expectation[0] == '>':
  113.             if float(price.text) >= float(number):
  114.             
  115.                 try:
  116.                     sendemail()
  117.                     print('通知邮件已发送!')
  118.                     break

  119.                 except:
  120.                     print('发送邮件失败')
  121.                     break

  122.         elif expectation[0] == '<':
  123.             if float(price.text) <= float(number):

  124.                 try:
  125.                     sendemail()
  126.                     print('通知邮件已发送!')
  127.                     break

  128.                 except:
  129.                     print('发送邮件失败')
  130.                     break

  131.         time.sleep(60)


  132. main()
  133. press_enter = input('程序已执行完毕,按Enter键退出')
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-31 12:44:13 | 显示全部楼层
竟然没人!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-31 13:09:44 From FishC Mobile | 显示全部楼层
YouCam 发表于 2021-5-31 12:44
竟然没人!

可能是因为没有玩股票的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-31 15:57:32 | 显示全部楼层
hrp 发表于 2021-5-31 13:09
可能是因为没有玩股票的

也是也是
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-1 08:43:50 | 显示全部楼层
目前还看不懂,先点个赞!可以根据日期爬取某基金的当日净值吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-5 11:14:43 | 显示全部楼层
O2H2O 发表于 2021-6-1 08:43
目前还看不懂,先点个赞!可以根据日期爬取某基金的当日净值吗?

这个是爬取股票的,基金可能也行,本质上就是一个小爬虫,然后让Windows系统每隔一分钟通知一下净值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-23 01:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表