背景介绍
在使用selenium访问一个网站的时候会一直304跳转,导致出验证码。百度许久添加了种种参数设置也没用。
后面尝试用undetected_chromedriver,可以解决这个问题。
注: python3.7 以下无法使用
第三方包安装
pip install undetected_chromedriver
1. 访问目标网站
import undetected_chromedriver as uc
# 指定谷歌浏览器版本 我是109.
# headless是否无头
driver = uc.Chrome(version_main=109,headless=True)
driver.get('https://www.baidu.com/')
driver.quit()
2. 模拟浏览器加代理
他这个加隧道是一样的,get后会提示你输入账号密码
options = uc.ChromeOptions() # 创建Chrome参数对象
# options.add_argument("--window-size=1920x1080") # 设置分辨率
options.add_argument("--proxy-server=http://http-dyn.abuyun.com:9020") # 加代理
driver = uc.Chrome(version_main=109,options=options)
3. 解析文档
undetected_chromedriver不支持find_element_by_xpath 类似写法
# 返回的是符合条件的第一个
driver.find_element(By.XPATH,'//span[@class="address"]').text
# 返回的是个列表
ul = driver.find_elements(By.XPATH,'//ul/li')
for li in ul:
li.find_element(By.CLASS_NAME,'abc').text
li.find_element(By.TAG_NAME,'abc').text
li.find_element(By.XPATH,'//a[@class="hot-title"]/div').get_attribute('aria-label')
4. 点击、切换
一个小例子介绍 点击、切换、隐式等待、显示等待
流程:
- 获取当前列表页句柄
- 点击进入详情页,并切换至详情页句柄
- 解析,获取数据
- 关闭详情页,切换回列表页句柄
# 获取当前窗口位置
search_window = driver.current_window_handle
# # 如果是只需等待页面中的一个元素就用显示,等待整个网页加载就用隐式。
# # 显式等待
# WebDriverWait(li, 10).until(
# EC.presence_of_element_located((By.XPATH, './/a[@class="job-card-left"]'))
# )
# 隐式等待
driver.implicitly_wait(10)
# 点击
li.find_element(By.XPATH,'.//a[@class="job-card-left"]').click()
# 获取全部页面句柄
all_handles = driver.window_handles
# 将当前句柄定位到新打开的页面
driver.switch_to.window(all_handles[-1])
# 解析页面
parse(driver)
# 关闭当前标签页
driver.close()
# 跳转回
for handle in all_handles:
if handle == search_window:
driver.switch_to.window(handle)
driver.quit()