IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python新手也能看懂的自动签到脚本 -> 正文阅读

[Python知识库]python新手也能看懂的自动签到脚本

起因

出于某种不可明说的目的和某些不可明说的需求,需要一个自动签到脚本,权衡之下使用了selenium库,之所以不用更快更稳定的request是因为这个网站登录的时候会对密码做加密,抓包抓到的密码每次都不一样,不知道怎么搞,所以选了更简单的方案。

运行环境

使用的是selenium库,这个库可以模拟人在浏览器上的操作,简单易懂。

首先安装

pip install selenium

我使用的是chrome浏览器,需要下载对应版本的浏览器驱动才可以使用selenium自动控制,在windows上很简单,先查询浏览器版本,打开chrome,地址栏输入Chrome://version,就能看到版本。
查看版本然后去驱动下载地址http://chromedriver.storage.googleapis.com/index.html,找到对应的驱动,可能没有完全对应浏览器版本号的的驱动,最后两位可以不同。
在这里插入图片描述然后下载下来,具体安装步骤参考这篇博客https://blog.csdn.net/weixin_44318830/article/details/103339273
安装好后,可以尝试运行这段代码来判断运行环境是否正常。

from selenium import webdriver
browser = webdriver.Chrome()#声明浏览器
url = 'https:www.baidu.com'
browser.get(url)
print(browser.page_source)#打印网页源代码
browser.close()#关闭浏览器

如果能成功打印,说明环境一切正常,进入下一步,编写我们自己的脚本。

自动签到部分

简单来说,selenium就是模拟人在浏览器上的操作,我们只要找到需要操作的位置,例如需要填写账号密码的文本框,或者需要点击的按钮,然后使用代码模拟我们的填写或者点击操作。

首先,和上面测试环境的代码类似,我们要打开浏览器,访问需要签到的网址。

from selenium import webdriver

browser = webdriver.Chrome()
url = '这里填要签到的网址'
browser.ger(url)

然后需要插一个简单的小知识,如何在网页上找到我们需要操作的按钮,或者文本框,以chrome浏览器为例,我们需要在这个页面上找到这个按钮。
在这里插入图片描述在chrome浏览器中,点击F12,打开开发者界面。
在这里插入图片描述开发者界面如图所示,点击选择器。
在这里插入图片描述点击选择器。
在这里插入图片描述然后点击要找的按钮,元素这里就会找到网页中这个按钮对应的html代码。
在这里插入图片描述鼠标右键点击对应的代码,选择复制,复制完整xpath。
在这里插入图片描述XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言,可以简单理解为代表一个元素在网页中的位置,可以用xpath定位一个元素。

接下来回到刚才的内容,在打开网页之后,首先我们需要登录。
在这里插入图片描述
这里我们一共需要做三件事,首先输入用户名,然后输入密码,然后点击登录,所以先按照上面的方法找到两个需要输入的文本框的位置,输入用户名和密码,然后找到登录按钮的位置,点击。

这里使用find_element_by_xpath方法,通过xpath定位到需要操作的元素。

from selenium import webdriver

browser = webdriver.Chrome()
url = '这里填要签到的网址'
browser.ger(url)
username_xpath = 'xxxx'#用户名的xpath
passwd_xpath = 'xxxx'#密码的xpath
login_button_xpath = 'xxxx'#登录按钮的xpath

username = 'username'#用户名
passwd = 'passwd'#密码
browser.find_element_by_xpath(username_xpath).send_keys(username)#定位用户名输入框,并输入用户名        
browser.find_element_by_xpath(passwd_xpath).send_keys(passwd)#定位密码输入框,并输入密码
browser.find_element_by_xpath(login_xpath).click()#找到登录按钮并点击

以上代码执行完后,如果没有验证码,我们就登录到了系统,如果有验证码算你倒霉。
剩下的操作与上面类似,签到无非就是输入文字和点击按钮,只要找到相应的元素,然后依次点击就可以,之后的步骤不再赘述。

