amei0 2020-06-09
便捷的获取页面中动态加载的数据
pip install selenium
根据浏览器版本下载web驱动:http://npm.taobao.org/mirrors/chromedriver (谷歌)
# 实例化web驱动 绑定对应的驱动程序 driverpath为本地驱动程序的路径 web = webdriver.Chrome(executable_path="driverpath") # 发起请求 web.get("url") # 获取页面数据 page_text = web.page_source # 关闭浏览器 web.quit()
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是用于前端页面之间相互嵌套的一种方法,格式如下:
<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()
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()
对于爬虫程序来说,我们不希望见到执行程序之后弹出一个浏览器页面,只需让它默默执行爬取操作。
那如何不让其显示界面呢?
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检测 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)
5.环境变量配置在linux系统下,需要将可执行文件配置到环境变量或将文件移动到属于环境变量的目录里面方法一:将文件移动到属于环境变量目录中sudo mv chromedriver /user/bin