参考微博:

什么是selenium

  一款基于浏览器自动化的模块

什么是浏览器自动化

  通过脚本程序或者python代码,这组程序或者代码表示一些行为动作,selenium可以让这些行为动作映射到浏览器中,根据设定好的行为动作完成自动化的操作

和爬虫的关联

  模拟登陆

  获取动态数据

#演示程序

from selenium import webdriver
from time import sleep # 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的
driver = webdriver.Chrome(r'./chromedriver.exe')
# 用get打开百度页面
driver.get("http://www.baidu.com")
# 查找页面的“设置”选项,并进行点击
driver.find_elements_by_link_text('设置')[0].click()
sleep(2)
# # 打开设置后找到“搜索设置”选项,设置为每页显示50条
driver.find_elements_by_link_text('搜索设置')[0].click()
sleep(2) # 选中每页显示50条
m = driver.find_element_by_id('nr')
sleep(2)
m.find_element_by_xpath('//*[@id="nr"]/option[3]').click()
m.find_element_by_xpath('.//option[3]').click()
sleep(2) # 点击保存设置
driver.find_elements_by_class_name("prefpanelgo")[0].click()
sleep(2) # 处理弹出的警告页面 确定accept() 和 取消dismiss()
driver.switch_to_alert().accept()
sleep(2)
# 找到百度的输入框,并输入 美女
driver.find_element_by_id('kw').send_keys('美女')
sleep(2)
# 点击搜索按钮
driver.find_element_by_id('su').click()
sleep(2)
# 在打开的页面中找到“Selenium - 开源中国社区”,并打开这个页面
driver.find_elements_by_link_text('美女_百度图片')[0].click()
sleep(3) # 关闭浏览器
driver.quit()

selenium如何获取动态加载数据

  环境的安装:pip install selenium

  基本使用流程

    1.from selenium import webdriver

    2.结合着某一款浏览器驱动程序实例化一个浏览器对象  bro=webdriver.Chrome(executable_path='./chromedriver.exe')

    3.下载浏览器驱动:http://chromedriver.storage.googleapis.com/index.html   将下载的驱动放在对应爬虫项目的文件夹里面

      3.1查看驱动和浏览器版本的映射系:http://blog.csdn.net/huilan_same/article/details/51896672

    4.通过get发起请求: bro.get(url='http://125.35.6.84:81/xk/')

    5.通过xpath或者bs4  获取当前页面的源码数据

page_text=bro.page_source

soup=BeautifulSoup(page_text,'lxml')

dl_list=soup.select('#gzlist > li > dl')

for dl in dl_list:
print(dl.string)

    编写自动化操作代码

#low版爬取药监局的数据
from bs4 import BeautifulSoup
#引入webdriver
from selenium import webdriver
#实例化浏览器对象,参数executable_path
bro=webdriver.Chrome(executable_path='./chromedriver.exe')
#发起一个请求
bro.get(url='http://125.35.6.84:81/xk/')
#获取当前浏览器页面的源码数据
page_text=bro.page_source soup=BeautifulSoup(page_text,'lxml') dl_list=soup.select('#gzlist > li > dl') for dl in dl_list:
print(dl.string)

selenium的详细用法

  1.实例化浏览器(参数为浏览器的驱动) bro = webdriver.Chrome(executable_path='./chromedriver.exe')

  2.通过get发起请求 bro.get('https://www.taobao.com/')

  3.通过find系列定位标签 search_input = bro.find_element_by_id('q')

    find_element_by_id

    find_element_by_xpath

  4.执行js代码execute_script,滚动刷新 bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')

  5.点击按钮事件 btn.click()

  6.退出浏览器 bro.quit()

from selenium import webdriver
from time import sleep
#实例化一个浏览器对象
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
bro.get('https://www.taobao.com/')
#在淘宝首页搜索框中录入一个商品名称
search_input = bro.find_element_by_id('q') #find系列的函数是用作于定位标签
#向定位到的标签中录入一个商品名称
search_input.send_keys('华为')
sleep(2) #如何执行js代码,滚动刷新
bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(2)
bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(2) btn = bro.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button')
btn.click()
sleep(2) bro.quit()

