selenium等待元素加载

# 程序执行速度很快---》获取标签---》标签还没加载好---》直接去拿会报错

# 显示等待:当你要找一个标签的时候,给它单独加等待时间

# 隐士等待:只要写一行,代码中查找标签,如果标签没加载好,会自动等待
bro.implicitly_wait(10)

selenium元素操作

# 输入框输入内容,删除内容
先获取输入框对象tag
tag.send_keys(写文字)
tag.clear()
# 按钮点击
tag.click

selenium执行js

#1  其实再页面中,可能有些变量,全局的,直接可以把变量打印出来
#2 js操作页面 from selenium import webdriver
import time
bro = webdriver.Chrome()
bro.get('https://www.pearvideo.com/')
bro.implicitly_wait(10) # bro.execute_script('alert(urlMap.loginUrl);')
# 获取当前页面cookie
# bro.execute_script('alert(document.cookie)')
# bro.execute_script('alert(window.location)') bro.execute_script('scrollTo(0,document.documentElement.scrollHeight)')
# 可以干的事
# -获取当前访问的地址 window.location
# -打开新的标签
# -滑动屏幕--》bro.execute_script('scrollTo(0,document.documentElement.scrollHeight)')
# -获取cookie,获取定义的全局变量 time.sleep(5)
bro.close() # 关闭选项卡
bro.quit() # 关闭页面

selenium切换选项卡

from selenium import webdriver
import time
bro = webdriver.Chrome()
bro.get('https://www.pearvideo.com/')
bro.implicitly_wait(5)
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(3) # 切换到某个选项卡
bro.switch_to.window(bro.window_handles[0])
bro.get('http://www.baidu.com')
time.sleep(3) bro.close()
bro.quit()

selenium前进后退

bro.back()  # 后退
bro.forward() # 前进

selenium登录cnblogs

# 1 打开cnblogs,点进登录页面,输入用户名密码,点登录(可能会出现验证码)--》手动操作

# 2 登录成功后----》拿到cookie---》保存到本地---》关闭浏览器

# 3 开启selenium,打开浏览器---》把本地的cookie写入到当前浏览器中----》当前浏览器就是登录状态
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import json '''先登录'''
# bro = webdriver.Chrome()
# bro.get('https://www.cnblogs.com/')
# bro.implicitly_wait(5)
# bro.maximize_window()
# login_btn = bro.find_element(By.CSS_SELECTOR,'#navbar_login_status > a:nth-child(7)')
# login_btn.click()
# username = bro.find_element(By.CSS_SELECTOR,'#mat-input-0')
# password = bro.find_element(By.CSS_SELECTOR,'#mat-input-1')
# username.send_keys('1535114884@qq.com')
# password.send_keys('')
# login_button = 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 > span.mat-button-wrapper')
# login_button.click()
#
# # 有可能出现验证码
# input('') # 手动操作验证码,操作完后,敲回车程序继续执行
# time.sleep(2) # 登录成功了,有cookie了
# cookies = bro.get_cookies()
# with open('cnblogs.json','w',encoding='utf-8') as f:
# json.dump(cookies,f)
#
# time.sleep(2)
# bro.close() '''再次打开'''
bro = webdriver.Chrome()
bro.get('https://www.cnblogs.com/')
bro.implicitly_wait(5)
bro.maximize_window()
time.sleep(3)
# 本地的cookie池中取出cookie
with open('./cnblogs.json','r',encoding='utf-8') as f:
cookies = json.load(f)
for item in cookies: # 存起来的是列表套字典,add_cookie是add字典
bro.add_cookie(item) bro.refresh() # 刷新页面
time.sleep(3)
bro.close()

抽屉半自动点赞

import time
import json
import requests '''使用selenium登录上去,手动处理验证码'''
# from selenium import webdriver
# from selenium.webdriver.common.by import By
#
# bro = webdriver.Chrome()
# bro.get('https://dig.chouti.com/')
# bro.implicitly_wait(5)
# bro.maximize_window()
#
# login_btn = bro.find_element(By.CSS_SELECTOR,'#login_btn')
# login_btn.click()
# # 使用js点击
# # bro.execute_script('arguments[0].click()',login_btn)
# time.sleep(2)
#
# phone = bro.find_element(By.CSS_SELECTOR,'body > div.login-dialog.dialog.animated2.scaleIn > div > div.login-body > div.form-item.login-item.clearfix.phone-item.mt24 > div.input-item.input-item-short.left.clearfix > input')
# 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')
# login_submit = 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)
# login_submit.click()
#
# # 可能会出验证码,手动操作
# input('你好了吗')
# time.sleep(2)
# cookies = bro.get_cookies()
# with open('chouti.json','w',encoding='utf-8') as f:
# json.dump(cookies,f)
#
# time.sleep(2)
# bro.close() '''拿10个需要点赞的新闻'''
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
}
# 打开读出cookie
with open('./chouti.json','r',encoding='utf-8') as f:
cookies = json.load(f)
# 把selenium拿到的cookie组装成requests能用的cookie
real_cookie = {}
for item in cookies:
real_cookie[item['name']] = item['value'] res = requests.get('https://dig.chouti.com/top/24hr?_=1689068697936',headers=header).json()
# print(res)
for item in res.get('data'):
link_id = item.get('id')
data = {
'linkId':link_id
}
res = requests.post('https://dig.chouti.com/link/vote',headers=header,data=data,cookies=real_cookie)
print(res.text)

