• Python+Selenium做到浏览器所见即所得(全网最简单教程)


    前言

    最近有一些需求,需要抢一些东西,自己用代码写了个脚本。然后现在写个文章记录一下。我争取用最简单的话来写出代码,代码已经脱敏处理,如果要转载,请联系我征求同意。

    环境配置

    代码运行环境

    使用conda虚拟环境,用的python3.9.6,安装pip的包是:msedge-selenium-tools==3.141.4,使用的浏览器是Edge。

    需要下载的东西

    点击跳转下载

    要选对版本,首先看一下自己Edge版本,然后在下载页面ctrl+f搜索这个版本号就行了

    代码实现

    这里肯定不能用我做的任务的代码,我就用我的路由器模拟登录和拨号给大家做个示例。

    文件目录

    那两个视频原本是做了准备发B站出视频教程的,但是B站说我打广告,把视频给我退回了,我也不知道哪里有广告,实在没办法,发不出去,大家将就看。

    全部代码

    这里先把所有代码贴上,然后后面逐行讲解。

    1. # -*- coding: utf-8 -*-
    2. # 文件已经做了脱敏处理
    3. # 作者:ChuckieZhu
    4. # 平台:CSDN
    5. import time
    6. from selenium import webdriver
    7. from selenium.webdriver.support.select import Select
    8. def main():
    9. brower = webdriver.Edge(executable_path="./msedgedriver.exe")
    10. brower.implicitly_wait(20)
    11. brower.get("http://192.168.1.1/") # 自己的浏览器后台,根据路由器不同变化
    12. input("回车开始") # 你们自己实现的时候可以不写
    13. # 输入登陆密码
    14. pwd_input = brower.find_element_by_xpath('//*[@id="lgPwd"]')
    15. pwd_input.clear()
    16. pwd_input.send_keys("这里是密码")
    17. # 点击登录
    18. # time.sleep(10)
    19. brower.find_element_by_xpath('//*[@id="loginSub"]').click() # 点击登录
    20. brower.find_element_by_xpath('//*[@id="routerSetMbtn"]').click() # 跳转到路由设置
    21. brower.find_element_by_xpath('//*[@id="network_rsMenu"]').click() # i点击上网设置
    22. brower.find_element_by_xpath('//*[@id="wanSel"]').click() # 展开上网方式
    23. # 找到上网方式可选列表
    24. uls = brower.find_element_by_xpath('//*[@id="selOptsUlwanSel"]') # 找到列表
    25. lis = uls.find_elements_by_tag_name('li') # 找到了子元素
    26. for li in lis:
    27. print(li.text)
    28. if "宽带" in li.text:
    29. li.click()
    30. break
    31. time.sleep(2)
    32. name = brower.find_element_by_xpath('//*[@id="name"]')
    33. name.clear()
    34. name.send_keys("这里是用户名")
    35. pwd = brower.find_element_by_xpath('//*[@id="psw"]')
    36. pwd.clear()
    37. pwd.send_keys("这里是密码")
    38. brower.find_element_by_xpath('//*[@id="save"]').click() # 点击连接
    39. input("回车退出")
    40. brower.quit()
    41. if __name__ == "__main__":
    42. main()

    逐行讲解

    我这里默认你们把代码原样复制到了自己的编译器里,用行号代指代码。

    7-11行:导入需要的包

    14行:打开浏览器的句柄,这个browser的单词写错了,大家不要在意。

    15行:这里是使用隐式等待,等待元素加载出来之后才会执行下一步动作,可以防止出现“定位不到元素”的错误。这里不建议大家使用time.sleep(10)去等待,因为页面如果1秒加载完了,剩下9秒白等,如果11秒才能加载完,整个程序就崩溃了。

    其实这里的隐式加载也不是太好的解决办法,因为有很多地方会加载很久,但是需要点击的内容已经加载出来可以点击了,可以使用下面的改法:

    1. from selenium.webdriver.common.by import By
    2. from selenium.webdriver.support import expected_conditions as EC # 等待条件
    3. # 多import两个东西
    4. try:
    5. username_input = WebDriverWait(driver=browser, timeout=20).until(
    6. EC.presence_of_element_located(
    7. (By.XPATH, '//*[@id="username"]')
    8. )
    9. ) # 这个元素只要出现就取用
    10. username_input.clear() # 清空内部
    11. username_input.send_keys(username) # 输入名字
    12. del username_input
    13. except Exception as e:
    14. print("[-]: ", str(e))

    16行:打开一个网址

    20-22行:使用xpath路径定位一个元素,操作如下:

    使用F12打开开发者界面,点击这个按钮

    用那个箭头点击自己想用浏览器点击的元素,在右边会自动跳转到代码区,并高亮显示那一个代码区域,右键这个区域:

    复制xpath路径。就是find_element_by_xpath里面的参数。

    20-31: 一系列的寻找点击元素并点击。

    34-40行:这里是一个下拉列表,

    这个其实还是比较麻烦的,因为他不是直接用的selector,如果直接用的html的selector,那么使用下面代码:

    1. from selenium.webdriver.support.select import Select
    2. select = browser.find_element_by_xpath('//*[@id="wanSel"]')
    3. Select(select).select_by_visible_text('宽带拨号上网')
    4. print("选中宽带拨号上网") # 这个只对select适用

     但是它使用的ul和li实现的,点击这个框之后,显示一个列表,然后点击列表选择内容,所以这个地方首先找到父元素,然后在父元素的基础上find_element_by_tag_name(),找到这个列表下的所有的li,然后判断里面的文字。

    注意,这里的break是必须的,如果点击了宽带上网的方式,这个列表就没了,那么后面的元素相应的在html中也都消失了,这时候如果没有break,后面判断li.text的时候,就找不到这个东西了,会报stale element错误。

    42行:页面刷新了,等待刷新,这个时候不能直接找,这个我怀疑使用try-except语句那种方式也可以,这里为了简单使用了sleep

    44-50:输入宽带密码

    52:点击连接按钮。

    55:退出程序时quit掉浏览器。

    后记

    最近项目刚刚结束,不知道下一步咋办,升学之后课程也比较紧张,现在定的大方向是强化学习,后面小方向还正在阅读论文寻找感兴趣的内容。到时候找到了之后慢慢记录吧。

    我也会不定时的做一些小工具,发上来。

    注意事项

    此代码不准用来做抢票等内容,这种行为肯定违反对应平台的规则,希望大家仅仅使用这个代码做路由器后台自动拨号、自动切换账号的脚本!

  • 相关阅读:
    Spring WebJars 教程
    【C++】并查集
    servlet如何获取PUT和DELETE请求的参数
    【Android笔记14】Android基本的UI控件(Chronometer、SeekBar、RatingBar)
    App分发的原理ipa分发系统需求
    217.贪心算法:加油站(力扣)
    网络编程TCP/UDP通信
    Leetcode第309场周赛
    [JavaWeb]_[初级]_[如何更换免费网站字体]
    前端工作小结80-title写活
  • 原文地址:https://blog.csdn.net/qq_38431572/article/details/127682615