执行动作链 from selenium.webdriver import ActionChains

1.实例化一个动作连对象,且将浏览器对象作为参数传递到该对象的构造方法中 action = ActionChains(bro)

2.action.click_and_hold, action.click_and_hold(div_tag)

3.action.move_by_offset(x,y).perform() action.move_by_offset(17,0).perform()

4.action.release action.release()

from selenium import webdriver
from selenium.webdriver import ActionChains
from time import sleep
#实例化浏览器
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
#发起请求
bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') bro.switch_to.frame('iframeResult')#如果定位的标签存在于iframe标签之下,则必须执行该操作后,在进行标签定位
div_tag = bro.find_element_by_id('draggable') #如何使用动作连
#实例化一个动作连对象,且将浏览器对象作为参数传递到该对象的构造方法中
action = ActionChains(bro)
#
action.click_and_hold(div_tag) for i in range(5):
#偏移的大小
action.move_by_offset(17,0).perform()
sleep(0.5)
动作释放
action.release()
#退出浏览器
bro.quit()

模拟登陆qq空间

1.bro.switch_to.frame('iframe_id') bro.switch_to.frame('login_frame')

2.send_keys('input标签里面添加数据') bro.find_element_by_id('u').send_keys('用户名')

3.page_source  获取页面数据 page_text=bro.page_source

#模拟登陆qq空间
from selenium import webdriver
from lxml import etree
from time import sleep
#实例化浏览器
bro=webdriver.Chrome(executable_path='./chromedriver.exe')
#发起请求
bro.get('https://qzone.qq.com/')
#定位标签,并点击
bro.switch_to.frame('login_frame')
bro.find_element_by_id('switcher_plogin').click()
#定位标签,添加数据seed_keys
bro.find_element_by_id('u').send_keys('用户名')
bro.find_element_by_id('p').send_keys('密码')
bro.find_element_by_id('login_button').click() sleep(2)
#获取页面数据
page_text=bro.page_source
#使用etree获取数据
tree=etree.HTML(page_text)
data= tree.xpath('//*[@id="feed_478881649_311_0_1560636904_0_1"]/div[1]//text()') print(data)
sleep(3)
#退出浏览器
bro.quit()

selenium的识别与规避  

  识别:现在不少大网站有对selenium采取了监测机制,window.navigator.webdriver的值为 undefined。而使用selenium访问则该值为true

  规避:在启动Chromedrever之前,为Chrome开启实验性功能参数,完整代码如下

1.#Chrome开启实验性功能参数
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
2.#浏览器实例化后,需要添加参数options
bro=webdriver.Chrome(executable_path='./chromedriver.exe',options=option)

谷歌无头浏览器操作:代码如下

1.

from selenium.webdriver.chrome.options import Options
# 创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

2.

#添加参数chrome_options
bro=webdriver.Chrome(executable_path='./chromedriver.exe',chrome_options=chrome_options)

3.截屏操作: bro.save_screenshot('1.png')

#如何设置浏览器无可视化界面
from selenium.webdriver.chrome.options import Options
# 创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu') url = 'https://bj.meituan.com/' #添加参数chrome_options
bro=webdriver.Chrome(executable_path='./chromedriver.exe',chrome_options=chrome_options)

bro.get(url)
sleep(2)
bro.get(url)
sleep(2)
#截屏操作
bro.save_screenshot('1.png')
print(bro.page_source)

phantomJs:就是一款无可视化界面的浏览器,现在也无人维护,一般都使用谷歌无头浏览器

1.实例化phantomJs

from selenium import webdriver
# phantomjs路径
path = r'PhantomJS驱动路径'
browser = webdriver.PhantomJS(path)

