Python Selenium框架
目录
1. selenium介绍
# 介绍:
1.selenium是一个web自动化测试用的框架. 程序员可以通过代码实现对浏览器的控制, 比如打开网页, 点 击网页中的元素, 实现鼠标滚动等操作.
2.它支持多款浏览器, 如谷歌浏览器, 火狐浏览器等等, 当然也支持无头浏览器.
# 目的:
在爬取数据的过程中, 经常遇到动态数据加载, 一般动态数据加载有两种, 一种通过ajax请求加载数据, 另 一种通过js代码加载动态数据. selenium可以模拟人操作真实浏览器, 获取加载完成的页面数据
ajax:
url有规律且未加密, 直接构建url连接请求
url加密过无法破解规律 --> selenium
js动态数据加载 --> selenium
2. selenium安装
三要素: 浏览器, 驱动程序, selenium框架
浏览器: 推荐谷歌浏览器, 标准稳定版本 驱动程序:http://chromedriver.storage.googleapis.com/index.html
pip install selenium
# 测试:
from selenium import webdriver
browser = webdriver.Chrome('./chromedriver.exe') # 将驱动放在脚本所在的文件夹
browser.get('https://www.baidu.com')
3. selenium常用操作
# 实例化浏览器对象:
from selenium import webdriver
browser = webdriver.Chrome('driverpath') ----->(跟插件的地址)
# 发送get请求:
browser.get('https://www.baidu.com')
browser.get('https://image.baidu.com')
browser.page_source
# 获取网页的数据: browser.page_source ---> str类型
# 获取页面元素:
find_element_by_id:根据元素的id
find_element_by_name:根据元素的name属性
find_element_by_xpath:根据xpath表达式
find_element_by_class_name:根据class的值(如果class中的属性是多值,有空格,会出错)
find_element_by_css_selector:根据css选择器
find_element_by_xpath("//*[contains(text(), '{}')]".format(a2.strip())).click() # 根据包含该字体的进行抓取,缺点只会抓取第一次出现的,尽量跟据页面唯一id抓取
# 节点交互操作:
click(): 点击
send_keys(): 输入内容
clear(): 清空操作
execute_script(js): 执行指定的js代码
# JS代码: window.scrollTo(0, document.body.scrollHeight)可以模拟鼠标滚动一屏高度
quit(): 退出浏览器
# frame
# 若爬取一个页面,需观察如果有两个HTML(一个父HTML,一个子HTML),所需内容在子HTML中,则需要switch_to.frame('frameid') 转至子页面继续操作
switch_to.frame('frameid')
3.1 selenium设置无头浏览器加代理
from selenium import webdriver
chrome_opt = webdriver.ChromeOptions()
chrome_opt.add_argument(
'user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"') # 添加UA
chrome_opt.add_argument('window-size=1200x1050') # 设置窗口大小
chrome_opt.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_opt.add_argument('blink-settings=imagesEnabled=false')
chrome_opt.add_argument('--disable-infobars')
chrome_opt.add_argument("--headless") #使用无头浏览器
chrome_opt.add_argument('--disable-gpu') # 禁用gpu
chrome_opt.add_argument('--no-sandbox')
chrome_opt.add_argument("--proxy-server=%s" % func1(ip_list)) # 使用添加代理
browser = webdriver.Chrome(
executable_path="./chromedriver.exe",
options=chrome_opt)
3.2 selenium add_argument参数详解
*chrome_options.add_argument('--user-agent=""') # 设置请求头的User-Agent
chrome_options.add_argument('--window-size=1280x1024') # 设置浏览器分辨率(窗口大小)
chrome_options.add_argument('--start-maximized') # 最大化运行(全屏窗口),不设置,取元素会报错
chrome_options.add_argument('--disable-infobars') # 禁用浏览器正在被自动化程序控制的提示
chrome_options.add_argument('--incognito') # 隐身模式(无痕模式)
chrome_options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument('--disable-javascript') # 禁用javascript
chrome_options.add_argument('--blink-settings=imagesEnabled=false') # 不加载图片, 提升速度
chrome_options.add_argument('--headless') # 浏览器不提供可视化页面
chrome_options.add_argument('--ignore-certificate-errors') # 禁用扩展插件并实现窗口最大化
chrome_options.add_argument('--disable-gpu') # 禁用GPU加速
chrome_options.add_argument('–disable-software-rasterizer')
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--start-maximized')*
3.3 规避浏览器检测selenium
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
options = ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
bro = Chrome(options=options)
bro.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
url = "fudan.bbs.kaoyan.com" # 首页
bro.get(url)
bro.implicitly_wait(10) # 智能等待
4. QQ空间模拟登陆
from selenium import webdriver
import time
# 实例化浏览器对象
browser = webdriver.Chrome('./chromedriver.exe')
# 打开qq空间登陆页面
browser.get('https://qzone.qq.com/')
time.sleep(1)
# 转至frame子页面
browser.switch_to.frame('login_frame')
# 获取密码登陆选项并点击
a_tag = browser.find_element_by_id('switcher_plogin')
a_tag.click()
time.sleep(1)
# 获取账号输入框并输入账号
browser.find_element_by_id('u').clear()
user = browser.find_element_by_id('u')
user.send_keys('1816668038')
time.sleep(1)
# 获取密码输入框并输入密码
browser.find_element_by_id('p').clear()
pwd = browser.find_element_by_id('p')
pwd.send_keys('1971628197192liu')
time.sleep(1)
# 获取登陆按钮并单击
button = browser.find_element_by_id('login_button')
button.click()
'''
微博模拟登陆
'''''
# import requests,time
# from selenium import webdriver
# broeser = webdriver.Chrome('./chromedriver.exe')
# broeser.get('https://weibo.com/login.php')
#
# input_tag = broeser.find_element_by_id('loginname')
# input_tag.clear()
# input_tag.send_keys('15135544556')
# time.sleep(3)
# input_tag_pwd = broeser.find_element_by_xpath('//div[@class="info_list password"]/div[@class="input_wrap"]/input')
# input_tag_pwd.clear()
# input_tag_pwd.send_keys('123456789liu')
# time.sleep(3)
# button_tag = broeser.find_element_by_xpath('//div[@class="W_login_form"]/div[@class="info_list login_btn"]/a')
# button_tag.click()
5. 图片懒加载
'''
网址 http://sc.chinaz.com/tupian/ 站长素材
图片懒加载
'''''
import requests
from lxml import etree
url = 'http://sc.chinaz.com/tupian/bingxueshijie.html'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
}
res = requests.get(url=url,headers=headers)
tree = etree.HTML(res.text)
#src2的位置,在必要的时候可以把值赋给src----懒加载核心
ret = tree.xpath('//div[@id="container"]/div/div/a/img/@src2')
for i in ret:
comment = requests.get(url=i,headers=headers).content
name = i.split('/')[-1]
with open('./image/%s'% name,'wb') as f:
f.write(comment)
6. Python+Selenium 实现打开浏览器、定时刷新页面
# 方法一
import time
from selenium import webdriver
# driver = webdriver.Firefox() 打开火狐浏览器
driver = webdriver.Chrome() # 打开Chrome
driver.maximize_window() #最大化窗口
driver.get('www.baidu.com') #打开地址
time.sleep(60) #睡眠60s
driver.refresh() #刷新打开的页面
driver.close() #关闭浏览器
# 方法二
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
driver.get("https://www.baidu.com")
time.sleep(2)
try:
driver.refresh() # 刷新方法 refresh
print ('test pass: refresh successful')
except Exception as e:
print ("Exception found", format(e))
driver.quit()