写一个哔哩哔哩装扮的数量库存提示

这串代码也能改改用来干别的,初学的PY啥都不懂,大佬们轻喷

前几天看上了一套装扮挺好看的,买的人也不多,可以挑一个喜欢的号段监控,当然人不能时刻盯着界面,就想着能不能用的抓网页html文件再查文本的方式搞到我想要的数据。试了一下,能做到,但是人比较菜,是初学,程序只能前台干活,后台访问就不太会了。。。

一、数据的收集过程

网页链接从手机分享获取

这里在地址栏中输入我们需要访问的装扮的链接之后访问

可以看到我们访问的链接不再是我们所复制的链接,同时网页会变成这个样子

此时我们为PC访问,被导向到了PC 的界面

查看源代码也不能获得我们想要的数据

此时可以在进入网页前启用F12调试并点击(一定要在进入网页前就完成F12调试移动设备模拟,先进网站再开F12只会改变分辨率,因为你已经被导向到了电脑版的下载网址,刷新也是没有用的,只能重新访问原来咱们复制的原始网页)

左侧第二个按钮切换访问设备

此时模拟移动设备后再访问网页即可成功完成页面的获取

查看一下源代码(这里用浏览器查询是看不到的,类似于下边,在界面里Ctrl+s保存网页可以再HTML文件中看到,这也就是我们要找的东西)

VSCode中查看可以看到我们想要的数据

好,到这里我们已经完成了一次数据的获取流程,接下来的任务就是找到我们需要的数据

 

在Python中我们字符串的查找并不困难

 def find_string_in_file(file_path, string_to_find):
        # 打开文件并读取内容
        with open(file_path, 'r', encoding='utf-8') as file:
            content = file.read()

        # 查找字符串
        if string_to_find in content:
            print(f'找到了字符串 "{string_to_find}"')
            
        else:
            print(f'没有找到字符串 "{string_to_find}"')

    # 指定文件路径和要查找的字符串
    file_path = '这里需要放你的浏览器下载的文件的目录,哔哩哔哩装扮的网页文件名是  个性装扮.html  C:/Users/Suzur/Downloads/个性装扮.html'
    string_to_find = '33335套'
    # 这里放你需要查找的字符串,可以多放几个把预警位往前提几个

    # 在文件中查找字符串
    find_string_in_file(file_path, string_to_find)

上边的代码,在找到我们指定的字符串后会给我们打印输出是否正确,到这里,我们就完成了一次获取数据,查找数据的过程。但是人不能总是重复这个过程,所以交给电脑来干活更为合适

二、使用Python来进行自动化操作

使用Python进行自动化操作,需要用到比较重要的组件:WebDrive和selenium,在这里我们用Edge的驱动,chrome相对来说下载速度太慢,在国内用Edge是更好的选择,edge驱动一定要和自己edge的版本一致,查看edge版本需要在edge地址栏中输入

edge://version/

即可看到edge版本

下载链接:edge driver:Microsoft Edge WebDriver | Microsoft Edge Developer

选择对应自己版本的下载即可,下载完毕后将解压的exe文件放到自己的Python安装目录下并复制一份重命名为:MicrosoftWebDriver.exe

Selenium可以在Pycharm中下载,或者在你的Python目录中找到pip.exe

因为我的Python是VS给装的,所以我没有重新下载Python,我的pip目录如下,如果大家伙们在PY安装目录中找不到可以试试这个:C:\Users\Suzur\AppData\Roaming\Python\Python39\Scripts

在CMD中可以输入以下代码(需要配置Path环境变量或者在PIP的目录下进行):

pip install selenium

然后等他自己跑完就行了

装完这两个组件之后即可用Python代码启动浏览器了

def post_url(): 

    op = webdriver.EdgeOptions()
    op.add_experimental_option("detach", True)

    driver = webdriver.Edge(options=op)  # 实例化一个浏览器对象()

    # 将浏览器窗口设置为全屏
    driver.maximize_window()

    driver.get('https://www.baidu.com/')

