YouCam 发表于 2021-5-20 14:01:17

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

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

pip install bs4
pip install requests
pip install win10toast
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

以下是源代码:

import os
from bs4 import BeautifulSoup
import requests
import time
from urllib.request import quote, unquote
from win10toast import ToastNotifier
import smtplib
from email.mime.text import MIMEText
import keyboard


def edit_data():

    global from_addr
    global to_addr
    global password
    global user_agent

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

    data =

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

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

    file.close()

def load_previous():

    global from_addr
    global to_addr
    global password
    global user_agent

    if os.path.isfile('config.txt'):
      file = open('config.txt','r')
      data = file.readlines()
   
      for i in data:
            from_addr = data.strip('\n')
            to_addr = data.strip('\n')
            password = data.strip('\n')
            user_agent = data.strip('\n')

      file.close()

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

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

      data =

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

      file.close()

def sendemail():

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


    server = smtplib.SMTP_SSL(stmp_server,465,timeout = 2)
    server.login(from_addr,password)
    server.sendmail(from_addr,,msg.as_string())
    server.quit()


def main():

    global name
    global price
    loop_number = 0

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

    number = expectation
    number_without_period = ''

    for i in number:

      if i == '.':
            continue

      else:
            number_without_period = number_without_period + i

    while not str.isdigit(number_without_period):

      print('价格输入有误,请重新输入')
      expectation = input('请输入预警价格,如>100,<50\n')
      number = expectation
      number_without_period = ''

      for i in number:

            if i == '.':
                continue

            else:
                number_without_period = number_without_period + i

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

    while True:

      if keyboard.is_pressed('enter'):
            buffer = input('')
            load_previous()
            break

      elif keyboard.is_pressed('esc'):
            keyboard.wait('esc',True,True)
            edit_data()
            break

      else:
            continue

    encodedname = quote(name)

    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'

    headers = {
            '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',
            'user-agent':user_agent}


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

      loop_number += 1

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

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

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

      if expectation == '>':
            if float(price.text) >= float(number):
            
                try:
                  sendemail()
                  print('通知邮件已发送!')
                  break

                except:
                  print('发送邮件失败')
                  break

      elif expectation == '<':
            if float(price.text) <= float(number):

                try:
                  sendemail()
                  print('通知邮件已发送!')
                  break

                except:
                  print('发送邮件失败')
                  break

      time.sleep(60)


main()
press_enter = input('程序已执行完毕,按Enter键退出')


YouCam 发表于 2021-5-31 12:44:13

竟然没人!

hrp 发表于 2021-5-31 13:09:44

YouCam 发表于 2021-5-31 12:44
竟然没人!

可能是因为没有玩股票的{:10_250:}

YouCam 发表于 2021-5-31 15:57:32

hrp 发表于 2021-5-31 13:09
可能是因为没有玩股票的

也是也是

O2H2O 发表于 2021-6-1 08:43:50

目前还看不懂,先点个赞!可以根据日期爬取某基金的当日净值吗?

YouCam 发表于 2021-6-5 11:14:43

O2H2O 发表于 2021-6-1 08:43
目前还看不懂,先点个赞!可以根据日期爬取某基金的当日净值吗?

这个是爬取股票的,基金可能也行,本质上就是一个小爬虫,然后让Windows系统每隔一分钟通知一下净值
页: [1]
查看完整版本: 自动爬取单只股票价格并在Windows上实时通知,达到目标价格即发邮件