爬虫进阶-selenium自动化

本文详细介绍了Selenium自动化测试模块的使用,包括安装、浏览器驱动配置、基本操作如元素定位、鼠标动作链。通过实例展示了如何进行网页操作、窗口切换、无头浏览器设置以及处理验证码等。此外,还提到了如何通过ActionChains进行复杂的鼠标动作,并提供了处理滑块验证码的示例代码。
摘要由CSDN通过智能技术生成

环境搭建:

  • selenium -> 自动化测试模块,非必要不建议使用该模块写爬虫,因为爬取速度太慢
  1. 安装模块pip install selenium
  2. 下载浏览器对应的驱动版本:
  3. 把解压出来的浏览器驱动可执行文件,移动到python解释器的所在文件夹;或者将驱动所在路径添加进环境变量也是可以的

基本使用:

  • 导入模块:
    • 导入模块:from selenium import webdriver
  • 创建浏览器对象:
    • driver = webdriver.Chrome/Edge()
  • 打开一个网址:
    • driver.get("xxx")

元素定位(4.0之前版本):

  • 利用xpath查找指定元素:
    • driver.find_element_by_xpath('')
      • 查找第一次出现的相关元素
    • driver.find_elements_by_xpath('')
      • 查找全部相关元素,返回结果为列表
  • 利用id查找:
    • driver.find_element_by_id('')
  • 利用class查找:
    • driver.find_element_by_class_name('')
  • 利用name查找:
    • driver.find_element_by_name('')
  • 利用标签查找:
    • driver.find_element_by_tag_name('')
  • 利用css查找:
    • driver.find_element_by_css_selector('')

最新定位方法:

  • 需导入模块:
    • from selenium.webdriver import Edge
    • from selenium.webdriver.common.by import By
  • 定位单个元素时使用:find_element(By.方法, '属性')
    • 使用.text即可获取元素内容
    • 使用.get_attribute('src')提取标签内的src属性值
    • 使用.send_keys("内容")向标签输入框内填写内容
  • 定位多个元素时使用:find_elements(By.方法, '属性')
    • 返回的结果为一个列表
# By的定位方法有以下几种:
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

鼠标动作链:

  • 导入模块:from selenium.webdriver import ActionChains
  • 鼠标移动事件:
    • ActionChains(driver).move_to_element(元素的位置).perform()
  • 鼠标左击事件:
    • ActionChains(driver).click(元素的位置).perform()
  • 鼠标左双击事件:
    • ActionChains(driver).double_click(元素的位置).perform()
  • 鼠标右击事件:
    • ActionChains(driver).context_click(元素的位置).perform()
  • 鼠标左击并保持
    • ActionChains(driver).click_and_hold(元素的位置).perform()
  • 将元素到指定元素并松开:
    • ActionChains(driver).drag_and_drop(原元素的位置, 新元素的位置).perform()
  • 将元素到指定坐标位置(以当前元素为起点):
    • ActionChains(driver).move_by_offset(x坐标, y坐标).perform()
  • 释放鼠标点击状态:
    • ActionChains(driver).release(xxx).perform()
  • 基础案例:
import time
from selenium.webdriver import Edge
from selenium.webdriver.common.keys import Keys
# 创建edge浏览器对象
driver = Edge()
# 打开浏览器访问网址
driver.get("https://www.lagou.com/")
# 提取`全国`标签的位置
el = driver.find_element_by_xpath('//*[@id="changeCityBox"]/p[1]/a')  # selenium4.0后废除该方法
# 鼠标点击时间 -- 点击el对象
el.click()
time.sleep(1)
# 找到文本框,输入指定的内容 -- 然后按回车
driver.find_element_by_xpath('//*[@id="search_input"]').send_keys("python", Keys.ENTER)
# 找到元素的所在标签位置 -- 存在li_list列表内
li_list = driver.find_elements_by_xpath('//*[@id="s_position_list"]/ul/li')
# 遍历li_list列表,并取出相应的内容
for li in li_list:
    job_firm = li.find_elements_by_xpath('./div/div[2]/div/a')[0].text
    job_name = li.find_elements_by_tag_name('h3')[0].text
    job_money = li.find_elements_by_xpath('./div/div/div[2]/div/span')[0].text
    print(job_firm, job_name, job_money)

窗口切换:

  • 创建浏览器对象:
    • driver = webdriver.Chrome/Edge()
  • 切换窗口:
    • driver.switch_to.window(driver.window_handles[下标])
    • 关闭子窗口:driver.close()
  • 页面操作:
    • 页面前进:driver.forward()
    • 页面后退:driver.back()
  • 处理iframe标签:
    • 先拿到iframe -> 切换视角到iframe -> 拿iframe内的数据
    • xxx = driver.find_element_by_xpath('')
    • driver.switch_to.frame(xxx)
      • 切回原页面:driver.switch_to.default_content()
    • xxx = driver.find_element_by_xpath('')
  • 窗口切换案例:
