为什么使用浏览器操作?
- 规避基于request头的反爬手段
Selenium基础使用
Selenium的使用需要浏览器内核。再使用其他操作之前先指定浏览器驱动
from selenium import webdriver
brweser_1 = webdriver.Chrome(executable_path="浏览器驱动路径") # 使用Chrome浏览器
brweser_2 = webdriver.Firefox(executable_path="浏览器驱动路径") # 使用Firefox浏览器
...
基础用法
# 标签定位find_element_by_xx()
search_input = browser.find_element_by_id('q')
# 交互[输入]
search_input.send_keys('女生自用显卡')
# 标签定位
btn = browser.find_element_by_css_selector('.btn-search') # 根据css搜索
# btn = browser.find_element_by_class_name('btn-search') # 根据class搜索
# 交互
btn.click() # 点击
# 使用控制台execute_script()
# 向下移动一屏的命令: window.scrollTo(0,document.body.scrollHeight)
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
# 请求
browser.get('https://www.baidu.com/s?wd=女生自用显卡')
# 回退
browser.back()
sleep(3)
# 前进
browser.forward()
sleep(4)
# 关闭
browser.quit()
iframe处理
selenium不能直接搜索iframe标签里面的内容
要切换入该标签
from selenium import webdriver
browser = webdriver.Chrome(executable_path=r"D:\Documents\Desktop\Others\Tools\chromedriver_win32\chromedriver.exe")
browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
# 不能直接定位iframe标签内的标签!
# 先切换进要搜索的内容所处的iframe标签
browser.switch_to.frame('iframeResult') # 进入id为iframeResult的iframe标签内
div = browser.find_element_by_id('draggable') # 在此iframe标签内寻找
print(div)
动作链
我们把这个方框拖拽一下
使用selenium.webdriver中的ActionChains类来创建一个动作链
# 实例化对象
action = ActionChains(browser)
# 点击,长按div
action.click_and_hold(div)
for i in range(10):
# 在x方向拖动25像素
action.move_by_offset(25, 0).perform()
sleep(0.1)
# 释放
action.release()
方框进去了!然而,我们的程序却报错了
selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: dropped
Message: unexpected alert open: {Alert text : dropped}
(Session info: chrome=93.0.4577.63)
原来网站的弹出弹窗会使程序报错,所以我们还要做错误捕获
简单应用
自动登陆QQ空间
from selenium import webdriver
if __name__ == '__main__':
browser = webdriver.Chrome(executable_path=r"D:\Documents\Desktop\Others\Tools\chromedriver_win32\chromedriver.exe")
browser.get('https://i.qq.com/')
browser.switch_to.frame('login_frame')
login = browser.find_element_by_id('switcher_plogin')
login.click()
user_id = browser.find_element_by_id('u')
user_id.send_keys('QQ账号')
user_pwd = browser.find_element_by_id('p')
user_pwd.send_keys('QQ密码')
login_button = browser.find_element_by_id('login_button')
login_button.click()
浏览器无头化
前面我们使用selenium时,都会跳出浏览器对我们造成视觉干扰 现在使用selenium.webdriver.chrome.options中的Options模块来改变浏览器的参数
from selenium.webdriver.chrome.options import Options
chrome_option = Options()
chrome_option.add_argument('--headless')
chrome_option.add_argument('--disable--gpu')
然后,我们把chrome_option传给我们的浏览器对象
browser = webdriver.Chrome(executable_path=r"D:\Documents\Desktop\Others\Tools\chromedriver_win32\chromedriver.exe", chrome_options=chrome_option)
顺便,我们输出一下页面内容,来验证浏览器确实在工作
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
if __name__ == '__main__':
chrome_option = Options()
chrome_option.add_argument('--headless')
chrome_option.add_argument('--disable--gpu')
browser = webdriver.Chrome(executable_path=r"D:\Documents\Desktop\Others\Tools\chromedriver_win32\chromedriver.exe",
options=chrome_option)
browser.get('https://i.qq.com/')
browser.switch_to.frame('login_frame')
login = browser.find_element_by_id('switcher_plogin')
login.click()
user_id = browser.find_element_by_id('u')
user_id.send_keys('QQ账号')
user_pwd = browser.find_element_by_id('p')
user_pwd.send_keys('QQ密码')
login_button = browser.find_element_by_id('login_button')
login_button.click()
print(browser.page_source)
browser.quit()
确实有输出!
无头浏览器用完记得quit()一下!
防止selenium被网站检测到【基础】
使用selenium.webdriver中的ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
再把option做为参数传给浏览器就行啦!
这个方法很基础很简陋!有些反爬比较严格网站还是能检测到!