2.其他操作和谷歌浏览器都一样

3.截屏操作 browser.save_screenshot(r'phantomjs\show.png')

from selenium import webdriver
import time # phantomjs路径
path = r'PhantomJS驱动路径'
browser = webdriver.PhantomJS(path) # 打开百度
url = 'http://www.baidu.com/'
browser.get(url) time.sleep(3) browser.save_screenshot(r'phantomjs\baidu.png') # 查找input输入框
my_input = browser.find_element_by_id('kw')
# 往框里面写文字
my_input.send_keys('美女')
time.sleep(3)
#截屏
browser.save_screenshot(r'phantomjs\meinv.png') # 查找搜索按钮
button = browser.find_elements_by_class_name('s_btn')[0]
button.click() time.sleep(3) browser.save_screenshot(r'phantomjs\show.png') time.sleep(3) browser.quit()

总结:

- selenium:基于浏览器自动化的模块.
-浏览器自动化操作:通过脚本程序或者python代码,这组程序或者代码表示一些行为动作,selenium可以让这些行为动作映射到浏览器中,根据设定好的行为动作完成自动化的操作.
- phantomJs:一款无头浏览器,由于现在已经停止维护,所以使用谷歌无头浏览器代替
- selenium和爬虫之间的关联:
- 便捷的获取动态加载的数据
- 实现模拟登录
- 缺点:
- 爬取数据的效率低
- 环境部署繁琐
- 部署selenium环境
      - pip install selenium
- 部署浏览器的环境
      - 下载安装对应的浏览器
- 编码流程:
- 导包
    -  from selenium import webdriver 

- 创建一个浏览器对象,且在创建的过程中需要使用浏览器的驱动程序
    -  bro=webdriver.Chrome(executable_path='./chromedriver.exe') 

- 使用get方法进行请求发送
    -  bro.get('https://qzone.qq.com/') 

- 指定其他的行为动作对应的代码

- 关闭浏览器
    -  bro.quit() 

- 行为动作:
- 标签定位:find系列的函数
    -  bro.switch_to.frame('iframeResult')#如果定位的标签存在于iframe标签之下,则必须执行该操作后,在进行标签定位 
- 节点交互:
- 点击:click()
- send_keys('xxx')
- 执行js:
- excute_script('jsCode')
- 动作链:
- 导包:from selemium.webdriver import ActionChians
- 创建一个动作链对象:action = ActionChians(bro)
- 调用动作链对象中封装的属性和方法:
- action.click_and_hold(ele)
- move_by_offset(x,y)
- perform():立即执行动作链
- release()
- page_source:返回当前浏览器显示页面的全部页面源码数据
- 无头的设置 phantomJs 谷歌无头浏览器

- selenium规避监测

- 截图:save_screenshot('./1.png')

