Selenium模块

Posted fanhua-wushagn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Selenium模块相关的知识,希望对你有一定的参考价值。

Selenium模块

作用

  • 便捷的获取页面中动态加载的数据

  • 便捷的模拟登录

简单使用

环境安装:

pip install selenium

根据浏览器版本下载web驱动:http://npm.taobao.org/mirrors/chromedriver (谷歌)

Selenium的使用流程:

# 实例化web驱动 绑定对应的驱动程序   driverpath为本地驱动程序的路径
web = webdriver.Chrome(executable_path="driverpath")

# 发起请求
web.get("url")

# 获取页面数据
page_text = web.page_source

# 关闭浏览器
web.quit()

Selenium的方法:

获取标签:

find方法:

# ============ find方法

# 根据id、 ClassName、TagName查找元素  参数: (by=id/ClassName/TagName查找元素,value="")
web.find_element()
web.find_elements()

# === 根据名字查找
# 根据查找标签
web.find_element_by_name()
web.find_elements_by_name()
# 根据属性类名查找标签
web.find_element_by_class_name()
web.find_elements_by_class_name()
# 根据标签名查找标签
web.find_element_by_tag_name()
web.find_elements_by_tag_name()

# 根据id名查找标签
web.find_element_by_id()
web.find_elements_by_id()


# 根据超链接内容查找标签
web.find_element_by_link_text()
web.find_elements_by_link_text()

# 根据超链接内容查找标签
web.find_element_by_partial_link_text()
web.find_elements_by_partial_link_text()

# 根据xpath查找标签
web.find_element_by_xpath(//div/td[1])
web.find_elements_by_xpath(//div/td[1])

页面操作:

前进: web.forword() 

后退: web.back() 

应用实例:

from selenium import webdriver
from lxml import etree
import time
# 实例化web驱动 绑定对应的驱动程序
web = webdriver.Chrome(executable_path="./chromedriver")
# 发起请求
web.get("http://125.35.6.84:81/xk")
# 获取页面数据
page_text = web.page_source
# 解析企业信息
tree = etree.html(page_text)
li_list = tree.xpath("//ul[@id=‘gzlist‘]/li")

for li in li_list:
    name = li.xpath(./dl/@title)[0]
    print(name)

time.sleep(2)

web.get("https://www.baidu.com/")
time.sleep(2)
# 返回浏览器上个页面
web.back()
time.sleep(2)

# 前进浏览器下个页面
web.forward()
time.sleep(3)
# 获取百度首页输入框
search_input = web.find_element_by_id("kw")
# 往输入框添加内容
search_input.send_keys("美女")
time.sleep(1)
# 获取搜索按钮并点击进行搜索
search = web.find_element_by_css_selector(".s_btn")
search.click()

time.sleep(5)
# 关闭浏览器
web.quit()

Iframe和动作链处理

什么是Iframe?

Iframe是用于前端页面之间相互嵌套的一种方法,格式如下:

<div id="iframewrapper">
  <iframe frameborder="0" id="iframeResult" style="height: 302.6px;">
    <html>
      <
head>
      </
head>
      <
body>
      </
body>
    </
html>   </iframe> </div>

在Selenium中处理"Iframe"中的标签,步骤如下:

切换作用域:处理"Iframe"中的标签,必须先将作用域切换到“Iframe”:

from selenium import webdriver
from selenium.webdriver import ActionChains
from lxml import etree
import time
# 实例化web驱动 绑定对应的驱动程序
web = webdriver.Chrome(executable_path="./chromedriver")
# 发起请求
web.get("http://125.35.6.84:81/xk")
# 切换到Iframe作用域
web.switch_to.frame("iframe标签的id")

动作链处理

1、导入ActionChains模块,实例化action对象

2、创建一个动作 绑定作用的标签

3、调用方法执行动作的操作行为

4、释放动作

from selenium import webdriver
from selenium.webdriver import ActionChains
from lxml import etree
import time
# 实例化web驱动 绑定对应的驱动程序
web = webdriver.Chrome(executable_path="./chromedriver")
# 发起请求
web.get("http://125.35.6.84:81/xk")
# 切换到Iframe作用域
web.switch_to.frame("iframe标签的id")
# 实例化动作连对象
action = ActionChains(web)
# 使用动作
action.click_and_hold("需要处理的Iframe中的标签")
# 将标签进行移动 xoffset:水平方向距离  yoffset:垂直方向距离  perform:表示立即执行该动作的操作
action.move_by_offset(xoffset="",yoffset=).perform()
# 释放action
action.release()

qq空间登录实例

from selenium import webdriver
import time

# 实例化浏览器对象 传入对应驱动
web = webdriver.Chrome(executable_path="./chromedriver")

# 发起请求
web.get("https://qzone.qq.com/")

# 切换到Iframe作用域
web.switch_to.frame("login_frame")

time.sleep(2)
# 选择用户名密码登录
username_login = web.find_element_by_id("switcher_plogin")
username_login.click()

time.sleep(2)
# 获取用户名、密码输入框 并传入内容
username_tag = web.find_element_by_id("u")
password_tag = web.find_element_by_id("p")
username_tag.send_keys("122342423")
time.sleep(1)
password_tag.send_keys("122342423")
time.sleep(2)

# 获取登录按钮 点击登录
login_btn = web.find_element_by_id("login_button")
login_btn.click()

time.sleep(2)

# 关闭浏览器
web.quit()

无头浏览器和 规避Selenium检测

无头浏览器

对于爬虫程序来说,我们不希望见到执行程序之后弹出一个浏览器页面,只需让它默默执行爬取操作。

那如何不让其显示界面呢?

1、导入模块:

# 实现无可视化界面(无头浏览器)
from selenium.webdriver.chrome.options import Options

2、配置参数:

# 实例化Options对象
option = Options()
# 添加参数
option.add_argument("--headless")
option.add_argument("--disable-gpu")

3、将option传入浏览器对象中

# 实例化浏览器对象 传入对应驱动
web = webdriver.Chrome(executable_path="./chromedriver", chrome_options=option,)

规避Selenium检测

随着使用Selenium的热度节节攀升,许多门户网站 为了不让我们随意爬取页面动态数据,都对网站做了Selenium检测机制,也就是反爬机制

正所谓上有政策,下有对策,反检测策略也就应运而生了:

# 规避Selenium检测
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_experimental_option("excludeSwitches", ["enable-automation"])
# 实例化浏览器对象 传入对应驱动
web = webdriver.Chrome(executable_path="./chromedriver", chrome_options=chrome_option, options=option)

 

以上是关于Selenium模块的主要内容,如果未能解决你的问题,请参考以下文章

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

爬虫selenium模块

Selenium JavascriptExecutor 详解

Selenium JavascriptExecutor 详解

如何有条件地将 C 代码片段编译到我的 Perl 模块?

有没有办法关闭代码片段中的命名建议?