赞
踩
安装模块
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 time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
service = 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()
如果【选择标签】【执行操作】这种操作起来比较繁琐,也可以直接在页面上去执行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') def func(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:选择相关
<input type="radio" name="findcar" value="1" checked="">新车
<input type="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
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()
快代理:https://www.kuaidaili.com
如果网站进行了IP访问限制,例如:每个IP每天只能操作5次。此时可以选择购买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) with open('./demo.png', 'wb') as f: f.write(body) # 截图&Base64编码格式图片内容 b64_body = tag.screenshot_as_base64 print(b64_body) driver.close()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。