selenium模块 phantomJs 谷歌无可视界面的更多相关文章

  1. 第三百三十七节,web爬虫讲解2—PhantomJS虚拟浏览器+selenium模块操作PhantomJS

    第三百三十七节,web爬虫讲解2—PhantomJS虚拟浏览器+selenium模块操作PhantomJS PhantomJS虚拟浏览器 phantomjs 是一个基于js的webkit内核无头浏览器 ...

  2. 十六 web爬虫讲解2—PhantomJS虚拟浏览器+selenium模块操作PhantomJS

    PhantomJS虚拟浏览器 phantomjs 是一个基于js的webkit内核无头浏览器 也就是没有显示界面的浏览器,利用这个软件,可以获取到网址js加载的任何信息,也就是可以获取浏览器异步加载的 ...

  3. 使用phantomjs进行无界面UI自动化测试

    PhantomJS(http://phantomjs.org/) 是一个基于WebKit的服务器端JavaScript API.它全面支持web而不需浏览器支持,其快速.原生支持各种Web标准:DOM ...

  4. XVFB实现selenium在linux上无界面运行安装篇

    selenium在linux上无界面运行,其实是非常简单的.具体的方法有使用HtmlUnitDriver或者PhantomJSDriver,有时间我会写写关于这两个东东的文章,其实基本和ChromeD ...

  5. Robot Framework使用Phantomjs进行无界面UI自动化测试

    Robot Framework 是一款关键字驱动的验收自动化测试框架,现在在国内使用的越来越广泛了.一种通用的Web UI自动化测试解决方案是Robot Framework+Selenium2Libr ...

  6. 【tips】自动化测试工具 - selenium和phantomJS

    ### 目录清单 selenium和phantomjs概述 selenium常用API 案例操作:模拟登陆csdn 1. selenium和phantomJS是什么东西 selenium是一套web网 ...

  7. 爬虫之 selenium模块

    selenium模块   阅读目录 一 介绍 二 安装 三 基本使用 四 选择器 五 等待元素被加载 六 元素交互操作 七 其他 八 项目练习 一 介绍 selenium最初是一个自动化测试工具,而爬 ...

  8. selenium模块基础用法详解

    目录 selenium模块 官方文档 介绍 安装 有界面浏览器 无界浏览器 selenium+谷歌浏览器headless模式 基本使用 选择器 基本用法 xpath 获取标签属性 等待元素被加载 隐式 ...

  9. 爬虫(五)—— selenium模块启动浏览器自动化测试

    目录 selenium模块 一.selenium介绍 二.环境搭建 三.使用selenium模块 1.使用chrome并设置为无GUI模式 2.使用chrome有GUI模式 3.查找元素 4.获取标签 ...

随机推荐

  1. Effective Java —— 避免创建不必要的对象

    本文参考 本篇文章参考自<Effective Java>第三版第六条"Avoid creating unnecessary objects" avoid creatin ...

  2. Kali Linux 下安装配置MongoDB数据库 ubuntu 下安装配置MongoDB源码安装数据库

    Kali Linux 下安装配置MongoDB数据库   1.下载mongodb.tgz 压缩包: 2.解压到:tar -zxvf mongodb.tgz /usr/local/mongodb 3.创 ...

  3. (stm32f103学习总结)—stm32外部中断

    一.外部中断介绍 1.1 EXTI简介 EXTI简介 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个用于产生事 件/中断请求的边沿检测器.EXTI的每根输入线都可单独进行配置,以 ...

  4. canvas菜鸟基于小程序实现图案在线定制功能

    前言 最近收到一个这样的需求,要求做一个基于 vue 和 element-ui 的通用后台框架页,具体要求如下: 要求通用性高,需要在后期四十多个子项目中使用,所以大部分地方都做成可配置的. 要求做成 ...

  5. Linux 0.11源码阅读笔记-总结

    总结 Linux 0.11主要包含文件管理和进程管理两个部分.进程管理包括内存管理.进程管理.进程间通信模块.文件管理包含磁盘文件系统,打开文件内存数据.磁盘文件系统包括空闲磁盘块管理,文件数据块的管 ...

  6. IO流入门

    @ 目录 总结内容 1. IO流是什么 2. 字符流和字节流 3. File常用API(前面类型为返回类型) 4. 编码转换 5. IO流实现流程 6. 输入输出流简单实现 7. 输入输出流简单实现 ...

  7. Spring4Shell的漏洞原理分析

    Spring框架最新的PoC 这两天出来的一个RCE漏洞,但是有以下的条件限制才行: 必须是jdk9及以上 必须是部署在tomcat的应用 是springmvc的或者webflux的应用 具体的可以查 ...

  8. Mysql_事务_存储过程_触发器

    一.什么是事务? 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言( ...

  9. Spring Boot配置druid监控页功能

    1.导入坐标 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...

  10. Java基础语法01——变量与运算符

    本文是对Java基础语法的第一部分的学习,包括注释:标识符的命名规则与规范:变量的数据类型分类以及转换:以及六种运算符(算术.赋值.比较.逻辑.三元和位运算符).