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 JavascriptExecutor 详解