文章目录
基本使用
创建浏览器对象并加载页面
注意要将浏览器驱动放在当前项目目录下或配置环境变量。
from selenium import webdriver
driver = webdriver.Chrome('chromedriver.exe')
driver.get('https://www.baidu.com')
设置浏览器大小
两种方式:1、set_window_size
方法可以指定分辨率设置窗口大小。
2、maximize_window
方法可以将窗口最大化。
from selenium import webdriver
driver = webdriver.Chrome('chromedriver.exe')
# 设置浏览器大小
# driver.set_window_size(1920, 1080)
# 将浏览器设置为全屏
driver.maximize_window()
网页的前进与后退
from selenium import webdriver
import time
url = 'https://www.chinanews.com/scroll-news/news1.html'
url1 = 'https://www.baidu.com/'
url2 = 'https://www.taobao.com/'
# 创建浏览器对象
driver = webdriver.Chrome('chromedriver.exe')
# 请求链接
driver.get(url1)
driver.get(url2)
driver.get(url)
# 后退
driver.back()
time.sleep(1)
# 前进
driver.forward()
设置滚动条
from selenium import webdriver
import time
url = 'https://www.chinanews.com/scroll-news/news1.html'
# 创建浏览器对象
driver = webdriver.Chrome('chromedriver.exe')
driver.get(url)
max_y = 4000
y = 0
while y <= max_y:
driver.execute_script(f'window.scrollTo(0, {y})')
y += 1000
time.sleep(1)
元素定位
from selenium import webdriver
import time
url = 'https://www.chinanews.com/scroll-news/news1.html'
# 创建浏览器对象
driver = webdriver.Chrome('chromedriver.exe')
driver.get(url)
# 打印网页源码:str类型 ---> bs4
# print(driver.page_source, type(driver.page_source))
contents = driver.find_element_by_id('content_right').text
# print(contents)
# 新闻标题
news_title = driver.find_element_by_class_name('dd_bt').text
print(news_title)
# 新闻链接
news_href = driver.find_element_by_css_selector\
('#content_right > div.content_list > ul > li > div.dd_bt > a').get_attribute('href')
print(news_href)
# 新闻时间
news_time = driver.find_element_by_class_name('dd_time').text
print(news_time)
# 新闻类型
news_type = driver.find_element_by_css_selector\
('#content_right > div.content_list > ul > li:nth-child(1) > div.dd_lm').text
print(news_type)
# 休眠
time.sleep(3)
# 自动关闭浏览器
# driver.close()
driver.quit()
自动关闭浏览器有两种方式,二者区别如下:close(),如果selenium打开了一个浏览器窗口,但是这个窗口有多个标签页,只会关闭当前所在页,quit()直接关闭浏览器窗口浏览器打开时会产生缓存文件,close()只关闭浏览器,不会执行清理缓存操作,quit()在关闭浏览器的同时会清理缓存。
基本配置
from selenium import webdriver
# 创建设置对象
options = webdriver.ChromeOptions()
# 解决DevToolsActivePort文件不存在的报错
options.add_argument('--no-sandbox')
# 谷歌文档提到需要加上这个属性来规避bug
options.add_argument('--disable-gpu')
# 隐藏滚动条, 应对一些特殊页面
options.add_argument('--hide-scrollbars')
# 不加载图片, 提升速度
options.add_argument('blink-settings=imagesEnabled=false')
# 设置取消图片加载
options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
# 设置取消测试环境
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
options.add_argument('--headless')
# 设置代理
option.add_argument('--proxy-server=socks5://代理服务器:端口')
# 避免终端下执行代码报错
options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])
# 设置配置
driver = webdriver.Chrome(options=options)
# -------------------------------------------------
# 防止selenium被监测
# 先修改js,再加载js
driver.execute_cdp_cmd(
"Page.addScriptToEvaluateOnNewDocument",
{
"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
}
)
获取cookie及使用cookie
获取登录淘宝页面的cookie,这样在访问淘宝页面后,传入cookie,再请求页面,就可以实现自动登录淘宝操作,于是可以避免每次操作淘宝页面都需要进行登录操作。
import time
from selenium import webdriver
url1 = 'https://www.taobao.com/'
url2 = 'https://www.baidu.com/'
# 设置配置项
options = webdriver.ChromeOptions()
# 不加载图片,提升速度
options.add_argument('blink-settings=imagesEnabled=false')
driver = webdriver.Chrome('chromedriver.exe', options=options)
driver.get(url1)
# 打开新的标签页
driver.execute_script('window.open()')
print(driver.window_handles) # 一个列表,有两个标签页
# 切换到新的标签页
driver.switch_to.window(driver.window_handles[1])
driver.get(url2)
time.sleep(1)
# 切换到第一个标签页
driver.switch_to.window(driver.window_handles[0])
driver.maximize_window()
# 点击登录选项
driver.find_element_by_class_name('h').click()
# 点击二维码
driver.find_element_by_class_name('icon-qrcode').click()
# 隐式等待:全局等待方式,在指定时间内等待成功了就终止等待
driver.implicitly_wait(20)
# 检测信息是否加载成功
driver.find_element_by_class_name('site-nav-login-info-nick ')
# 获取cookie
cookie = driver.get_cookies()
print(cookie)
# 保存cookie,数据的持久化
with open('cookie.txt', 'w') as file:
file.write(str(cookie))
driver.quit()
设置配置项,可以添加不加载图片,提升速度的配置。
传入cookie,在淘宝页面搜索框输入内容,点击搜索按钮,滑动搜索页面。
import time
from numpy import safe_eval
from selenium import webdriver
from selenium.webdriver.common import keys
url = 'https://www.taobao.com/'
options = webdriver.ChromeOptions()
options.add_argument('blink-settings=imagesEnabled=false')
with open('cookie.txt', 'r') as file:
cookie = file.read()
new_cookie = safe_eval(cookie)
driver = webdriver.Chrome('chromedriver.exe', options=options)
# 防止selenium被监测
# 先修改js,再加载js
driver.execute_cdp_cmd(
"Page.addScriptToEvaluateOnNewDocument",
{
"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
}
)
# 先访问淘宝页面,再传cookie
driver.get(url)
for i in new_cookie:
if i['secure']:
driver.add_cookie(i)
# 再次请求页面
driver.get(url)
# 定位搜索框
search = driver.find_element_by_id('q').send_keys('秋装女小个子')
time.sleep(2)
# enter = driver.find_element_by_class_name('btn-search').click()
# 键盘事件
enter = driver.find_element_by_class_name('btn-search').send_keys(keys.Keys.ENTER)
time.sleep(3)
# 拖动滚动条
max_y = 5000
y = 0
while y <= max_y:
driver.execute_script(f'window.scrollTo(0, {y})')
y += 1000
time.sleep(1)
print(driver.page_source)
time.sleep(2)
driver.quit()
注意:由于之前保存cookie的是列表样式的字符串,因此需要使用
safe_eval()
方法将字符串解析为列表,列表中的内容是字典,传入cookie时需要注意:
先请求页面,再传入cookie,再请求页面。
传入的cookie必须是字典。
当字典中的键
secure
值为False时,cookie传不进去,因此需要设置条件。
为了防止selenium被检测,需要设置配置项。
隐式等待与显示等待
淘宝登录与搜索
import getpass
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = 'https://www.taobao.com/'
# 创建设置对象
options = webdriver.ChromeOptions()
# 避免终端下执行代码报错
options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])
# 不加载图片
options.add_argument('blink-settings=imagesEnabled=false')
driver = webdriver.Chrome('chromedriver.exe', options=options)
# # 隐式等待
# driver.implicitly_wait(30)
# 防止selenium被监测
# 先修改js,再加载js
driver.execute_cdp_cmd(
"Page.addScriptToEvaluateOnNewDocument",
{
"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
}
)
driver.get(url)
# 找到登录按钮,点击
driver.find_element_by_class_name('h').click()
user = input('请输入账号:')
password = getpass.getpass('请输入密码:')
# 输入账号
driver.find_element_by_id('fm-login-id').send_keys(user)
# 输入密码
driver.find_element_by_id('fm-login-password').send_keys(password)
# 点击登录
driver.find_element_by_class_name('fm-button').click()
# 显示等待(不会等待js加载成功)
WebDriverWait(driver, 20).until(
EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#J_LoginInfo > div.menu-hd > a'), 'tb18471010')
)
# 搜索商品
search = driver.find_element_by_id('q')
search.send_keys('月饼')
search.send_keys(Keys.ENTER)
implicitly_wait()
:隐式等待,设置等待时间,是对页面中的所有元素设置加载时间,即整个页面的加载时间,放在请求网页之前。
WebDriverWait()
:显示等待是针对于某个特定的元素设置的等待时间。
iframe 与default_content的切换
在某些网页定位元素时,可能定位不到,这时需要考虑该元素是否在iframe标签之下。
如果想要代码能够正常执行,需要先切换到元素所在的frame下,切换frame使用的语句为:driver.switch_to.frame()
此处需要分为两种情况进行操作:
- 需要切换至的frame有id或name标记,则可以直接使用切换语句,如
driver.switch_to.frame() ,括号内填入frame的id
或name
属性值均可。如:
driver.switch_to.frame('login-iframe')
- frame没有id或name标记,但有
class
属性,需要先获取到对应的frame(使用css选择器定位或xpath定位),然后在切换至该frame,如:
frame1 = driver.find_element_by_css_selector('#page > div.content.bg_default > div > div > iframe')
driver.switch_to.frame(frame1)
QQ空间登录页面:定位账号密码登录这个元素时,需要切换到iframe标签,才能定位到该元素。
当然,要切换到iframe标签之外的元素时,切换到default_content即可。
from selenium import webdriver
url = 'https://qzone.qq.com'
driver = webdriver.Chrome('chromedriver.exe')
driver.get(url)
# 切换到iframe
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
# 从iframe中切换出来
driver.switch_to.default_content()
driver.find_element_by_class_name('icon_ipad').click()