Selenium
时间:2023-2-28 23:19 作者:wen 分类: Python
Selenium能够大幅度降低爬虫的编写难度,但是同时性能也大幅度下降,不建议写爬虫
一、介绍
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium可以直接调用浏览器,它支持所有主流浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏等。
二、chrome浏览器的运行效果
在下载号chromedriver以及安装号selenium模块后,执行下列代码并观察运行的过程,下载地址
pip install selenium
from selenium import webdriver
# 如果driver没有添加到环境变量,则需要将driver的绝对路径赋值给executable_path参数
# driver = webdriver.chrome(executable_path = "/home/worker/Desktop/driver/chromedriver")
# 如果driver添加了环境变量则不需要设置executable_path
driver = webdriver.Chrome()
# 向一个URL发起请求
driver.get("http://www.wenxk.top/")
# 把网页保存为图片,69版本以上的谷歌浏览器将无法使用截图功能
# driver.save_screenshot("wenxk.png")
print(driver.title) # 打印页面标题
# 退出模拟浏览器
driver.quit() # 一定要退出!不退出会有残留进程
phantomjs无界面浏览器效果
PhantomJS是一个基于Webkit的“无界面”(headiess)浏览器,它会把网站加载到内存并执行页面上的JavaScript。下载地址
from selenium import webdriver
# 指定driver的绝对路径
driver = webdriver.PhantomJS(executable_path="/home/worker/Desktop/driver/phantomjs")
# 向一个url发起请求
driver.get("http://www.wenxk.top/")
# 把网页保存为图片
driver.save_screenshot("wenxk.png")
# 退出模拟浏览器
driver.quit() # 一定要退出!不退出会有残留进程
简单使用:
import time
from selenium import webdriver
# 如果driver没有添加到环境变量,则需要将driver的绝对路径赋值给executable_path参数
# driver = webdriver.chrome(executable_path = "/home/worker/Desktop/driver/chromedriver")
# 如果driver添加了环境变量则不需要设置 executable_path
driver = webdriver.Firefox(executable_path= "E:\Python\geckodriver.exe")
# 向一个URL发起请求
driver.get("http://www.baidu.com/")
# 把网页保存为图片,69版本以上的谷歌浏览器将无法使用截图功能
# driver.save_screenshot("wenxk.png")
print(driver.title) # 打印页面标题
# 在百度搜索框中搜索python
driver.find_element_by_id('kw').send_keys('python')
# 点击百度搜索
driver.find_element_by_id('su').click()
# 休眠
time.sleep(6)
# 退出模拟浏览器
driver.quit() # 一定要退出!不退出会有残留进程
# driver对象常用属性和方法
driver.page_source # 当前标签页浏览器渲染之后的网页源代码
driver.current_url # 当前标签页的url
driver.close() # 关闭当前标签页url
driver.quit() # 关闭浏览器
driver.forward() # 页面前进
driver.back() # 页面后退
driver.save_screenshot() # 页面截图保存
三、元素定位
# 元素定位
driver.find_element_by_id() # 返回一个元素
driver.find_element_by_class_name() # 根据类名获取元素列表
driver.find_elements_by_class_name() # 根据类名获取元素列表
driver.find_element_by_name() # 根据标签的name属性值返回包含标签对象元素的列表
driver.find_elements_by_name() # 根据标签的name属性值返回包含标签对象元素的列表
driver.find_element_by_xpath() # 返回一个包含元素的列表
driver.find_elements_by_xpath() # 返回一个包含元素的列表
driver.find_element_by_partial_link_text() # 根据连接文件获取元素列表
driver.find_elements_by_partial_link_text() # 根据连接文件获取元素列表
driver.find_element_by_tag_name() # 根据标签名获取元素列表
driver.find_elements_by_tag_name() # 根据标签名获取元素列表
driver.find_element_by_css_selector() # 根据css选择器获取元素列表
driver.find_elements_by_css_selector() # 根据css选择器获取元素列表
四、元素操作
from selenium import webdriver
driver = webdriver.Firefox(executable_path= "E:\Python\geckodriver.exe")
driver.get("http://www.wenxk.top/")
ret = driver.find_elements_by_tag_name('h2')
# 获取文本
for ele in ret:
print(ele.text,end='\n')
ret = driver.find_elements_by_link_text("php XML转换为数组")
# 获取属性值
print(ret[0].get_attribute('href'))
# 退出模拟浏览器
driver.quit() # 一定要退出!不退出会有残留进程
五、标签页的切换
from selenium import webdriver
driver = webdriver.Firefox(executable_path="E:\Python\geckodriver.exe")
driver.get("http://www.wenxk.top/")
el = driver.find_element_by_xpath('/html/body/div/div/div/div[2]/div/main/section/div/div[2]/div/div/div/div[1]/div[2]/article/header/h2/a')
el.click()
# 获取当前所有的标签页的句柄构成的列表
current_windows = driver.window_handles
print(current_windows)
# 根据标签页句柄列表索引下进行切换
driver.switch_to.window(current_windows[0])
driver.quit()
六、frame窗口切换
import time
from selenium import webdriver
driver = webdriver.Firefox(executable_path="E:\Python\geckodriver.exe")
driver.get("https://qzone.qq.com/")
# 切换
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_id('u').send_keys('xxx')
driver.find_element_by_id('p').send_keys('xxx')
el = driver.find_element_by_id('login_button')
el.click()
time.sleep(3)
driver.quit()
七、cookie处理
from selenium import webdriver
driver = webdriver.Firefox(executable_path="E:\Python\geckodriver.exe")
driver.get("http://www.baidu.com/")
# 获取cookie
print(driver.get_cookies())
# 删除cookie
cookies = {}
# for data in driver.get_cookies():
# cookies[data['name']] = data['value']
cookies = {data['name']: data['value'] for data in driver.get_cookies()}
print(cookies)
driver.delete_cookie('BA_HECTOR')
# 删除所有的cookie
driver.delete_all_cookies()
driver.quit()
八、控制浏览器执行js代码
from selenium import webdriver
driver = webdriver.Firefox(executable_path="E:\Python\geckodriver.exe")
driver.get("http://www.wenxk.top/")
js = "window.scrollTo(0,document.body.scrollHeight)" # js语句
driver.execute_script(js) # 执行js脚本
time.sleep(2)
driver.quit()
九、页面等待
- 强制等待
- 就是time.sleep()
- 缺点是不智能,设置时间太短,元素没加载出来,设置时间太长,则浪费时间
- 隐士等待
- 针对的是元素定位,设置了一个时间,在一段时间内判断元素是否定位成功,如果完成了,就进行下一步
- 在设置的时间内没有定位成功,则会报超时加载
from selenium import webdriver
driver = webdriver.Firefox(executable_path="E:\Python\geckodriver.exe")
driver.get("http://www.wenxk.top/")
# 设置位置之后的所有元素定位操作都有最大等待时间十秒,在10秒内回定期进行元素定位,超过设置时间之后将会报错
driver.implicitly_wait(10)
el = driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[2]/div[1]/img[2]')
driver.quit()
- 显示等待
- 明确等待某一个元素
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Firefox(executable_path="E:\Python\geckodriver.exe")
driver.get("http://www.baidu.com/")
# 显示等待
WebDriverWait(driver,20,0.5).until(EC.presence_of_element_located(By.LINK_TEXT,'好123'))
# 参数20表示最长等待20秒
# 参数0.5表示0.5秒检查一次规定的标签是否存在
# EC.presence_of_element_located(By.LINK_TEXT,'好123') 表示通过连接文本内容定位标签
# 每0.5秒一次检查,通过链接文本内容定位标签是否存在,如果存在就向下执行;如果不存在,知道20秒上限为止
print(driver.find_elements_by_link_text('hao123').get_attribute('href'))
driver.quit()
十、开启无界面模式
from selenium import webdriver
# 实例化配置对象
options = webdriver.FirefoxOptions()
# 配置对象添加开启无界面模式命令
options.add_argument('--headless')
# 配置对象添加禁用gpu的命令
options.add_argument('--disable-gpu')
driver = webdriver.Firefox(executable_path="E:\Python\geckodriver.exe",options=options)
driver.get('http://baidu.com')
driver.save_screenshot('baidu.png')
driver.quit()
十一、使用代理
from selenium import webdriver
# 实例化配置对象
options = webdriver.FirefoxOptions()
# 配置对象添加开启无界面模式命令
options.add_argument('--headless')
# 配置对象添加禁用gpu的命令
options.add_argument('--disable-gpu')
# 配置对象添加使用代理IP命令
options.add_argument('--proxy-server=http://47.243.190.108:7890')
driver = webdriver.Firefox(executable_path="E:\Python\geckodriver.exe",options=options)
driver.get('http://baidu.com')
driver.save_screenshot('baidu.png')
driver.quit()
十二、更换user-agent
from selenium import webdriver
# 实例化配置对象
options = webdriver.FirefoxOptions()
# 配置对象添加开启无界面模式命令
options.add_argument('--headless')
# 配置对象添加禁用gpu的命令
options.add_argument('--disable-gpu')
# 配置对象添加使用代理IP命令
options.add_argument('--proxy-server=http://47.243.190.108:7890')
# 配置对象添加user-agent
options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0')
driver = webdriver.Firefox(executable_path="E:\Python\geckodriver.exe",options=options)
driver.get('http://baidu.com')
driver.save_screenshot('baidu.png')
driver.quit()
标签: 爬虫