«

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()

九、页面等待

  1. 强制等待
    • 就是time.sleep()
    • 缺点是不智能,设置时间太短,元素没加载出来,设置时间太长,则浪费时间
  2. 隐士等待
    • 针对的是元素定位,设置了一个时间,在一段时间内判断元素是否定位成功,如果完成了,就进行下一步
    • 在设置的时间内没有定位成功,则会报超时加载
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()
  1. 显示等待
    • 明确等待某一个元素
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()

标签: 爬虫