启动后浏览器会打开百度的主页,接下来,我们用一种比较简单粗暴的办法继续下边的操作

使用一个库:

pyautogui

这个库可以模拟鼠标点击和键盘输入,借此自动让他完成我们需要的效果

安装也和上边的Selenium库是一样滴~

具体的操作流程可能根据不同的电脑有不同的差异。所以我的代码只是提供参考,具体实现还得看大家的具体配置:

def autogui():
  
  pyautogui.hotkey('f12')

    # 等待控制台打开
    time.sleep(2)

   #点击空白处取消干扰
  #  pyautogui.click()

    # 模拟按下左移键
    pyautogui.press('left')

    # 模拟按下回车键
    pyautogui.press('enter')
    time.sleep(8)
    pyautogui.moveTo(1541, 104)
    # 因为浏览器默认打开的是无账户的,所以可能在收藏位置有弹窗,这个是用来点击关闭弹窗的
    # 另外本程序开发使用的是1080p屏幕,对应的坐标如果不合适需要自己修改

    # 点击鼠标左键以选中地址栏
    pyautogui.click()
    time.sleep(2)

    # 模拟按下Ctrl+Shift+M组合键以切换到移动设备仿真
    pyautogui.hotkey('ctrl', 'shift', 'm')
    # time.sleep(3)

    # 获取当前鼠标的屏幕坐标
    x, y = pyautogui.position()
    #print(f'The coordinates of the address bar are ({x}, {y})')

    # 等待一段时间以确保设备模式已经切换
    time.sleep(2)
    pyautogui.moveTo(487,167)
    # 这个点击用来选择设备
    time.sleep(1)
    pyautogui.click();
    time.sleep(1)
    pyautogui.moveTo(487, 240)
    # 选择第一个,edge上的应该是iPhone SE
    time.sleep(1)
    pyautogui.click()
    # 这里就是你需要监控的装扮的网址,复制替换即可
    pyperclip.copy('https://www.bilibili.com/h5/mall/suit/detail?id=36438&navhide=1&f_source=shop&from=rebbar_btn&from_id=&native.theme=1&night=0')

    # 等待一段时间以确保网址已经复制到剪贴板
    time.sleep(1)

    # 移动鼠标到地址栏(你需要提供正确的坐标)
    pyautogui.moveTo(858, 67)
    # 点击地址栏进行粘贴
    # 点击鼠标左键以选中地址栏
    pyautogui.click()
    time.sleep(1)

    # 粘贴剪贴板中的网址
    pyautogui.hotkey('ctrl', 'v')
    time.sleep(1)

    # 按下回车键以访问新的网页
    pyautogui.press('enter')
    time.sleep(4)
    x, y = pyautogui.position()
    #print(f'The coordinates of the address bar are ({x}, {y})')
    pyautogui.moveTo(627, 787)
    pyautogui.click()
    # 这里选择点击手机端界面来向下滑动,本意是打算用来看看是不是没滑动导致没有播报数据,后来发现是因为没有登录数据,没登陆哔哩哔哩账户不会显示播报
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.hotkey("ctrl","s")
    time.sleep(1)
    # 这里是用来进行保存确定的,重复覆盖保存会有提示
    pyautogui.press('enter')
    # 模拟按下左移键
    pyautogui.press('left')

    # 模拟按下回车键
    pyautogui.press('enter')
    time.sleep(10)
    driver.quit()

在上边的代码中我们用到了另外一个库:pyperclip

这个库用来将内容复制到剪贴板,因为我们的F12调试已经设定好了,接下来需要做的就是将网址放上去,这个库就是为了将网址放上去而引用的

接下来,整套的自动化流程都已经完成了。但是只会干活可不行,还等能说话。该如何让我们的程序可以告诉我们消息呢?

三、通知发送,使用网易邮箱进行邮件的发送达到通知我们的目的

