学习selenium,实现什么值得买自动登录并签到
最初想分析数据包,用requests加上登录状态的cookies发送请求来实现张大妈的自动签到功能,但怎么也抓不到签到的这个数据包,可能是写进js里了吧,将来再慢慢分析。
正好想学selenium,于是就学用selenium来实现。
环境
win7 + python3.6 + selenium + Chrome
selenium稍许有些大,国内使用官方源速度慢经常失败,建议使用国内镜像
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
除了要安装Chrome,还需对照Chrome版本号下载相应版本的chromedriver
下载地址:http://chromedriver.storage.googleapis.com/index.html
版本号对照:https://sites.google.com/a/chromium.org/chromedriver/downloads
下载解压后得到chromedriver.exe
文件,复制到windows环境变量的path包含的目录内,一般放在python安装目录里的scripts目录。(放置的目录必须包含在path内,否则无法找到运行该driver)
基础功能实现
对于浏览网页的最基本操作,不外乎打开浏览器、打开网站、找到需要的链接按钮等控件、对控件进行如点击拖拽等操作、输入文字,将这些动作与代码对照起来就更容易理解了
手动操作 | 程序操作 | 代码 |
---|---|---|
打开浏览器 | 初始化浏览器 |
browser = webdriver.Chrome()
|
打开网站 | 浏览器加载网站 |
browser.get('http://www.smzdm.com')
|
找到按钮 | 定位按钮 |
button = browser.find_element_by_class_name('按钮的class')
|
点击按钮 | 模拟点击按钮 |
button.click()
|
找到输入框 | 定位输入框 |
input = browser.find_element_by_id('输入框的id')
|
输入文字 | 将文字发送至输入框 |
input.send_keys('######')
|
其中定位方法可根据需要选择class、id、css选择器等等:
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
以上这些是选择单个元素,若存在多个符合条件的也只选择第一个元素,若要选择所有符合条件的元素,应使用复数单词elements,如find_elements_by_id
,这样得到的是一个列表,列表里每个元素就是符合条件的元素。
实现代码
from selenium import webdriver# 初始化浏览器
browser = webdriver.Chrome()# 加载张大妈首页
browser.get('http://www.smzdm.com')# 定位登录按钮,并模拟点击
button_login = browser.find_element_by_class_name('J_login_trigger')
button_login.click()# 点击登录按钮后,在页面生成一个包含登录框的iframe,切换至该iframe
browser.switch_to_frame('J_login_iframe')# 定位用户名和密码输入框,并键入用户名密码
username = browser.find_element_by_id('username')
password = browser.find_element_by_id('password')
username.send_keys('######')
password.send_keys('******')# 定位登录按钮,模拟点击进行登录
button_submit = browser.find_element_by_id('login_submit')
button_submit.click()# 隐式等待10s,若规定时间内后续节点未加载出来则抛出异常
browser.implicitly_wait(10)# 定位签到按钮,模拟点击完成签到
sign_button = browser.find_element_by_class_name('J_punch')
sign_button.click()# 退出浏览器
browser.quit()
注意两个地方:
- 点击登录后,会弹出一个登录框,这个登录框及其内部的元素通过
find_element
方法是无法找到的,因为这些内容都放在了一个iframe里,需要使用switch_to_frame
切换到登录框所在的这个iframe - 输入用户名和密码并点击登录后,页面内容会根据服务器返回的登录结果发生改变,这过程需要一定时间,而程序会继续执行去获取下一个元素,但这个元素在此时还没产生出来而产生异常,因此需要在程序获取下个元素前执行
implicitly_wait()
进行等待,参数为需等待的时间,若在等待时间内下个元素产生了则继续执行,若过了等待时间下个元素还未产生,则抛出异常。
继续优化
使用cookies免登录
可以调用get_cookies()
将登录成功后的cookies保存下来,等下次打开网站的时候,再调用add_cookie()
方法将保存的cookies写入浏览器中,这样就变成了已登录状态,无需再进行登录操作了
保存cookies
# 保存cookies
import json
with open('cookies.txt', 'w') as file:cookies = browser.get_cookies()# 将cookies编码成json格式并直接写入文件json.dump(cookies, file)
这段代码最好放在程序最后浏览器退出之前,因为在登录后立即读取的cookies很可能还是未更新的未登录状态cookies,因此在浏览器退出前再读取并保存cookies,确保保存的是已登录状态的cookies。
另外get_cookies()
得到的是一个list列表,元素为单引号的字典格式,使用json.dump()
可以将其格式化为双引号的标准json格式并直接写入文件。若将list列表强制转为str并存入文件中,将来读取文件为str后转回list就比较困难了,有个技巧使用eval()来进行转换。
有了登录状态的cookies后,原程序可以如下简化
from selenium import webdriver
import jsonbrowser = webdriver.Chrome()
browser.get('http://www.smzdm.com')# 读取cookies,并格式化为json
with open('cookies.txt', 'r') as file:cookies = json.load(file)# 先清空原cookies,确保不受其他内容影响
browser.delete_all_cookies()# 逐条写入每项cookie内容
for cookie in cookies:browser.add_cookie(cookie)# 刷新浏览器,使写入的cookies生效
browser.refresh()# 签到操作
button = browser.find_element_by_class_name('J_punch')
button.click()browser.quit()
注意:json.load()从文件取出的是list列表,每个元素是一个字典,而add_cookie()只接受字典类型,因此需要遍历列表将每个字典里的cookies内容添加至浏览器。
不加载图片,加快速度
打开网站的时候速度会比较慢,因为张大妈里图片实在太多,而我们的操作根本不需要加载这些图片,因此可以将浏览器设置为不加载图片模式
# 设置chrome选项为不加载图像
chrome_options = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs", prefs)# 根据chrome选项驱动开启浏览器
browser = webdriver.Chrome(chrome_options=chrome_options)
# 加载网页
browser.get('http://www.smzdm.com')
使用cookies免登陆签到,加载图片需要57秒,不加载图片仅需16秒即可完成。
晕死,刚写完最后一句话收到张大妈冻结账号的短信…
学习selenium,实现什么值得买自动登录并签到相关推荐
- Python + Selenium实现163邮箱的自动登录和发送邮件
运用Python和Selenium实现163邮箱的自动登录和发送邮件 初接触selenium,最近研究了一下用python和Selenium实现163邮箱的自动登录和发送邮件的实现过程,中间出现了各种 ...
- python脚本自动qq签到_Python爬虫实现自动登录、签到功能 附代码
这篇文章主要介绍了Python爬虫实现自动登录.签到功能的代码,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 前几天在一个素材网站上下载东 ...
- 网络爬虫playwright实现网站自动登录并签到
网络爬虫使用playwright工具来替代selenium工具,模拟浏览器加载动态网页,应对使用了json.ajax的复杂网站,从而通过网络爬虫实现网站自动登录并签到,设计思想如下: 1.打开网站登录 ...
- Python实战一:什么值得买自动签到
登录 登录地址 https://zhiyou.smzdm.com/user/login/ajax_check 登录参数 username=11779208@qq.com password=123456 ...
- python+selenium自动识别简单验证码实现自动登录
目录 一.所需要的库 二.实现过程 1.引入库 2.打开网站 3.查找元素 4.识别验证码并输入 5.点击登录按钮,完成登录 三.总结 1.完整代码 2.存在的问题 一.所需要的库 time 控制程序 ...
- python+selenium自动登录163邮箱代码提示错误解决方案(如:NoSuchFrameException: Message: no such frame)
selenium模块实现163邮箱自动登录操作 利用selenium模块控制Chrome浏览器打开163邮箱网页,并实现自动填写账号密码操作. 在Python中利用selenium模块实现这一目的只需 ...
- 爬虫三(Bs4搜索、Selenium基本使用、无界面浏览器、Selenium自动登录百度案例、自动获取12306登录验证码案例、切换选项卡、浏览器前进后退、登录Cnblogs获取Cookie自动点赞)
文章标题 一.Bs4搜索文档树 二.CSS选择器 三.selenium基本使用 四.无界面浏览器 五.selenium其他使用 1)自动登录百度案例 2)获取位置属性大小.文本 3)自动获取12306 ...
- selenium实现企查查自动登录
前言 使用python3.6 selenium包实现用户密码自动登录企查查 编写python函数通过用户名.密码入参返回登录cookie 编写函数 编写get_cookie函数 注意安装chromed ...
- 【python】简单使用selenium编写无界面谷歌浏览器的网页登录和签到功能
使用python编写简单的关于服务器端网页自动登录及签到的功能 注:仅用于测试人员自动化脚本测试,请勿用于其他用途 ------------------------------------------ ...
最新文章
- 不用python编程,制作词云图
- C# 获取属性的displayName
- c/s三层结构信息系统的三个层次_网络资讯:三层架构是什么
- 手机被锁在耳机模式了
- python scrapy框架 简书_python爬虫框架——Scrapy架构原理介绍
- 吐血整理全网最全Spring面试题之高级篇(一)(共25题,附超详细解答)
- javascript、jquery获取网页的高度和宽度
- 欧洲半导体三巨头的守旧与拓新
- 淘宝Tprofiler工具实现分析
- linux date英文日期、星期简写说明(中文对照)
- win10无线断开无法连接服务器,简单几步解决win10wifi一直断开连接不上的问题
- 2022年美赛S奖得主的三次完赛经历
- 计算机网速单位是什么,文件大小和网速的单位
- 服务器系统2008r2企业版补丁,windows2008R2服务器更新补丁
- mysql like查询很慢_MySQL Like模糊查询速度慢的解决方法
- 西瓜文案:水果西瓜的文案,水果文案西瓜
- 股票自选股基本函数大全-8
- 幂律分布 计算机科学,Numpy 发现幂律分布
- 根据IP进行城市定位
- java中获取某个Date为一年中的第多少周
热门文章
- 将十六进制转化为十进制
- SQL Server触发器原理及使用
- matlab 生成 word 表格,利用MATLAB生成Word文档.doc
- .asm下的MASM64
- 宁要一个完成,不要千万个开始(转载自豆瓣)
- 基于51单片机可调PWM发生器
- 给自己一个交代之2020-环境让我成长
- oracle 每月同期对比,两年数据同期对比表_月份对比表格怎么做
- Boilsoft Video Joiner v9.1.7/v7.02.2 视频无损拼接合并工具
- 手机壁纸 | Vlog210808