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

4-爬虫-selenium(等待元素加载、元素操作、操作浏览器执行js、切换选项卡、前进后退异常处理)、xpath、动作链

1 selenium等待元素加载
2 selenium元素操作
3 selenium操作浏览器执行js
4 selenium切换选项卡
5 selenium前进后退异常处理
6 登录cnblogs
7 抽屉半自动点赞
8 xpath
9 动作链
10 自动登录12306

上节回顾

# 1 bs4 解析库---》xml(html)-遍历文档树-属性 文本 标签名-搜索文档树:find  find_all-5 种过滤器:字符串,正则,布尔,列表,方法-find(name='字符串',src='正则',class_='布尔',href='列表',text='字符串',方法)-遍历文档树和搜索文档树可以连用find()  结果是:Tag类的对象,BeautifulSoup继承了它结果可以继续 . 也可以继续 find-find的其他参数-limit-recursive-链式调用-小说,图片# 2 css选择器-id选择器-标签选择器-类选择器-属性选择器- 标签- .- #id- div a- div>asoup.select('css选择器')  可能是多个,放到列表中# 3 selenium :控制浏览器,解决requests不能执行js的问题-浏览器驱动:浏览器版本-pip install selenium-快速使用import timefrom selenium import webdriver# 跟人操作浏览器一样,打开了谷歌浏览器,拿到浏览器对象bro=webdriver.Chrome()# 在地址栏中输入地址bro.get('https://www.baidu.com')time.sleep(5)bro.close() # 关闭当前tab页bro.quit() # 关闭浏览器# 4 模拟登录百度-查找标签# By.ID  # 根据id号查找标签# By.NAME  # 根据name属性查找标签# By.TAG_NAME  # # 根据标签查找标签# By.CLASS_NAME # 按类名找# By.LINK_TEXT # a标签文字# By.PARTIAL_LINK_TEXT # a标签文字,模糊匹配#---------selenium 自己的--------# By.CSS_SELECTOR # 按css选择器找# By.XPATH  #按xpath找-操作标签-点击-写文字# 5 无头浏览器-bro.page_source# 6 找到标签-属性-文本-标签名-位置-大小

1 selenium等待元素加载

# 代码操作非常快---》有的标签还没加载---》找就找不到---》就会报错
# 设置等待:显示等待,隐士等待
bro.implicitly_wait(10) # 找某个标签,如果找不到,最多等待10s

2 selenium元素操作

# 点击操作click()# 写文字send_keys("内容")# 清空文字clear()

3 执行js

# 在使用selenium操作浏览器的时候,可以自己写js执行,会用这东西做什么?-创建新的选项卡-打印出一些变量(属于当前爬取的页面中的变量)-获取当前登录的cookie-滑动屏幕
import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
bro = webdriver.Chrome()
bro.get('https://www.pearvideo.com/category_1')
bro.implicitly_wait(10)
bro.maximize_window()
# 1 基本使用
# bro.execute_script('alert("美女")')
# 2 打印出一些变量
# res=bro.execute_script('console.log(urlMap)')
# print(res)# 3 新建选项卡
# bro.execute_script('open()')# 4 滑动屏幕
# bro.execute_script('scrollTo(0,document.documentElement.scrollHeight)')# 5 获取当前访问地址
# bro.execute_script('alert(location)')
# bro.execute_script('location="http://www.baidu.com"')# 6 打印cookie
bro.execute_script('alert(document.cookie)')
time.sleep(10)
bro.close()

4 切换选项卡

from selenium import webdriver
import time
bro = webdriver.Chrome()
bro.get('https://www.pearvideo.com/')
bro.implicitly_wait(10)
print(bro.window_handles)
# 开启选项卡
bro.execute_script('window.open()')
# 获取出所有选项卡bro.switch_to.window(bro.window_handles[1]) # 切换到某个选项卡
bro.get('http://www.taobao.com')time.sleep(2)
bro.switch_to.window(bro.window_handles[0]) # 切换到某个选项卡
bro.get('http://www.baidu.com')time.sleep(2)
bro.execute_script('window.open()')
bro.execute_script('window.open()')
bro.close() # 关闭选项卡
bro.quit()  # 关闭页面

5 前进后退异常处理

from selenium import webdriver
import time
bro = webdriver.Chrome()
bro.get('https://www.pearvideo.com/')
bro.implicitly_wait(10)# 获取出所有选项卡
time.sleep(2)
bro.get('http://www.taobao.com')time.sleep(2)bro.get('http://www.baidu.com')
time.sleep(2)
bro.back()
time.sleep(2)
bro.back()
time.sleep(2)
bro.forward()
bro.quit()  # 关闭页面