Python可以进行邮件发送,对于国内来说,轻松获取到授权码和进行管理的邮箱我比较推荐网易,这里使用的是126和163其实都无所谓,管理界面都是一样的

以163邮箱为例,登录自己的163邮箱,主界面上点击设置---POP3/SMTP/IMAP

进去后将状态修改为开启,每个用户默认是关闭的

之后会出现一个授权码,拍照也好,复制也好,截图也好,保存好,只会出现一次,当然也可以自行添加授权码。

授权码用于登录邮箱,我们的程序或者其他的邮箱登录网易邮箱需要的都是授权码而不是用户密码

启动后就可以了。

还记得我们的输出吗

我们这里可以使用if-else进行对应操作

send email邮件发送函数

    def send_email(subject, content, sender, password, receivers):
        # 创建一个SMTP对象
        smtp = smtplib.SMTP('smtp.163.com')

        # 登录SMTP服务器
        smtp.login(sender, password)
        for receiver in receivers:
            msg = MIMEText(content, 'plain', 'utf-8')
            msg['Subject'] = Header(subject, 'utf-8')
            msg['From'] = sender
            msg['To'] = receiver
            # 发送邮件
            smtp.send_message(msg)

        # 退出SMTP服务器
        smtp.quit()

在if中添加发送邮件函数的调用

    if string_to_find in content:
            #print(f'找到了字符串 "{string_to_find}"')
            text_box.insert(tk.END, "查找结果:成功!")
            # 指定邮件的主题、内容、发件人、密码和收件人
            subject = '自己定义一个邮件主题'
            content = (f'在文件"{file_path}"中找到了字符串 "{string_to_find}"'
                       f'网址:这里放你的装扮地址')
            sender = '你申请的用于发送邮件的邮箱'
            password = '在这里填写你的授权码,邮箱授权码需要在网易邮箱开启SMTP/POP3/IMAP服务,默认是关闭的,打开后授权码只会出现与一次,妥善报关,这里不是你的邮箱密码!!!'
            receivers = ['发送邮箱1','发送邮箱2',
                         '发送邮箱3']

            # 发送邮件
            send_email(subject, content, sender, password, receivers)
            #print("发送完毕")
            text_box.insert(tk.END, "发送结果:完毕,已发送")
        else:
            #print(f'没有找到字符串 "{string_to_find}"')
            text_box.insert(tk.END, "查找结果:暂无")
            subject = '本次扫描没有找到对应的字符'
            content = f'在文件"{file_path}"中未找到字符串 "{string_to_find}",暂时还不用去买'
            sender = '你申请的用于发送邮件的邮箱'
            password = '在这里填写你的授权码,邮箱授权码需要在网易邮箱开启SMTP/POP3/IMAP服务,默认是关闭的,打开后授权码只会出现与一次,妥善报关,这里不是你的邮箱密码!!!'
            receivers = ['发送邮箱1', '发送邮箱2',
                        '发送邮箱3']
            # send_email(subject, content, sender, password, receivers)
            # 其实这里是没有找到时也发送一下,如果需要可以删掉上一句的注释启用发送代码
            #print("发送完毕")
            text_box.insert(tk.END, "发送结果:完毕,已发送")

这样我们就完成了一次完整的过程 

但这还不够,我们需要它定时为我们查找一次,所以我们可以继续操作

这里引入库:

schedule

由它来实现定时

def job():
    # 这里调用你的函数
    post_url()

# 每个小时执行一次job函数
schedule.every(1).hours.do(job)

# 主循环,用于持续运行,直到手动停止
while True:
    schedule.run_pending()
    time.sleep(1)

这样程序会每小时执行一次操作,不关闭程序就不会终止

四、完整程序代码

最后是完整的程序代码

from selenium import webdriver
import pyautogui
import pyperclip
import time
import os
import glob
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import schedule
import tkinter as tk