剩下需要注意的问题有两个,我们一个一个说。

  1. 第一个问题是,有时候在点击当前页面的按钮之后,会打开一个新的标签页,接下来的操作需要在新的页面上做,此时该怎么办?
    首先我们要知道,上文中用于操作的browser是和页面对应的,在点击按钮打开新的标签页后,browser并不会自动跳转到新的标签页,这时候就需要我们手动跳转。假设登录之后,我们点击了一个按钮button1,打开了一个新的标签页,之后要在新标签页上点击button2,我们对以上的代码加以改造。

    首先我们需要获取所有标签页的handle集合,可以把handle简单理解为标签页的代号,只要找到要切换的标签页代号,就能切换到新的标签页。在获取所有标签页的handle之后,如何分辨哪个handle才是新开的那个标签页呢?我我们用排除法,先记录当前标签页的handle,之后遍历handle集合,不是当前标签页handle的就是新标签页的handle(前提是只有两个标签页)。

from selenium import webdriver

browser = webdriver.Chrome()
url = '这里填要签到的网址'
browser.ger(url)
username_xpath = 'xxxx'#用户名的xpath
passwd_xpath = 'xxxx'#密码的xpath
login_button_xpath = 'xxxx'#登录按钮的xpath
button1_xpath = 'xxxxx'
button2_xpath = 'xxxxx'

username = 'username'#用户名
passwd = 'passwd'#密码
current_handle = browser.current_window_handle#获取当前标签页的handel
browser.find_element_by_xpath(username_xpath).send_keys(username)#定位用户名输入框,并输入用户名        
browser.find_element_by_xpath(passwd_xpath).send_keys(passwd)#定位密码输入框,并输入密码
browser.find_element_by_xpath(login_xpath).click()#找到登录按钮并点击
browser.find_element_by_xpath(button1_xpath).click()#我们假设在点击这个按钮以后,打开了一个新的标签页
all_handles = browser.window_handles#获取所有标签页的handle
for handle in all_handles:#遍历排除,获得新标签页的handle
	if handle != current_handle:
		rount_handle = handle
	browser.switch_to.window(rount_handle)#切换到新标签页
browser.find_element_by_xpath(button1_xpath).click()#在新的标签页上点击button2
  1. 第二个问题是如果在当前页面上有弹窗,如何点击弹窗。
    未完待续

邮件通知

那么如果由于某种未知的原因签到不成功,我该如何知道我的脚本执行失败了呢?我的方案是,如果执行过程中出现错误,则发送一封邮件到我的信箱

这里用到了smtplib模块,首先安装模块

pip install PyEmail

不会吧不会吧,不会真有人pip install smtplib然后发现报错了吧,反转了,这个人就是我,总之要用以上的命令安装这个模块

以发信方为163邮箱为例,首先需要去163邮箱开启smtp服务,登录163邮箱,在设置里找到这两项打开
在这里插入图片描述然后在下面新增一个授权
在这里插入图片描述注意,我们在脚本里的邮箱登录密码是这里新增授权之后出现的授权码,而不是邮箱登录密码

发邮件的代码模板如下,因为我只是需要在发生错误的时候得到通知,所以只需要最简单的发信功能

import smtplib
def send_error():
    HOST = "smtp.163.com"
    SUBJECT = "error happens"
    TO = "aloha@cat.cn"
    FROM = "everyone@behappy.com"
    text ="error happened"
    BODY = '\r\n'.join((
        "From: %s" % "webbrowser",
        "TO: %s" % TO,
        "subject: %s" % SUBJECT,
        "",
        text
    ))
    server = smtplib.SMTP()
    server.connect(HOST, '25')
    server.login(FROM, "passwd")
    server.sendmail(FROM, TO, BODY)
    server.quit()

这里的host是smtp服务器的地址,subjuect是邮件的标题,text是邮件内容,TO是收件地址,FROM是发件地址,login这行中passwd需要改为163邮箱授权码,相当于一个专用的邮箱登录密码

然后,我们需要在签到代码执行出问题的时候执行以上的函数,这里要用到python的错误处理机制,感兴趣的同学自行了解,代码如下

try:
	#签到代码
except Exception as e:
	send_error()

这样就可以在捕获到错误时,调用上面写的发邮件的函数

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-03 17:02:17  更:2021-10-03 17:03:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:05:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码