6 登录cnblogs

# 以后要爬取的数据,要登录后才能看到-如果使用selenium,速度慢---》不能开启多线程---》速度不会太快-如果使用requests发送请求,登录不好登录,自动登录不进去--》拿不到cookie-使用selenium登录---》拿到cookie---》换到别的机器,使用这个cookie,依然是登录状态
import timefrom selenium import webdriver
from selenium.webdriver.chrome.options import Options
import json
from selenium.webdriver.common.by import By
# 去掉自动化软件控制的检测
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")  # 去掉自动化控制
bro = webdriver.Chrome(options=options)
# bro = webdriver.Chrome()
########### 纯自动登录#######得到了cookie
bro.get('https://www.cnblogs.com/')
bro.implicitly_wait(10)
bro.maximize_window()
login_btn = bro.find_element(By.LINK_TEXT, '登录')
login_btn.click()time.sleep(2)# 找到用户名和密码输入框
username = bro.find_element(By.CSS_SELECTOR, '#mat-input-0')
password = bro.find_element(By.ID, 'mat-input-1')submit_btn = bro.find_element(By.CSS_SELECTOR,'body > app-root > app-sign-in-layout > div > div > app-sign-in > app-content-container > div > div > div > form > div > button')
# 验证码
code=bro.find_element(By.ID,'rectMask')
time.sleep(1)username.send_keys('@qq.com')
time.sleep(1)
password.send_keys('#')
time.sleep(1)
submit_btn.click()  # 一种情况直接登录成功   一种情况会弹出验证码
code.click()
time.sleep(10)# 让程序先停在这---》手动操作浏览器---》把验证码搞好---》程序再继续往下走
# 到现在,是登录成功的状态
# 取出cookie存起来
cookies = bro.get_cookies()
with open('cnblogs.json', 'w', encoding='utf-8') as f:json.dump(cookies, f)time.sleep(2)
bro.close()
import timefrom selenium import webdriver
from selenium.webdriver.chrome.options import Options
import json
from selenium.webdriver.common.by import By# 去掉自动化软件控制的检测
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")  # 去掉自动化控制
bro = webdriver.Chrome(options=options)bro.get('https://www.cnblogs.com/')
bro.implicitly_wait(10)
bro.maximize_window()time.sleep(5)
# 取出cookie--》写入到浏览器中---》刷新浏览器---》登录状态
with open('cnblogs.json', 'r') as f:cookies = json.load(f)
# 写到浏览器中
for item in cookies:bro.add_cookie(item) # 如果是没登录的cookie,往里写会报错# 刷新浏览器
bro.refresh()time.sleep(5)
bro.close()

7 抽屉半自动点赞

# 使用selenium登录---》拿到cookie
# 点赞 使用requests 用cookie点赞
####自动登录---使用selenium####
import json# import time
#
# from selenium import webdriver
# from selenium.webdriver.chrome.options import Options
# import json
# from selenium.webdriver.common.by import By
#
# bro = webdriver.Chrome()
# bro.get('https://dig.chouti.com/')
# bro.implicitly_wait(10)
# bro.maximize_window()
#
# btn_login = bro.find_element(By.ID, 'login_btn')
# time.sleep(1)
# btn_login.click()
# time.sleep(1)
#
# phone = bro.find_element(By.NAME, 'phone')
# password = bro.find_element(By.CSS_SELECTOR,
#                             'body > div.login-dialog.dialog.animated2.scaleIn > div > div.login-footer > div.form-item.login-item.clearfix.mt24 > div > input.input.pwd-input.pwd-input-active.pwd-password-input')
#
# submit_login = bro.find_element(By.CSS_SELECTOR,
#                                 'body > div.login-dialog.dialog.animated2.scaleIn > div > div.login-footer > div:nth-child(4) > button')
#
# phone.send_keys('你的手机号')
# password.send_keys('你的密码')
# time.sleep(2)
# submit_login.click()
#
# input('等你')
#
# cookies = bro.get_cookies()
# with open('chouti.json', 'w', encoding='utf-8') as f:
#     json.dump(cookies, f)
#
# time.sleep(2)
# bro.close()#### 使用requests点赞# 访问首页,解析出id号
import requests
from bs4 import BeautifulSoup#### 携带cookie访问#####
session = requests.Session()
cookie = {}  # 本地取出来,写入
with open('chouti.json', 'r') as f:cookie_list = json.load(f)
##### selenium的cookie和requests的cookie格式不一样,要转换   {key:value,key:value}
for item in cookie_list:cookie[item['name']] = item['value']
header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'}
res = session.get('https://dig.chouti.com/', cookies=cookie,headers=header)
soup = BeautifulSoup(res.text, 'html.parser')print(res.text)divs = soup.find_all(name='div', class_='link-item')
for div in divs:article_id = div.attrs.get('data-id')data = {'linkId': article_id}res1 = session.post('https://dig.chouti.com/link/vote', data=data,headers=header)print(res1.text)

