MegaMU个人站

欢迎光临

落日黄沙 白帆秋水 你可知谁的记忆在时空里飞?


使用selenium进行浏览器自动化操作

目录

为什么使用浏览器操作?

  • 规避基于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类来创建一个动作链

img

# 实例化对象
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)

img

原来网站的弹出弹窗会使程序报错,所以我们还要做错误捕获

简单应用

自动登陆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做为参数传给浏览器就行啦!

这个方法很基础很简陋!有些反爬比较严格网站还是能检测到!

用这个在网上自动抢东西岂不美哉!

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