当前位置: 首页 > news >正文

爬虫学习--17.反爬斗争 selenium(2)

鼠标行为链

有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件。

actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.context_click()
actions.click(submitTag)
actions.perform()

还有更多的鼠标相关的操作

  • click_and_hold(element):点击但不松开鼠标。

  • context_click(element):右键点击。

  • double_click(element):双击。

  • 更多方法请参考:7. WebDriver API — Selenium Python Bindings 2 documentation

练习

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
import time
​
# 加载驱动
driver = webdriver.Chrome()
​
# 拿到目标url
driver.get("https://www.baidu.com")
​
# 定位百度的输入框
inputtag = driver.find_element(By.ID, "kw")
​
# 定位百度按钮
buttontag = driver.find_element(By.ID, "su")
​
# 实例化一个鼠标行为链的对象
actions = ActionChains(driver)
​
# 在已经定位好的输入框输入内容
actions.send_keys_to_element(inputtag, "python")
​
# 等待一秒
time.sleep(1)
# 第一种方法
# buttontag.click()  # # 注意你用的逻辑操作和鼠标行为链没有相关 那么这些个操作需要放到perform()的外面
​
# # 第二种方法  在鼠标行为链中进行操作 没有问题
# actions.move_to_element(buttontag)
​
# actions.click(buttontag)
​
# # 提交行为链的操作
# actions.perform()
​

Cookie操作

  • 获取所有的cookie

cookies = driver.get_cookies()
  • 根据cookie的name获取cookie

value = driver.get_cookie(name)
  • 删除某个cookie

driver.delete_cookie('key')

selenium携带cookie登录qq空间

登录接口

https://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=https%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=https%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_qr_app=%E6%89%8B%E6%9C%BAQQ%E7%A9%BA%E9%97%B4&pt_qr_link=http%3A//z.qzone.com/download.html&self_regurl=https%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http%3A//z.qzone.com/download.html&pt_no_auth=0

代码实现

from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time
from selenium.webdriver.common.by import By
import requests
import json

# 模拟登录QQ空间
# 加载驱动
driver = webdriver.Chrome()

driver.get(
    'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=https%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=https%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_qr_app=%E6%89%8B%E6%9C%BAQQ%E7%A9%BA%E9%97%B4&pt_qr_link=http%3A//z.qzone.com/download.html&self_regurl=https%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http%3A//z.qzone.com/download.html&pt_no_auth=0')
# 定位头像图片
img_tag = driver.find_element(By.CLASS_NAME,'face')
img_tag.click()
time.sleep(2)

# 获取cookie
cookie = driver.get_cookies()  # 返回的是一个列表
print(cookie, type(cookie))
# ------------------------------------------------------------------------------------------------
# 通过循环打印这个cookie 发现它是一个列表 然后里面放的是字典格式的数据
# for i in cookie:
#     print(i,type(i))

cookie = [item['name'] + '=' + item['value'] for item in cookie]
# print(cookie)
#
cookie_str = '; '.join(cookie)
print(cookie_str, type(cookie_str))
time.sleep(3)


# 目标url
url = 'https://user.qzone.qq.com/3180929868'

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",
    'cookie': cookie_str
}

res = requests.get(url, headers=headers)
time.sleep(1)

with open('空间.html', 'w', encoding='utf-8') as f:
    f.write(res.text)

print(res.text)

页面等待

现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待。

  • 隐式等待:调用driver.implicitly_wait。那么在获取不可用的元素之前,会先等待10秒中的时间

driver.implicitly_wait(10)
  • 显示等待:显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待应该使用selenium.webdriver.support.excepted_conditions期望的条件和selenium.webdriver.support.ui.WebDriverWait来配合完成

案例综合使用

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
​
# 加载驱动
driver = webdriver.Chrome()
​
# driver.get('https://www.baidu.com/')
​
# 定位到输入框
# input_tag = driver.find_element_by_id('kw').send_keys('python')
'''
python自带的time模块去进行等待
相当于阻塞当前线程5秒。不建议过多使用,会严重影响脚本的性能。
'''
# time.sleep(3) # 3秒为强制休息时间  低于三秒浪费了时间--->爬取效率变低
​
'''
隐式等待 只要找到元素就会立即执行 如果找不到才会等待10秒
好处: 只需设置一次,全局都生效。如果超时时间内网页完成了全部加载,
则立即进行下面的操作。比sleep()智能很多。
劣势: 隐式等待需要等到网页所有元素都加载完成才会执行下面的操作,
如果我需要操作的元素提前加载好了,但是其他无关紧要的元素还没有加载完成,
那么还是需要浪费时间去等待其他元素加载完成。
'''
# driver.implicitly_wait(10)  # 10秒
# # 定位到百度一下的按钮
# but_tag = driver.find_element_by_id('su')
# but_tag.click()
​
'''
显式等待
指定某个条件,然后设置最长等待时间。
如果在这个时间还没有找到元素,那么便会抛出异常,只有当条件满足时才会执行后面的代码。
​
好处: 解决了隐式等待的不足之处。
缺点: 缺点是稍微复杂一些,需要有一些学习成本。
'''
'''
需要用到的库
'''
from selenium.webdriver.support import expected_conditions as EC  # 核心
from selenium.webdriver.support.ui import WebDriverWait  # 核心
from selenium.webdriver.common.by import By
​
driver.get("https://www.baidu.com/")
try:element = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="su"]')))text = driver.page_sourceprint("text", text)
finally:driver.quit()

一些其他的等待条件

  • presence_of_element_located:某个元素已经加载完毕了。

  • presence_of_all_elements_located:网页中所有满足条件的元素都加载完毕了。

  • element_to_be_clickable:某个元素是可以点击了。

更多条件请参考:5. Waits — Selenium Python Bindings 2 documentation

 

相关文章:

  • 机器人控制系列教程之D-H参数建模法
  • golang语言的gofly快速开发框架如何设置多样的主题说明
  • Java——变量
  • Linux汉化Jupyter Notebook
  • Java基础语法规范
  • 流媒体内网穿透/组网/视频协议转换EasyNTS上云网关如何更改密码?
  • 1初识C#
  • 大数据组件doc
  • 12V转5V5A降压芯片:AH8317的全面解析
  • 我给线程池管理框架hippo4j找bug
  • 编译安装PHP服务(LAMP3)
  • 达梦数据库写文件的方式探索
  • HTML动态响应2-Servlet+Ajax实现HTTP前后台交互方式
  • msvcp100.dll丢失怎样修复?几种快速有效修复msvcp100.dll丢失的方法
  • 02-CSS3基本样式
  • [笔记] php常见简单功能及函数
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • emacs初体验
  • ES10 特性的完整指南
  • PHP 小技巧
  • PHP的Ev教程三(Periodic watcher)
  • TypeScript迭代器
  • vagrant 添加本地 box 安装 laravel homestead
  • Vue2 SSR 的优化之旅
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 分享几个不错的工具
  • 基于 Babel 的 npm 包最小化设置
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用 Docker 部署 Spring Boot项目
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 优秀架构师必须掌握的架构思维
  • 移动端高清、多屏适配方案
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #微信小程序:微信小程序常见的配置传值
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (1)Nginx简介和安装教程
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (python)数据结构---字典
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)甲方乙方——赵民谈找工作
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET MVC第三章、三种传值方式
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .netcore如何运行环境安装到Linux服务器
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • @RequestMapping处理请求异常
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [ 转载 ] SharePoint 资料
  • [《百万宝贝》观后]To be or not to be?
  • [04]Web前端进阶—JS伪数组