0


Selenium

文章目录

selenium

模块 & 驱动

  • 安装模块pip3.11 install selenium
  • 下载驱动谷歌驱动的下载: 114及之前版本: http://chromedriver.storage.googleapis.com/index.html 117/118/119版本: https://googlechromelabs.github.io/chrome-for-testing/ 浏览器版本的获取: 在谷歌浏览器上访问 chrome://version/ 例如:119.0.6045.200 (正式版本) (64 位) (cohort: Stable)
  • 快速使用import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Serviceservice = Service("driver/chromedriver.exe")driver = webdriver.Chrome(service=service)driver.get('https://passport.bilibili.com/login')time.sleep(5)driver.close()

注意:最新版本可以不配置驱动,selenium会自动寻找默认驱动。

寻找标签

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

service = Service("driver/chromedriver.exe")
driver = webdriver.Chrome(service=service)

driver.get('打开网址')# find_element  find_elements
tag = driver.find_element(By.ID,"user")

tag = driver.find_element(By.CLASS_NAME,"c1")

tag = driver.find_element(By.TAG_NAME,"div")

tag = driver.find_element(By.XPATH,"/html/body/div[1]/div/div[2]/div[3]/div[3]/div/div/div/div[1]/span[2]")

tag = driver.find_element(By.XPATH,'//*[@id="geetest-wrap"]//input[@name="tel"]')

tag_list = driver.find_elements(By.XPATH,"/html/body/div/div[2]/div/div[2]/div/div[2]/div[2]/div/div/div/div/div[2]/a")for tag in tag_list:print(tag)

time.sleep(5)
driver.close()

示例:

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Edge()
driver.get('https://www.csdn.net')
div_list = driver.find_elements(By.XPATH,'//*[@id="floor-www-index_558"]/div/div[4]/div/div[1]/div/div[1]/div/div')for i in div_list:print("------------------------------")if(i.text):
        name = i.find_element(By.XPATH,'.//div/div[1]/a/p[1]/span').text
        print(name)
time.sleep(2)
driver.close()

请添加图片描述

执行操作

常见的执行操作:点击、输入

driver.get('https://www.csdn.net')

btn1 = driver.find_element(By.XPATH,'//*[@id="csdn-toolbar"]/div/div/div[3]/div/div[1]/a')
btn1.click()
time.sleep(2)

driver.switch_to.frame('passport_iframe')# 将焦点从一个窗口切换到一个内嵌的iframe

btn2 = driver.find_element(By.XPATH,'/html/body/div/div/div/div[2]/div[2]/div[1]/div[1]/span[4]')
btn2.click()
time.sleep(2)

username = driver.find_element(By.XPATH,'/html/body/div/div/div/div[2]/div[2]/div/div[2]/div/div[1]/div/input')
username.send_keys('123456')

password = driver.find_element(By.XPATH,'/html/body/div/div/div/div[2]/div[2]/div/div[2]/div/div[2]/div/input')
password.send_keys('123456')

dl = driver.find_element(By.XPATH,'/html/body/div/div/div/div[2]/div[2]/div/div[2]/div/div[4]/button')
dl.click()

time.sleep(2)
driver.close()

请添加图片描述

执行JavaScript

如果【选择标签】【执行操作】这种操作起来比较繁琐,也可以直接在页面上去执行js代码实现功能。

driver.get('https://passport.bilibili.com/login')# #############  1.点击短信登录 #############
time.sleep(3)
sms_btn = driver.find_element(
    By.XPATH,'//*[@id="app"]/div[2]/div[2]/div[3]/div[1]/div[3]')
sms_btn.click()# #############  2.输入账号 #############
phone_txt = driver.find_element(
    By.XPATH,'//*[@id="app"]/div[2]/div[2]/div[3]/div[2]/div[1]/div[1]/input')
phone_txt.send_keys("123456")# ############# 3.选择国家 #############
time.sleep(2)
driver.execute_script('document.querySelector(".area-code-select").children[18].click()')# ############# 4.读取cookie #############
data_string = driver.execute_script('return document.cookie;')# return document.title;print(data_string)# ############# 5.读取cookie #############
cookie_list = driver.get_cookies()print(cookie_list)

time.sleep(5)
driver.close()

等待

如果页面加载比较慢,需要等待某个元素加载成功后,再执行某些操作。

示例1:基于lambda表达式

driver.get('https://passport.bilibili.com/login')# #############  方式1:点击短信登录 #############
time.sleep(3)
sms_btn = driver.find_element(
    By.XPATH,'//*[@id="app"]/div[2]/div[2]/div[3]/div[1]/div[3]')
sms_btn.click()# #############  方式2:点击短信登录(推荐) #############
sms_btn = WebDriverWait(driver,30,0.5).until(lambda dv: dv.find_element(
    By.XPATH,'//*[@id="app"]/div[2]/div[2]/div[3]/div[1]/div[3]'))
sms_btn.click()

示例2:自定义函数

driver.get('https://passport.bilibili.com/login')deffunc(dv):print("无返回值,则间隔0.5s执行一次此函数;如有返回值,则复制给sms_btn变量")# <div xxx="123" id="uuu"></div># <img src="..."/>
    tag = dv.find_element(
        By.XPATH,'//*[@id="app"]/div[2]/div[2]/div[3]/div[1]/div[3]')
    img_src = tag.get_attribute("xxx")if img_src:return tag
    return

sms_btn = WebDriverWait(driver,30,0.5).until(func)
sms_btn.click()

time.sleep(250)
driver.close()

示例3:全局配置

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

service = Service("driver/chromedriver.exe")
driver = webdriver.Chrome(service=service)# 后续找元素时,没找到时则等待10去寻找(一旦找到则继续)
driver.implicitly_wait(30)