8 xpath

# 在 xml中查找元素,解析库-解析库自带的-css选择器-xpath---》通用的---》即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言# 记住的:nodename	选取此节点的所有子节点。/	        从根节点选取。//	        从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。.	        选取当前节点。..	        选取当前节点的父节点。@	        选取属性。
doc = '''
<html><head><base href='http://example.com/' /><title>Example website</title></head><body><div id='images'><a href='image1.html' id='lqz'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a><a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a><a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a><a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a><a href='image5.html' class='li li-item' name='items'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a><a href='image6.html' name='items'><span><h5>test</h5></span>Name: My image 6 <br /><img src='image6_thumb.jpg' /></a></div></body>
</html>
'''
from lxml import etreehtml = etree.HTML(doc)
# html=etree.parse('search.html',etree.HTMLParser())
# 1 所有节点
# a=html.xpath('//*')
# 2 指定节点(结果为列表)
# a=html.xpath('//head')
# 3 子节点,子孙节点
# a=html.xpath('//div/a')
# a=html.xpath('//body/a') #无数据
# a=html.xpath('//body//a')
# 4 父节点
# a=html.xpath('//body//a[@href="image1.html"]/..')
# a=html.xpath('//body//a[1]/..')
# 也可以这样
# a=html.xpath('//body//a[1]/parent::*')
# a=html.xpath('//body//a[1]/parent::div')
# 5 属性匹配
# a=html.xpath('//body//a[@href="image1.html"]')# 6 文本获取     /text()
# a=html.xpath('//body//a[@href="image1.html"]/text()')# 7 属性获取     @属性名
# a=html.xpath('//body//a/@href')
# # 注意从1 开始取(不是从0)
# a=html.xpath('//body//a[1]/@href')# 8 属性多值匹配
#  a 标签有多个class类,直接匹配就不可以了,需要用contains
# a=html.xpath('//body//a[@class="li"]')
# a=html.xpath('//body//a[contains(@class,"li")]')
# a=html.xpath('//body//a[contains(@class,"li")]/text()')
# 9 多属性匹配
# a=html.xpath('//body//a[contains(@class,"li") or @name="items"]')
# a=html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()')
# a=html.xpath('//body//a[contains(@class,"li")]/text()')
# 10 按序选择
# a=html.xpath('//a[2]/text()')
# a=html.xpath('//a[2]/@href')
# 取最后一个
# a=html.xpath('//a[last()]/@href')
# a=html.xpath('//a[last()-1]/@href') # 倒数第二个
# 位置小于3的
# a = html.xpath('//a[position()<3]/@href')# 倒数第三个
# a=html.xpath('//a[last()-2]/@href')
# 11 节点轴选择
# ancestor:祖先节点
# 使用了* 获取所有祖先节点
# a=html.xpath('//a/ancestor::*')
# # 获取祖先节点中的div
# a=html.xpath('//a/ancestor::div')
# attribute:属性值
# a=html.xpath('//a[1]/attribute::*')
# a=html.xpath('//a[1]/attribute::href')# child:直接子节点
# a=html.xpath('//a[1]/child::*')
# descendant:所有子孙节点
# a=html.xpath('//a[6]/descendant::*')
# following:当前节点之后所有节点
# a=html.xpath('//a[1]/following::*')
# a=html.xpath('//a[1]/following::*[1]/@href')
# following-sibling:当前节点之后同级节点
# a=html.xpath('//a[1]/following-sibling::*')
# a=html.xpath('//a[1]/following-sibling::a')
# a=html.xpath('//a[1]/following-sibling::*[2]')
# a=html.xpath('//a[1]/following-sibling::*[2]/@href')# print(a)'''
/
//
.
..
取文本  /text()
取属性  /@属性名
根据属性过滤  [@属性名=属性值]
class 特殊
[contains(@class,"li")]
'''# 终极大招  直接复制
# 案例
import requests
res=requests.get('https://www.w3school.com.cn/xpath/xpath_syntax.asp')
from lxml import etreehtml = etree.HTML(res.text)
# a=html.xpath('//div[@id="intro"]//strong/text()')
# a=html.xpath('/html/body/div/div[4]/div[2]/p/strong')
a=html.xpath('//*[@id="intro"]/p/strong/text()')
print(a)

9 动作链

# 模拟鼠标点住,拖动的效果,实现滑块认证# 两种形式-形式一:actions=ActionChains(bro) #拿到动作链对象actions.drag_and_drop(sourse,target) #把动作放到动作链中,准备串行执行actions.perform()-方式二:ActionChains(bro).click_and_hold(sourse).perform()distance=target.location['x']-sourse.location['x']track=0while track < distance:ActionChains(bro).move_by_offset(xoffset=2,yoffset=0).perform()track+=2
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
import time
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
driver.implicitly_wait(3)
driver.maximize_window()try:driver.switch_to.frame('iframeResult')  ##切换到iframeResultsourse = driver.find_element(By.ID, 'draggable')target = driver.find_element(By.ID, 'droppable')# 方式一:基于同一个动作链串行执行# actions = ActionChains(driver)  # 拿到动作链对象# actions.drag_and_drop(sourse, target)  # 把动作放到动作链中,准备串行执行# actions.perform()# 方式二:不同的动作链,每次移动的位移都不同ActionChains(driver).click_and_hold(sourse).perform()  # 鼠标点中源 标签 不松开distance=target.location['x']-sourse.location['x']track = 0while track < distance:ActionChains(driver).move_by_offset(xoffset=2, yoffset=0).perform()track += 2ActionChains(driver).release().perform()time.sleep(10)finally:driver.close()

10 自动登录12306

import time
from selenium.webdriver import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
# 12306检测到咱们用了自动化测试软件,
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")  # 去掉自动化控制
bro = webdriver.Chrome(chrome_options=options)
bro.get('https://kyfw.12306.cn/otn/resources/login.html')
bro.implicitly_wait(5)
bro.maximize_window()
user_login = bro.find_element(By.CSS_SELECTOR,'#toolbar_Div > div.login-panel > div.login-box > ul > li.login-hd-code.active > a')user_login.click()
time.sleep(1)username = bro.find_element(By.ID, 'J-userName')
password = bro.find_element(By.ID, 'J-password')
submit_btn = bro.find_element(By.ID, 'J-login')
username.send_keys('18953675221')
password.send_keys('')
time.sleep(3)
submit_btn.click()time.sleep(5)# 找到滑块
span = bro.find_element(By.ID, 'nc_1_n1z')
ActionChains(bro).click_and_hold(span).perform()
ActionChains(bro).move_by_offset(xoffset=300, yoffset=0).perform()
ActionChains(bro).release().perform()
time.sleep(5)bro.close()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 支付卡行业(PCI)PIN安全要求和测试程序 7个控制目标、33个要求及规范性附录ABC 密钥注入-PCI认证-安全行业基础篇4
  • 详解 SpringMVC 的 HttpMessageConverter
  • GNU make笔记
  • open clip论文阅读摘要
  • MES系统防呆措施之具体场景学习
  • Kafka入门
  • 搭建WAMP网站教程(Windows+Apache+MySQL+PHP)
  • 【Python】11 Conda常用命令
  • 1.5 微信Native支付 - 申请退款、查询退款、退款通知、账单
  • vue3+setup 解决:this.$refs引用子组件报错 is not a function
  • 【数据结构】单链表
  • 【hcie-cloud】【2】华为云Stack解决方案介绍、缩略语整理 【下】
  • SpringCloudAlibaba系列之Nacos配置管理
  • 视频转码教程:轻松制作GIF动态图,一键高效剪辑操作
  • Luatos Air700 改变BL0942串口波特率
  • [译]CSS 居中(Center)方法大合集
  • 《剑指offer》分解让复杂问题更简单
  • Angular数据绑定机制
  • Linux中的硬链接与软链接
  • vue-router的history模式发布配置
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从tcpdump抓包看TCP/IP协议
  • 番外篇1:在Windows环境下安装JDK
  • 服务器从安装到部署全过程(二)
  • 机器学习 vs. 深度学习
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 携程小程序初体验
  • 异常机制详解
  • 白色的风信子
  • PostgreSQL之连接数修改
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (3)nginx 配置(nginx.conf)
  • (30)数组元素和与数字和的绝对差
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (MATLAB)第五章-矩阵运算
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (七)Flink Watermark
  • (太强大了) - Linux 性能监控、测试、优化工具
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Core跨平台微服务学习资源
  • .NET 反射 Reflect
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • /*在DataTable中更新、删除数据*/
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @media screen 针对不同移动设备
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [1181]linux两台服务器之间传输文件和文件夹