厌倦了逆向,还是总结下 selenium 吧。

简介: 厌倦了逆向,还是总结下 selenium 吧。

selenium标签页的切换

当selenium控制浏览器打开多个标签页时,如何控制浏览器在不同的标签页中进行切换呢?需要我们做以下两步:

  • 获取所有标签页的窗口句柄
  • 利用窗口句柄字切换到句柄指向的标签页

具体的方法:

# 1. 获取当前所有的标签页的句柄构成的列表
current_windows = driver.window_handles
# 2. 根据标签页句柄列表索引下标进行切换
driver.switch_to.window(current_windows[0])

代码示例:

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
time.sleep(1)
driver.find_element_by_id('kw').send_keys('python')
time.sleep(1)
driver.find_element_by_id('su').click()
time.sleep(1)
# 通过执行js来新开一个标签页
js = 'window.open("https://www.sogou.com");'
driver.execute_script(js)
time.sleep(1)
# 1. 获取当前所有的窗口
windows = driver.window_handles
time.sleep(2)
# 2. 根据窗口索引进行切换
driver.switch_to.window(windows[0])
time.sleep(2)
driver.switch_to.window(windows[1])
time.sleep(6)
driver.quit()

switch_to 切换 frame 标签

参考代码:

import time
from selenium import webdriver
driver = webdriver.Chrome()
url = 'https://mail.qq.com/cgi-bin/loginpage'
driver.get(url)
time.sleep(2)
login_frame = driver.find_element_by_id('login_frame') # 根据id定位 frame元素
driver.switch_to.frame(login_frame) # 转向到该frame中
driver.find_element_by_xpath('//*[@id="u"]').send_keys('1596930226@qq.com')
time.sleep(2)
driver.find_element_by_xpath('//*[@id="p"]').send_keys('hahamimashicuode')
time.sleep(2)
driver.find_element_by_xpath('//*[@id="login_button"]').click()
time.sleep(2)
"""操作frame外边的元素需要切换出去"""
windows = driver.window_handles
driver.switch_to.window(windows[0])
content = driver.find_element_by_class_name('login_pictures_title').text
print(content)
driver.quit()

切换到定位的frame标签嵌套的页面中

driver.switch_to.frame(通过find_element_by函数定位的frame、iframe标签对象)

利用切换标签页的方式切出frame标签

windows = driver.window_handles
driver.switch_to.window(windows[0])

selenium对cookie的处理

获取cookie

driver.get_cookies()返回列表,其中包含的是完整的cookie信息,不光有 name、value,还有 domain 等 cookie 其他维度的信息。

所以如果想要把获取的 cookie 信息和 requests 模块配合使用的话,需要转换为 name、value 作为键值对的 cookie 字典

# 获取当前标签页的全部cookie信息
print(driver.get_cookies())
# 把cookie转化为字典
cookies_dict = {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}

删除cookie

#删除一条cookie
driver.delete_cookie("CookieName")
# 删除所有的cookie
driver.delete_all_cookies()

selenium 控制浏览器执行 js 代码

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.itcast.cn/")
time.sleep(1)
js = 'window.scrollTo(0,document.body.scrollHeight)' # js语句
driver.execute_script(js) # 执行js的方法
time.sleep(5)
driver.quit()

执行 js 的方法:driver.execute_script(js)


页面等待

强制等待

其实就是time.sleep()

缺点是不智能,设置的时间太短,元素还没有加载出来;设置的时间太长,则会浪费时间

隐式等待

隐式等待针对的是元素定位,隐式等待设置了一个时间,在一段时间内判断元素是否定位成功,如果完成了,就进行下一步

在设置的时间内没有定位成功,则会报超时加载

示例代码:

from selenium import webdriver
driver = webdriver.Chrome()  
driver.implicitly_wait(10) # 隐式等待,最长等20秒  
driver.get('https://www.baidu.com')
driver.find_element_by_xpath()

显式等待

每经过多少秒就查看一次等待条件是否达成,如果达成就停止等待,继续执行后续代码