xpath使用

# 页面中定位元素(标签),两种通用方式
-css选择器
-xpath:XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言 # xpath语法
div 选取div标签
/ 从根节点选取,只在当前标签往下一个
// 从匹配选择的当前节点选择文档中的节点,不考虑位置,全局找
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性
doc = '''
<html>
<head>
<base href='http://example.com/' />
<title>Example website</title>
</head>
<body>
<div id='images'>
<a href='image1.html' id='xxx'>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 etree html = 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 [contains(@class,"li")]
"""

动作链

# 模拟鼠标点住,拖动的效果,实现滑块认证

# 两种形式
形式一:
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=0
while 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 By driver = 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') ##切换到iframeResult
sourse = driver.find_element(By.ID, 'draggable')
target = driver.find_element(By.ID, 'droppable') # 方式一:基于同一个动作链串行执行
# actions = ActionChains(driver) #拿到动作链对象
# actions.drag_and_drop(sourse,target) # 把动作放到动作链中,准备串行执行
# actions.perform()
# time.sleep(10) # 方式二:不同的动作链,每次移动的位移都不同
ActionChains(driver).click_and_hold(sourse).perform()
distance = target.location['x'] - sourse.location['x']
track = 0
while track < distance:
ActionChains(driver).move_by_offset(xoffset=4, yoffset=0).perform()
track += 4
ActionChains(driver).release().perform() # 释放鼠标按钮并执行之前定义的操作链
# release()方法表示释放当前按下的鼠标按钮(如果有)。这通常与鼠标悬停、点击或拖放等操作结合使用
# perform()方法用于执行之前定义的操作链
time.sleep(5)
finally:
driver.close()

自动登录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')
login_btn = bro.find_element(By.ID,'J-login') username.send_keys('')
password.send_keys('')
time.sleep(3)
login_btn.click()
time.sleep(3) # 找到滑块
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()

打码平台

# 以后会遇到验证码-
-简单的数字字母
-高级一些的,计算题,成语
-选中图中的 公交车
。。。 # 第三方解决方法:打码平台---》你验证码图片传给它,它给你破解,回给你,花钱

打码平台自动登录

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from chaojiying import ChaojiyingClient
from PIL import Image
bro = webdriver.Chrome()
bro.get('http://www.chaojiying.com/apiuser/login/')
bro.implicitly_wait(5)
bro.maximize_window()
try:
username = bro.find_element(by=By.XPATH,value='/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input')
password = bro.find_element(by=By.XPATH,value='/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input')
code = bro.find_element(by=By.XPATH,value='/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input')
btn = bro.find_element(by=By.XPATH,value='/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input')
username.send_keys('')
password.send_keys('') # 获取验证码:
# 1 整个页面截图
bro.save_screenshot('main.png')
# 2 使用pillow,从整个页面中截取出验证码图片 code.png
img = bro.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/div/img')
location = img.location
size = img.size
print(location)
print(size)
# 使用pillow扣除大图中的验证码
# 使用pillow扣除大图中的验证码
img_tu = (
int(location['x']), int(location['y']), int(location['x'] + size['width']), int(location['y'] + size['height']))
# # 抠出验证码
# #打开
img = Image.open('./main.png')
# 抠图
fram = img.crop(img_tu)
# 截出来的小图
fram.save('code.png') chaojiying = ChaojiyingClient('3053345678','lqz123','950575') ##用户中心>>软件ID 生成一个替换 96001
im = open('code.png','rb').read()
print(chaojiying.PostPic(im,1902)) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
res_code = chaojiying.PostPic(im,1902)['pic_str']
code.send_keys(res_code)
time.sleep(5)
btn.click()
time.sleep(5)
except Exception as e:
print(e) finally:
bro.close()

使用selenium、xpath、半自动点赞、自动登录的更多相关文章

  1. python+selenium+webdriver+BeautifulSoup实现自动登录

    from selenium import webdriverimport timefrom bs4 import BeautifulSoupfrom urllib import requestimpo ...

  2. python+selenium实现自动识别验证码并登录

    最近学习python+selenium实现网站的自动登录,但是遇到需要输入验证码的问题,经过查询百度收获了几种破解验证码的方式. 方式一)从万能的网友那收获了一个小众但非常实用的第3方库ddddocr ...

  3. [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

    前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时 ...

  4. python+selenium+chrome实现自动登录百度

    #python3.4+selenium3.5+chrome版本 63.0.3239.132+chrome驱动chromedriver.exe #实现自动登录百度 from selenium impor ...

  5. 自动化测试: Selenium 自动登录授权,再 Requests 请求内容

    Selenium 自动登录网站.截图及 Requests 抓取登录后的网页内容.一起了解下吧. Selenium: 支持 Web 浏览器自动化的一系列工具和库的综合项目. Requests: 唯一的一 ...

  6. python+selenium破解极验验证登录

    1.前言: 目前很多网站会在正常的账号密码认证之外加一些验证码,以此来明确区分人/机行为,最典型的就是极验滑动验证.(如下图) 这里我们以简单实例说明如何实现自动校验类似验证. 2.步骤: 1)点击验 ...

  7. 小爬爬4:12306自动登录&&pyppeteer基本使用

    超级鹰(更简单的操作验证) - 超级鹰 - 注册:普通用户 - 登陆: - 创建一个软件(id) - 下载示例代码 1.12306自动登录 # Author: studybrother sun fro ...

  8. 爬虫学习之基于Scrapy的爬虫自动登录

    ###概述 在前面两篇(爬虫学习之基于Scrapy的网络爬虫和爬虫学习之简单的网络爬虫)文章中我们通过两个实际的案例,采用不同的方式进行了内容提取.我们对网络爬虫有了一个比较初级的认识,只要发起请求获 ...

  9. 使用WinIo32绕过密码控件实现自动登录

    通过winIO32绕过密码控件,实现自动登录 环境: vmware上安装windows 32位系统:windows xp / windows 7 selenium版本: 3.11.0 IEDriver ...

  10. 小白之selenium+python关于cookies绕开登录2

    首先,由于新开始在博客园中写随笔,可能在内容的布局方面就不太懂,导致布局很丑,各位见谅,但是字还是原来的那字,内容还是原来的内容,少了点包装, 下面是对cookie的扩展知识 1.配置文件存储在哪里? ...

随机推荐

  1. mysql中innodb_open_files限制导致数据库异常重启

    问题描述:收到监控软件告警,提示数据库发生重启,进去查看,截止到6/27 10:00 之前,作为主节点的orch1先重启,然后故障转移到orch2和orch3节点上.在持续到6/27 9:00 左右, ...

  2. 【Zookeeper】(二)安装与配置

    1 安装 安装JDK(参考项目部署) 将Zookeeper拷贝到Linux下 解压 tar -zxvf apache-zookeeper-3.5.10-bin.tar.gz -C /opt/modul ...

  3. FFmpeg开发笔记(一)搭建Linux系统的开发环境

    对于初学者来说,如何搭建FFmpeg的开发环境是个不小的拦路虎,因为FFmpeg用到了许多第三方开发包,所以要先编译这些第三方源码,之后才能给FFmpeg集成编译好的第三方库.不过考虑到刚开始仅仅调用 ...

  4. Dokcer应用部署(搭建Wordpress网站)

    实现多个容器之间的协同,搭建Wordpress网站,要用到3个容器,Wordpress.MariaDB和Nginx 拉取镜像 使用docker pull拉取3个镜像: $ sudo docker pu ...

  5. ansible-kubeadm在线安装k8s v1.19-v1.20版本

    ansible-kubeadm在线安装k8s v1.19-v1.20版本 1. ansible-kubeadm在线安装k8s v1.19-v1.20版本 安装要求 确保所有节点系统时间一致 操作系统要 ...

  6. YOLO2论文中文版

    文章目录 YOLO9000中文版 摘要 1. 引言 2. 更好 3. 更快 4. 更强 5. 结论 参考文献 YOLO9000中文版 摘要 我们引入了一个先进的实时目标检测系统YOLO9000,可以检 ...

  7. 深度相机(TOF)的工作原理

    文章目录 深度相机(TOF)的工作原理 TOF由什么组成? 一.TOF相机采用主动光探测,通常包括以下几个部分: 二.TOF是如何测距的呢? 三.TOF会受什么影响? 四.那TOF相机最后输出的是什么 ...

  8. 面试题:react、vue中的key

    1.虚拟DOM中key的作用     key是虚拟DOM对象的标识,当数据发生变化时,React/Vue会根据[新数据]生成新的[虚拟DOM],随后React/Vue进行[新虚拟DOM]与[旧虚拟DO ...

  9. 读《图解HTTP》

    最近读了一本书<图解HTTP>,读完后在大体上对HTTP协议有了更深层次的了解.以下是我以前不懂的问题,通过阅读此书后,这些问题都有了答案: 问题: URI和URL的区别? cookie到 ...

  10. 在vue标签代码块中定义变量

    方式一: 在标签上使用:set关键字,不管什么标签都可以 <template> <h1>test</h1> <template :set="firs ...