最初想分析数据包,用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()

注意两个地方:

  1. 点击登录后,会弹出一个登录框,这个登录框及其内部的元素通过find_element方法是无法找到的,因为这些内容都放在了一个iframe里,需要使用switch_to_frame切换到登录框所在的这个iframe
  2. 输入用户名和密码并点击登录后,页面内容会根据服务器返回的登录结果发生改变,这过程需要一定时间,而程序会继续执行去获取下一个元素,但这个元素在此时还没产生出来而产生异常,因此需要在程序获取下个元素前执行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,实现什么值得买自动登录并签到相关推荐

  1. Python + Selenium实现163邮箱的自动登录和发送邮件

    运用Python和Selenium实现163邮箱的自动登录和发送邮件 初接触selenium,最近研究了一下用python和Selenium实现163邮箱的自动登录和发送邮件的实现过程,中间出现了各种 ...

  2. python脚本自动qq签到_Python爬虫实现自动登录、签到功能 附代码

    这篇文章主要介绍了Python爬虫实现自动登录.签到功能的代码,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 前几天在一个素材网站上下载东 ...

  3. 网络爬虫playwright实现网站自动登录并签到

    网络爬虫使用playwright工具来替代selenium工具,模拟浏览器加载动态网页,应对使用了json.ajax的复杂网站,从而通过网络爬虫实现网站自动登录并签到,设计思想如下: 1.打开网站登录 ...

  4. Python实战一:什么值得买自动签到

    登录 登录地址 https://zhiyou.smzdm.com/user/login/ajax_check 登录参数 username=11779208@qq.com password=123456 ...

  5. python+selenium自动识别简单验证码实现自动登录

    目录 一.所需要的库 二.实现过程 1.引入库 2.打开网站 3.查找元素 4.识别验证码并输入 5.点击登录按钮,完成登录 三.总结 1.完整代码 2.存在的问题 一.所需要的库 time 控制程序 ...

  6. python+selenium自动登录163邮箱代码提示错误解决方案(如:NoSuchFrameException: Message: no such frame)

    selenium模块实现163邮箱自动登录操作 利用selenium模块控制Chrome浏览器打开163邮箱网页,并实现自动填写账号密码操作. 在Python中利用selenium模块实现这一目的只需 ...

  7. 爬虫三(Bs4搜索、Selenium基本使用、无界面浏览器、Selenium自动登录百度案例、自动获取12306登录验证码案例、切换选项卡、浏览器前进后退、登录Cnblogs获取Cookie自动点赞)

    文章标题 一.Bs4搜索文档树 二.CSS选择器 三.selenium基本使用 四.无界面浏览器 五.selenium其他使用 1)自动登录百度案例 2)获取位置属性大小.文本 3)自动获取12306 ...

  8. selenium实现企查查自动登录

    前言 使用python3.6 selenium包实现用户密码自动登录企查查 编写python函数通过用户名.密码入参返回登录cookie 编写函数 编写get_cookie函数 注意安装chromed ...

  9. 【python】简单使用selenium编写无界面谷歌浏览器的网页登录和签到功能

    使用python编写简单的关于服务器端网页自动登录及签到的功能 注:仅用于测试人员自动化脚本测试,请勿用于其他用途 ------------------------------------------ ...

最新文章

  1. 不用python编程,制作词云图
  2. C# 获取属性的displayName
  3. c/s三层结构信息系统的三个层次_网络资讯:三层架构是什么
  4. 手机被锁在耳机模式了
  5. python scrapy框架 简书_python爬虫框架——Scrapy架构原理介绍
  6. 吐血整理全网最全Spring面试题之高级篇(一)(共25题,附超详细解答)
  7. javascript、jquery获取网页的高度和宽度
  8. 欧洲半导体三巨头的守旧与拓新
  9. 淘宝Tprofiler工具实现分析
  10. linux date英文日期、星期简写说明(中文对照)
  11. win10无线断开无法连接服务器,简单几步解决win10wifi一直断开连接不上的问题
  12. 2022年美赛S奖得主的三次完赛经历
  13. 计算机网速单位是什么,文件大小和网速的单位
  14. 服务器系统2008r2企业版补丁,windows2008R2服务器更新补丁
  15. mysql like查询很慢_MySQL Like模糊查询速度慢的解决方法
  16. 西瓜文案:水果西瓜的文案,水果文案西瓜
  17. 股票自选股基本函数大全-8
  18. 幂律分布 计算机科学,Numpy 发现幂律分布
  19. 根据IP进行城市定位
  20. java中获取某个Date为一年中的第多少周

热门文章

  1. 将十六进制转化为十进制
  2. SQL Server触发器原理及使用
  3. matlab 生成 word 表格,利用MATLAB生成Word文档.doc
  4. .asm下的MASM64
  5. 宁要一个完成,不要千万个开始(转载自豆瓣)
  6. 基于51单片机可调PWM发生器
  7. 给自己一个交代之2020-环境让我成长
  8. oracle 每月同期对比,两年数据同期对比表_月份对比表格怎么做
  9. Boilsoft Video Joiner v9.1.7/v7.02.2 视频无损拼接合并工具
  10. 手机壁纸 | Vlog210808