如果没有达成就继续等待直到超过规定的时间后,报超时异常

示例代码:

from selenium import webdriver  
from selenium.webdriver.support.wait import WebDriverWait  
from selenium.webdriver.support import expected_conditions as EC  
from selenium.webdriver.common.by import By 
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 显式等待
WebDriverWait(driver, 20, 0.5).until(
    EC.presence_of_element_located((By.LINK_TEXT, '好123')))  
# 参数20表示最长等待20秒
# 参数0.5表示0.5秒检查一次规定的标签是否存在
# EC.presence_of_element_located((By.LINK_TEXT, '好123')) 表示通过链接文本内容定位标签
# 每0.5秒一次检查,通过链接文本内容定位标签是否存在,如果存在就向下继续执行;如果不存在,直到20秒上限就抛出异常
print(driver.find_element_by_link_text('好123').get_attribute('href'))
driver.quit()

手动实现页面等待

利用强制等待和显式等待的思路来手动实现

不停的判断或有次数限制的判断某一个标签对象是否加载完毕(是否存在)

实现代码如下:

import time
from selenium import webdriver
driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver')
driver.get('https://www.xxxbao.com/')
time.sleep(1)
# i = 0
# while True:
for i in range(10):
    i += 1
    try:
        time.sleep(3)
        element = driver.find_element_by_xpath('//div[@class="shop-inner"]/h3[1]/a')
        print(element.get_attribute('href'))
        break
    except:
        js = 'window.scrollTo(0, {})'.format(i*500) # js语句
        driver.execute_script(js) # 执行js的方法
driver.quit()

selenium 开启无界面模式

实例化配置对象 options = webdriver.ChromeOptions()

配置对象添加开启无界面模式的命令 options.add_argument("--headless")

配置对象添加禁用gpu的命令 options.add_argument("--disable-gpu")

实例化带有配置对象的driver对象 driver = webdriver.Chrome(chrome_options=options)

注意:

macos 中 chrome 浏览器 59+ 版本,Linux 中 57+ 版本才能使用无界面模式!

参考代码如下:

from selenium import webdriver
options = webdriver.ChromeOptions() # 创建一个配置对象
options.add_argument("--headless") # 开启无界面模式
options.add_argument("--disable-gpu") # 禁用gpu
# options.set_headles() # 无界面模式的另外一种开启方式
driver = webdriver.Chrome(chrome_options=options) # 实例化带有配置的driver对象
driver.get('http://www.itcast.cn')
print(driver.title)
driver.quit()

selenium 使用代理 ip

实例化配置对象  options = webdriver.ChromeOptions()

配置对象添加使用代理ip的命令 options.add_argument('--proxy-server=http://x.x.x.x:端口')

实例化带有配置对象的driver对象 driver = webdriver.Chrome('./chromedriver', chrome_options=options)

参考代码如下:

from selenium import webdriver
options = webdriver.ChromeOptions() # 创建一个配置对象
options.add_argument('--proxy-server=http://xxx.xx.xx.xx:端口') # 使用代理ip
driver = webdriver.Chrome(chrome_options=options) # 实例化带有配置的driver对象
driver.get('http://www.itcast.cn')
print(driver.title)
driver.quit()

selenium 替换 user-agent

实例化配置对象 options = webdriver.ChromeOptions()

配置对象添加替换UA的命令 options.add_argument('--user-agent=Mozilla/5.0 HAHA')

实例化带有配置对象的driver对象 driver = webdriver.Chrome('./chromedriver', chrome_options=options)

参考代码如下:

from selenium import webdriver
options = webdriver.ChromeOptions() # 创建一个配置对象
options.add_argument('--user-agent=Mozilla/5.0 HAHA') # 替换User-Agent
driver = webdriver.Chrome('./chromedriver', chrome_options=options)
driver.get('http://www.baidu.com')
print(driver.title)
driver.quit()

Love & Share

