selenium 模块

什么是 selenium

  • 基于浏览器自动化的一个模块(简单来说就是 模拟用户操控浏览器的一套 接口)
  • 在爬虫中使用它,便捷的获取网站中动态加载的数据

使用 selenium 除了安装相应包之外,还需要安装 浏览器驱动程序chrome

简单使用

from lxml import etree
from selenium import webdriver

# 传入 浏览器驱动文件,实例化一个 浏览器对象
from selenium.webdriver.common.keys import Keys

bro = webdriver.Chrome(executable_path='../Package/chromedriver.exe')

bro.get('http://www.taobao.com')

# 获取页面 文本值(页面HTML代码)
# tree = etree.HTML(bro.page_source)

# 标签定位至 搜索框
search_input = bro.find_element_by_id('q')

# 执行 js 代码
bro.execute_script('window.scroll(0, document.body.scrollHeight)')

# [标签交互](https://blog.csdn.net/weixin_44065501/article/details/89314538)
search_input.send_keys('Iphone')
search_input.send_keys(Keys.ENTER)

# 回退页面, 前进 .forward()
bro.back()

bro.quit()

鼠标操作

from time import sleep

from selenium import webdriver
from selenium.webdriver import ActionChains

bro = webdriver.Chrome(executable_path='../Package/chromedriver.exe')

# # 此链接拖放 的是一个 img 标签 htnl5 原生实现拖放, 失败,且程序卡顿
# bro.get('https://www.runoob.com/try/try.php?filename=tryhtml5_draganddrop2')
# jquery ui 实现拖放
bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')

# 如果需要的标签 在 iframe(页面嵌套子页面)标签中。必须切换 当前标签的作用域 至 ifrme标签里面
bro.switch_to.frame('iframeResult')
# # img_id - 'drag1'
img = bro.find_element_by_id('draggable')

# 使用动作链,完成拖拽操作
action = ActionChains(bro)
# 按住鼠标左键
action.click_and_hold(img)
for i in range(5):
    # 鼠标偏移
    action.move_by_offset(50, 2)

# 释放鼠标
action.release()

# 执行所有储存的动作
action.perform()

sleep(5)
bro.quit()

无头浏览器(无可视化界面)/ 开发者模式 配置

from selenium import webdriver
from selenium.webdriver import ChromeOptions

# 无可视化界面 配置。
chrome_options = ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

# 不少网站对 selenium采取了检测机制,限制通过 selenium发送的请求。可以 开启开发者模式 规避某些检测
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])

bro = webdriver.Chrome(executable_path='../Package/chromedriver.exe', options=chrome_options)

bro.get('http://scxk.nmpa.gov.cn:81/xk/')
print(bro.page_source[:100])

bro.quit()

12306 登录模拟

from time import sleep
from selenium.webdriver import ActionChains
# 自行封装的一些方法
from Package.chaojiying import CodeOCR, picStr2list
from Package.mysel import mySel
from Package.util import base64file

CODE_PATH = './response/code.jpg'

bro = mySel('../Package/chromedriver.exe')

bro.get('https://kyfw.12306.cn/otn/resources/login.html')

a_tag = bro.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
# 等待页面动态加载完成, 点击进入秘密登录
sleep(1)
a_tag.click()

# 输入账号
bro.find_element_by_id('J-userName').send_keys('17311869093')
bro.find_element_by_id('J-password').send_keys('17311869093')


code_img_base = bro.find_element_by_id('J-loginImg')
# 获取base64 编码图片, 转换为二进制码,发送至超级鹰,返回相应位置的坐标
# 等待验证码加载
sleep(1)
code_img = code_img_base.get_attribute('src').replace('data:image/jpg;base64,', '', 1)
code_img = base64file(code_img, path=CODE_PATH)
# CodeOCR.PostPic 超级鹰接口
res = picStr2list(CodeOCR.PostPic(code_img, 9004)['pic_str'])
print(res)

# 根据 验证码区域的坐标进行点击
for x, y in res:
    ActionChains(bro).move_to_element_with_offset(code_img_base, x, y).click().perform()
    sleep(0.3)

bro.find_element_by_id('J-login').click()
sleep(1.3)

# 滑块直接 找到相应标签,左键点击长安右拖动一定距离就行, 注意规避selenium 检查规避
# 此 id 好像随时间改变?, 不确定 时?
lump = bro.find_element_by_id('nc_1_n1z')
action = ActionChains(bro)
action.click_and_hold(lump)
# 实际应该获取宽度拖动
action.move_by_offset(380, 0).perform()
action.release()

sleep(3)
bro.quit()

相关推荐:

来自系列:Python 爬虫学习笔记

分类 python下文章:

1.0 爬虫的介绍,和requests模块的简单使用

1.1 数据解析的三种方式。正则表达式, bs4, xpath

2.0 多任务(进程,协程,线程)爬虫:验证码识别,返回头储存,ip代理 介绍。 异步是什么,爬虫异步的方式。线程,进程,介绍

2.0.1 协程的 async/await 实现 爬虫 单线程 + 异步协程的实现

更多...

评论([[comments.sum]])

发表

加载更多([[item.son.length-2]])...

发表

2020-11 By chuan.

Python-flask & bootstrap-flask

图片外链来自:fghrsh

互联网ICP备案号:蜀ICP备2020031846号