# 创建GUI的函数
def create_gui():
    # 创建一个窗口
    window = tk.Tk()
    # 设置窗口的标题
    window.title("我的程序")

    # 创建一个标签,显示"程序正在运行"
    label = tk.Label(window, text="程序正在运行")
    label.pack()

    # 创建一个文本框,用于显示程序的输出
    text_box = tk.Text(window)
    text_box.pack()

    # 返回窗口和文本框,以便在其他地方使用
    return window, text_box

def post_url():
    # 创建GUI,并获取窗口和文本框
    window, text_box = create_gui()

    # 对于这个浏览器进行一系列的操作
    # 4.10版本配置
    op = webdriver.EdgeOptions()
    op.add_experimental_option("detach", True)

    driver = webdriver.Edge(options=op)  # 实例化一个浏览器对象()

    # 将浏览器窗口设置为全屏
    driver.maximize_window()

    driver.get('https://www.baidu.com/')
    # 先转到百度或者必应,或其他主页,不要在进入哔哩哔哩后再开F12刷新,没用的,先开F12再进网页才能成功

    # 等待页面加载
    time.sleep(2)

    # 获取当前鼠标的屏幕坐标
    x, y = pyautogui.position()
    #print(f'The coordinates of the address bar are ({x}, {y})')

    # 模拟按下F12键
    pyautogui.hotkey('f12')

    # 等待控制台打开
    time.sleep(2)

   #点击空白处取消干扰
  #  pyautogui.click()

    # 模拟按下左移键
    pyautogui.press('left')

    # 模拟按下回车键
    pyautogui.press('enter')
    time.sleep(8)
    pyautogui.moveTo(1541, 104)
    # 因为浏览器默认打开的是无账户的,所以可能在收藏位置有弹窗,这个是用来点击关闭弹窗的
    # 另外本程序开发使用的是1080p屏幕,对应的坐标如果不合适需要自己修改

    # 点击鼠标左键以选中地址栏
    pyautogui.click()
    time.sleep(2)

    # 模拟按下Ctrl+Shift+M组合键以切换到移动设备仿真
    pyautogui.hotkey('ctrl', 'shift', 'm')
    # time.sleep(3)

    # 获取当前鼠标的屏幕坐标
    x, y = pyautogui.position()
    #print(f'The coordinates of the address bar are ({x}, {y})')

    # 等待一段时间以确保设备模式已经切换
    time.sleep(2)
    pyautogui.moveTo(487,167)
    # 这个点击用来选择设备
    time.sleep(1)
    pyautogui.click();
    time.sleep(1)
    pyautogui.moveTo(487, 240)
    # 选择第一个,edge上的应该是iPhone SE
    time.sleep(1)
    pyautogui.click()
    # 这里就是你需要监控的装扮的网址,复制替换即可
    pyperclip.copy('https://www.bilibili.com/h5/mall/suit/detail?id=36438&navhide=1&f_source=shop&from=rebbar_btn&from_id=&native.theme=1&night=0')

    # 等待一段时间以确保网址已经复制到剪贴板
    time.sleep(1)

    # 移动鼠标到地址栏(你需要提供正确的坐标)
    pyautogui.moveTo(858, 67)
    # 点击地址栏进行粘贴
    # 点击鼠标左键以选中地址栏
    pyautogui.click()
    time.sleep(1)

    # 粘贴剪贴板中的网址
    pyautogui.hotkey('ctrl', 'v')
    time.sleep(1)

    # 按下回车键以访问新的网页
    pyautogui.press('enter')
    time.sleep(4)
    x, y = pyautogui.position()
    #print(f'The coordinates of the address bar are ({x}, {y})')
    pyautogui.moveTo(627, 787)
    pyautogui.click()
    # 这里选择点击手机端界面来向下滑动,本意是打算用来看看是不是没滑动导致没有播报数据,后来发现是因为没有登录数据,没登陆哔哩哔哩账户不会显示播报
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.press('down')
    pyautogui.hotkey("ctrl","s")
    time.sleep(1)
    # 这里是用来进行保存确定的,重复覆盖保存会有提示
    pyautogui.press('enter')
    # 模拟按下左移键
    pyautogui.press('left')

    # 模拟按下回车键
    pyautogui.press('enter')
    time.sleep(10)
    driver.quit()
    # 休眠十秒等待下载完毕,然后关闭浏览器


    # 这里是连接你的邮箱并发送邮件,可以自己去申请一个126或者163邮箱

    def send_email(subject, content, sender, password, receivers):
        # 创建一个SMTP对象
        smtp = smtplib.SMTP('smtp.163.com')

        # 登录SMTP服务器
        smtp.login(sender, password)
        for receiver in receivers:
            msg = MIMEText(content, 'plain', 'utf-8')
            msg['Subject'] = Header(subject, 'utf-8')
            msg['From'] = sender
            msg['To'] = receiver
            # 发送邮件
            smtp.send_message(msg)

        # 退出SMTP服务器
        smtp.quit()

    def find_string_in_file(file_path, string_to_find):
        # 打开文件并读取内容
        with open(file_path, 'r', encoding='utf-8') as file:
            content = file.read()

        # 查找字符串
        if string_to_find in content:
            #print(f'找到了字符串 "{string_to_find}"')
            text_box.insert(tk.END, "查找结果:成功!")
            # 指定邮件的主题、内容、发件人、密码和收件人
            subject = '自己定义一个邮件主题'
            content = (f'在文件"{file_path}"中找到了字符串 "{string_to_find}"'
                       f'网址:https://www.bilibili.com/h5/mall/suit/detail?id=36438&navhide=1&f_source=shop&from=rebbar_btn&from_id=&native.theme=1&night=0')
            sender = '你申请的用于发送邮件的邮箱'
            password = '在这里填写你的授权码,邮箱授权码需要在网易邮箱开启SMTP/POP3/IMAP服务,默认是关闭的,打开后授权码只会出现与一次,妥善报关,这里不是你的邮箱密码!!!'
            receivers = ['发送邮箱1','发送邮箱2',
                         '发送邮箱3']

            # 发送邮件
            send_email(subject, content, sender, password, receivers)
            #print("发送完毕")
            text_box.insert(tk.END, "发送结果:完毕,已发送")
        else:
            #print(f'没有找到字符串 "{string_to_find}"')
            text_box.insert(tk.END, "查找结果:暂无")
            subject = '本次扫描没有找到对应的字符'
            content = f'在文件"{file_path}"中未找到字符串 "{string_to_find}",暂时还不用去买'
            sender = '你申请的用于发送邮件的邮箱'
            password = '在这里填写你的授权码,邮箱授权码需要在网易邮箱开启SMTP/POP3/IMAP服务,默认是关闭的,打开后授权码只会出现与一次,妥善报关,这里不是你的邮箱密码!!!'
            receivers = ['发送邮箱1', '发送邮箱2',
                        '发送邮箱3']
            # send_email(subject, content, sender, password, receivers)
            # 其实这里是没有找到时也发送一下,如果需要可以删掉上一句的注释启用发送代码
            #print("发送完毕")
            text_box.insert(tk.END, "发送结果:完毕,已发送")

    # 指定文件路径和要查找的字符串
    file_path = '这里需要放你的浏览器下载的文件的目录,哔哩哔哩装扮的网页文件名是  个性装扮.html  C:/Users/Suzur/Downloads/个性装扮.html'
    string_to_find = '33335套'
    # 这里放你需要查找的字符串,可以多放几个把预警位往前提几个

    # 在文件中查找字符串
    find_string_in_file(file_path, string_to_find)
    window.mainloop()
if __name__ == '__main__':
    post_url()
def job():
    # 这里调用你的函数
    post_url()

# 每个小时执行一次job函数
schedule.every(1).hours.do(job)

# 主循环,用于持续运行,直到手动停止
while True:
    schedule.run_pending()
    time.sleep(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值