[ 完 ]

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
|
Linux
【开发/调试工具】【串口工具】不同串口软件如何生成带时间戳的日志
【开发/调试工具】【串口工具】不同串口软件如何生成带时间戳的日志
2277 0
【开发/调试工具】【串口工具】不同串口软件如何生成带时间戳的日志
|
6月前
|
数据采集 JSON 搜索推荐
AI+代理IP手把手教你爬取某度
AI+代理IP手把手教你爬取某度
208 0
|
弹性计算 应用服务中间件 nginx
在阿里云服务器上如何搭建nginx服务器?
本文介绍了如何在阿里云服务器上从零开始搭建nginx服务器。阿里云服务器(ECS)相信大家都不陌生,感兴趣的同学可以到http://www.aliyun.com/product/ecs去购买,或到体验馆去体验(半个月有效期)。
17715 4
|
7月前
|
前端开发 JavaScript 安全
剖析跨域问题始末及其解决方案——前端必备交叉知识(一)
跨域问题是前端开发中的常见挑战,了解并掌握不同的跨域解决方案能帮助你更高效地进行开发工作。本文对同源策略、跨域以及解决跨域的三种方案: CORS、JSONP、代理等跨域技术进行了介绍。选择合适的跨域解决方案非常重要。 在实际开发中,推荐优先考虑使用 CORS,因为它是现代浏览器支持的标准,且安全性较高。如果服务器无法修改,则可以考虑使用代理。如果是特殊情况,可以使用 JSONP,但要注意安全性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错
|
Ubuntu 网络安全 数据安全/隐私保护
ubuntu server连接wifi教程
本文提供了一个简化Ubuntu Server在Raspberry Pi系统上配置过程的脚本"config_ubuntu_server",包括自动和手动两种方法来设置root权限、SSH配置,并连接WiFi,同时支持无密码SSH访问,适合初学者和高级用户。
455 3
|
存储 Java 关系型数据库
Java分布式事务及seata框架的使用
什么是事务? 事务从本质上讲就是:逻辑上的一组操作,组成这组操作的各个逻辑单元在不同的服务甚至服务器上,保证它们要成功就都成功,要失败就都失败。 事务的四大特性 提到事务就不得不提事务的四大特性(基本特征) ACID: 原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上缺一不可。事务的原子性要求事务中的所有操作要么都执行,要么都不执行。 一致性(consistency):“一致”指的是数据的一致,具体是指:所有数据都处于满足业务规则的一致性状态。一致性原则要求:一个事务中不管涉及到多少个操作,都必须保证事务执行之前数据是正确的
|
Linux 网络虚拟化 Windows
网工记背命令(6)----链路聚合配置
网工记背命令(6)----链路聚合配置
658 0
|
SQL 存储 运维
网易游戏如何基于阿里云瑶池数据库 SelectDB 内核 Apache Doris 构建全新湖仓一体架构
随着网易游戏品类及产品的快速发展,游戏数据分析场景面临着越来越多的挑战,为了保证系统性能和 SLA,要求引入新的组件来解决特定业务场景问题。为此,网易游戏引入 Apache Doris 构建了全新的湖仓一体架构。经过不断地扩张,目前已发展至十余集群、为内部上百个项目提供了稳定可靠的数据服务、日均查询量数百万次,整体查询性能得到 10-20 倍提升。
526 0
网易游戏如何基于阿里云瑶池数据库 SelectDB 内核 Apache Doris 构建全新湖仓一体架构
|
存储 安全 前端开发
HTTP 协议 与HTTPS
HTTP 协议 与HTTPS
|
数据采集 前端开发 JavaScript
Python爬虫入门
网络爬虫是自动抓取网页数据的程序,通过URL获取网页源代码并用正则表达式提取所需信息。反爬机制是网站为防止爬取数据设置的障碍,而反反爬是对这些机制的对策。`robots.txt`文件规定了网站可爬取的数据。基础爬虫示例使用Python的`urllib.request`模块。HTTP协议涉及请求和响应,包括状态码、头部和主体。`Requests`模块是Python中常用的HTTP库,能方便地进行GET和POST请求。POST请求常用于隐式提交表单数据,适用于需要发送复杂数据的情况。
180 1