from selenium.webdriver import Edge
from selenium.webdriver.common.keys import Keys
driver = Edge()
driver.get('https://www.zhipin.com/')
driver.find_element_by_xpath('//*[@id="wrap"]/div[3]/div/div[1]/div[1]/form/div[2]/p/input').send_keys('python', Keys.ENTER)
driver.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[1]').click()
driver.switch_to.window(driver.window_handles[-1])
cont = driver.find_element_by_xpath('//*[@id="main"]/div[3]/div/div[2]/div[2]/div[1]/div').text
driver.close()
driver.switch_to.window(driver.window_handles[0])
xinzi = driver.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[1]/div/div[1]/div[1]/div/div[2]/span').text
gongsi = driver.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[1]/div/div[1]/div[2]/div/h3/a').text
print("薪资:{0},公司:{1}\n职业需求:{2}".format(xinzi, gongsi,cont))
driver.close()

无头浏览器:

  • 无头浏览器,顾名思义就是不显示浏览器窗口,让浏览器执行过程在后台自动完成
  • 配置无头浏览器参数:
    • options = Options()
    • options.add_argument("--headless")
    • options.add_argument("--disable-gpu")
  • 创建浏览器对象:
    • driver = webdriver.Chrome/Edge(options=xxx)
from selenium import webdriver
# 设置Edge无头浏览器模式
EDGE = {
    "browserName": "MicrosoftEdge",
    "version": "95.0.1020.40",
    "platform": "WINDOWS",
    "ms:edgeOptions": {
        'extensions': [],
        'args': [
            '--headless',
            '--disable-gpu'
        ]}
}
driver = webdriver.Edge(capabilities=EDGE)
driver.get('xxx')
from selenium import webdriver
# 设置Chrome无头浏览器模式
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('-–disable-gpu')
driver = webdriver.Chrome(options=options)
driver.get('xxx')

处理验证码:

import time
import chaojiying
from selenium.webdriver import Edge
# 创建浏览器对象
driver = Edge()
# 访问需要登陆的网站
driver.get('http://www.chaojiying.com/user/login/')
time.sleep(2)
# 超级鹰账户信息
chaojiying = chaojiying.Chaojiying_Client('账号', '密码', '产品ID')
# 提取登陆时需要的验证码
img = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/div/img').screenshot_as_png
# 利用超级鹰接口识别
yzm = chaojiying.PostPic(img, 1902)["pic_str"]
# 获取账号输入位置,并输入账号
user = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input').send_keys('账号')
# 获取密码输入位置,并输入密码
password = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input').send_keys('密码')
# 获取验证码输入位置,并输入验证码
yanzheng = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input').send_keys(yzm)
# 获取登陆按钮的位置,并点登陆
driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input').click()

其他操作:

  • 设置ua:
    • opt.add_argument(f'--user-agent={user_agent}')
  • 设置请求头:
    • opt.add_argument(f'--headers={headers}')
  • 设置代理:
    • opt.add_argument("--proxy-server=http://127.0.0.1:8080")
  • 刷新页面:
    • driver.refresh()
  • 获取cookie:
    • driver.get_cookies()
  • 隐式等待:
    • driver.implicitly_wait(10)
  • 跳转到页面的某个位置:
    • driver.execute_script("window.scrollBy(0,1500)")
  • 拖动滚动条,实现加载页面:
for x in range(1, 11, 2):
    time.sleep(0.5)
    j = x/10
    js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
    driver.execute_script(js)
  • 移除webdriver指纹:
# window.navigator.webdriver == false/undefined
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
        Object.defineProperty(navigator, 'webdriver', {
            get: () => false
        })
    """
})
  • 模拟人拖动滑块:
from selenium.webdriver import ActionChains as ac
# 实现滑动模块加速度
def get_tracks(self, distance):
    # 初速度
    v = 0
    # 0.3秒内的位移
    t = 0.3
    # 位移距离列表
    track = []
    # 当前的位移
    current = 0
    # 到达mid值开始减速
    mid = distance*4/5
    while current < distance:
        if current < mid:
            # 加速度越小,单位时间位移越小,模拟的轨迹越多越详细
            a = 2
        else:
            a = -3
        # 初速度
        v0 = v
        # 0.2秒内的位移
        s = v0*t+0.5*a*(t**2)
        # 当前位置
        current += s
        # 将当前轨迹添加进列表
        track.append(round(s))
        # 速度达到v,该速度作为下次的初速度
        v = v0 + a*t
    return track

# 选取滑块的元素
ele = driver.find_element_by_xpath('')
# 按住滑块元素不放
ac(driver).click_and_hold(ele).perform()
# 拖动滑块,xxx需要滑动的大小
tracks = get_tracks(xxx)
for track in tracks:
    ac(driver).move_to_offset(track, 0).perform()
# 暂停1秒后,释放鼠标左键
time.sleep(1)
ac(driver).release(ele).perform()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值