driver.get('https://passport.bilibili.com/login')

sms_btn = driver.find_element(
    By.XPATH,# '//*[@id="app"]/div[2]/div[2]/div[3]/div[1]/div[3]''//*[@id="xxxxxxxxxapp"]/div[2]/div[2]/div[3]/div[1]/div[3]')
sms_btn.click()print("找到了")
time.sleep(250)
driver.close()

获取值

当找到某个标签之后,想要获取标签内部值。

示例1:文本和属性

tag = driver.find_element(
    By.XPATH,'/html/body/div/div[2]/div/div[2]/div/div[2]/div[2]/div/div/div/div/div[2]/a[1]')print(tag.text)print(tag.get_attribute("target"))print(tag.get_attribute("data-toggle"))

driver.close()

示例2:获取值

例如:

<input type='text' value="?" placeholder="?" />

例如:

<select ><option value='1'>北京</option> </option value='2'>上海</option> </select>

,获取select标签的value属性

tag = driver.find_element(
    By.XPATH,'//*[@id="nav-searchform"]/div[1]/input')print(tag)print(tag.text)print(tag.get_attribute("placeholder"))print(tag.get_attribute("value"))

time.sleep(1000)
driver.close()

示例3:选择相关

<inputtype="radio"name="findcar"value="1"checked="">新车
<inputtype="radio"name="findcar"value="2">二手机
tag = driver.find_element(
    By.XPATH,'/html/body/div[1]/div[11]/div[2]/div[1]/div[1]/label[1]/span/input')print(tag.get_property("checked"))# True

tag = driver.find_element(
    By.XPATH,'/html/body/div[1]/div[11]/div[2]/div[1]/div[1]/label[2]/span/input')print(tag.get_property("checked"))# False

携带Cookie

driver.add_cookie({'name':'foo','value':'bar'})
# 注意:一定要先访问,不然Cookie无法生效
driver.get('https://dig.chouti.com/about')# 加cookie
driver.add_cookie({'name':'token','value':'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiJjZHVfNDU3OTI2NDUxNTUiLCJleHBpcmUiOiIxNzA0MzI5NDY5OTMyIn0.8n_tWcEHXsBSXWIY9rBoGWwaLPF8iWIruryhKTe5_ks'})# 再访问
driver.get('https://dig.chouti.com/')

time.sleep(2000)
driver.close()

IP检测和代理

快代理:https://www.kuaidaili.com

如果网站进行了IP访问限制,例如:每个IP每天只能操作5次。此时可以选择购买IP,然后在请求时添加代理IP即可,具体步骤:

  • 购买IP
  • 登录购买IP渠道的后台,配置自己IP白名单
  • 代码携带代理
import time
import requests
from selenium import webdriver

# 换成自己生成的代理
res = requests.get(url="https://dps.kdlapi.com/api/getdps/?secret_id=xxxxx")
proxy_string = res.json()['data']['proxy_list'][0]print(f"获取代理:{proxy_string}")# "182.106.136.218:40192"

opt = webdriver.ChromeOptions()
opt.add_argument(f'--proxy-server={proxy_string}')# 代理
driver = webdriver.Chrome(options=opt)

driver.get('https://myip.ipip.net/')

time.sleep(2000)
driver.close()

特征检测

有些网站为了防止selenium,会检测特征,并禁止访问。

如果想要正常使用selenium访问,那就需要隐藏浏览器相关的特征。

import time
import requests
from selenium import webdriver

opt = webdriver.ChromeOptions()

opt.add_argument('--disable-infobars')
opt.add_experimental_option("excludeSwitches",["enable-automation"])
opt.add_experimental_option('useAutomationExtension',False)

driver = webdriver.Chrome(options=opt)

无头和其他

如果不想显示展示在浏览器上的操作,只想偷偷的在后台运行。

opt.add_argument('--headless')
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

opt = webdriver.ChromeOptions()
opt.add_argument('--headless')## 无头
driver = webdriver.Chrome(options=opt)

其他配置:

opt.add_argument('--disable-infobars')# 禁止策略化
opt.add_argument('--no-sandbox')# 解决DevToolsActivePort文件不存在的报错
opt.add_argument('window-size=1920x3000')# 指定浏览器分辨率
opt.add_argument('--disable-gpu')# 谷歌文档提到需要加上这个属性来规避bug
opt.add_argument('--incognito')# 隐身模式(无痕模式)
opt.add_argument('--disable-javascript')# 禁用javascript
opt.add_argument('--start-maximized')# 最大化运行(全屏窗口),不设置,取元素会报错
opt.add_argument('--hide-scrollbars')# 隐藏滚动条, 应对一些特殊页面
opt.add_argument('lang=en_US')# 设置语言
opt.add_argument('blink-settings=imagesEnabled=false')# 不加载图片, 提升速度
opt.add_argument('User-Agent=Mozilla/5.0 (Linux; U; Androi....')# 设置User-Agent
opt.binary_location =r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"# 手动指定使用的浏览器位置

截屏

找到某个标签后,可以通过截图的形式保存图片。

driver.get('https://www.csdn.net')
tag = driver.find_element(
    By.XPATH,'//*[@id="floor-www-index_558"]/div/div[3]/div[1]/div[1]/dl/dt/a/img')# 截图&保存
tag.screenshot("demo.png")# 截图&图片内容
body = tag.screenshot_as_png
print(body)withopen('./demo.png','wb')as f:
    f.write(body)# 截图&Base64编码格式图片内容
b64_body = tag.screenshot_as_base64
print(b64_body)

driver.close()

本文转载自: https://blog.csdn.net/weixin_74144099/article/details/136049325
版权归原作者 林小果1 所有, 如有侵权,请联系我们删除。

“Selenium”的评论:

还没有评论