07-selenium、PhantomJS(无头浏览器)
selenium(自动化测试工具可用于在爬虫中解决js动态加载问题)
简介(本质就是模仿浏览器工作)
Selenium 是什么?一句话,自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。换句话说叫 Selenium 支持这些浏览器驱动。话说回来,PhantomJS(无头浏览器)不也是一个浏览器吗,那么 Selenium 支持不?答案是肯定的,这样二者便可以实现无缝对接了。
然后又有什么好消息呢?Selenium支持多种语言开发,比如 Java,C,Ruby等等,有 Python 吗?那是必须的!
安装一下 Python 的 Selenium 库,再安装好 PhantomJS,不就可以实现 Python+Selenium+PhantomJS 的无缝对接了嘛!PhantomJS 用来渲染解析JS,Selenium 用来驱动以及与 Python 的对接,Python 进行后期的处理,完美的三剑客!
有人问,为什么不直接用浏览器而用一个没界面的 PhantomJS(无头浏览器) 呢?答案是:效率高!而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器。
前面爬取站长素材的时候图片是必须有浏览器视窗才加载。用selenium可以解决这种视窗加载问题。
环境安装
1、下载安装selenium
pip3 install selenium
2、下载浏览器对应版本的驱动(这里最好用谷歌浏览器方便强大)
http://chromedriver.storage.googleapis.com/index.html
selenium演示:
from selenium import webdriver
import time
#指定浏览器,参数是浏览器驱动的路径,前面加上r防止转义
driver = webdriver.Chrome(r"./chromedriver.exe")#打开浏览器
#用get打开页面
driver.get("https://www.baidu.com")
# 下面是演示一下其他操作
# #查找页面的“设置”选项,并点击
# driver.find_elements_by_link_text('设置')[0].click()
# time.sleep(1)
# #打开搜索设置选项
# driver.find_elements_by_link_text('搜索设置')[0].click()
# time.sleep(1)
# # 选中每页显示50条 下拉不能先点击 直接先选中找到子元素点击
# m = driver.find_element_by_id("nr")
# time.sleep(2)
# m.find_element_by_xpath('//*[@id="nr"]/option[3]').click()
# time.sleep(0.7)
# #类名可能多个 会返回列表 因此取第一个 id,xpath都是唯一的
# driver.find_elements_by_class_name("prefpanelgo")[0].click()
# time.sleep(1)
# #处理弹出的警告页面 确认accept() 取消dismiss()
# driver.switch_to_alert().accept()
#找到搜索框 输入关键字(.send_keys)
driver.find_element_by_id('kw').send_keys("校花")
time.sleep(0.5)
#找到搜索按钮 提交
driver.find_element_by_id("su").click()
time.sleep(2)
#找到图片搜索栏链接 看图片
driver.find_elements_by_link_text("图片")[0].click()
time.sleep(3)
#退出浏览器 关闭浏览器
driver.quit()
selenium爬取雪球 投资的网站首页(涉及到js动态加载)
from selenium import webdriver
from lxml import etree
import time driver = webdriver.Chrome("./chromedriver.exe")
#让浏览器指定url发起请求 经测试它有动态加载数据
driver.get("https://xueqiu.com/")
time.sleep(3)
#获取浏览器打开的当前页面的源码数据*******
page_text = driver.page_source
#用etree解析数据
tree = etree.HTML(page_text)
text = tree.xpath('//*[@id="app"]/div[3]/div[1]/div[2]/div[2]/div[1]/div[3]/p/text()')[0]
print(text)
time.sleep(2)
driver.quit()
###打印结果:
"""好买商学院专注出品原创内容,内容包括金融理财知识,基金基础知识,股票,债券,大家想了解更多,
就点击头像关注好买商学院吧,更多精彩内容等你来看喔! 股市简介: 周五(9.27),
今日早盘两市微幅高开后分化,沪指横盘震荡,深成指、创业板指双双走高涨超1%。截止收盘,沪指涨0.11%,报收293..."""
selenium相关行为动作的制定:
from selenium import webdriver
import time driver = webdriver.Chrome("./chromedriver.exe")
#打开淘宝网站
driver.get("https://www.taobao.com")
time.sleep(2)
#定位到想要找的节点输入框
input_text = driver.find_element_by_id("q")
#输入你想输入的关键字send_keys()
input_text.send_keys("华为")
time.sleep(3)
#类选择器 找到节点按钮
btn = driver.find_element_by_css_selector(".btn-search")
#点击按钮发送
btn.click()
time.sleep(2)
#执行js程序(js注入)
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(2)
driver.quit()
运行有点久,时间可以自行调节。
动作链:
from selenium import webdriver
import time
#导入动作链模块
from selenium.webdriver import ActionChains driver = webdriver.Chrome("./chromedriver.exe")
#这个菜鸟教程里面有iframe标签以内的html标签
driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
#如果定位节点在标签iframe内,那么则必须使用switch_to进行iframe的切换
driver.switch_to.frame("iframeResult")
#开始定位节点(选中节点)
sm_div = driver.find_element_by_id("draggable")
#实例化一个动作链对象(将浏览器对象作为参数传入)
action = ActionChains(driver)
#点击并且长按(节点对象)
action.click_and_hold(sm_div)
#开始模拟人拖动
for i in range(5):
#让sm+div移动
action.move_by_offset(17,0).perform()#一定要加perform(立即执行动作链)不然不会移动 容易忘记他*****************
time.sleep(0.6)
time.sleep(3)
#退出浏览器
driver.quit()
无头浏览器(PhantomJS停止更新了,因此用谷歌的无头浏览器):
from selenium import webdriver
from lxml import etree
import time #无头浏览器设置(*********增加爬取效率)
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
#无头浏览器需要传入参数在实例化的浏览器对象中*****
driver = webdriver.Chrome(executable_path="./chromedriver.exe",options=chrome_options)
#让浏览器指定url发起请求 经测试它有动态加载数据
driver.get("https://xueqiu.com/")
time.sleep(3)
#获取浏览器打开的当前页面的源码数据*******
page_text = driver.page_source
#用etree解析数据
tree = etree.HTML(page_text)
text = tree.xpath('//*[@id="app"]/div[3]/div[1]/div[2]/div[2]/div[1]/div[3]/p/text()')[0]
print(text)
time.sleep(2)
driver.quit()
规避被监测(用于反反爬措施):
from selenium import webdriver
from lxml import etree
import time
#*****************规避被监测***********************
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation']) #无头浏览器设置(*********增加爬取效率)
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
#无头浏览器需要传入参数在实例化的浏览器对象中
driver = webdriver.Chrome(executable_path="./chromedriver.exe",options=option,chrome_options=chrome_options)
#让浏览器指定url发起请求 经测试它有动态加载数据
driver.get("https://xueqiu.com/")
time.sleep(3)
#获取浏览器打开的当前页面的源码数据*******
page_text = driver.page_source
#用etree解析数据
tree = etree.HTML(page_text)
text = tree.xpath('//*[@id="app"]/div[3]/div[1]/div[2]/div[2]/div[1]/div[3]/p/text()')[0]
print(text)
time.sleep(2)
driver.quit()
模拟qq空间登录:
from selenium import webdriver
from lxml import etree
import time driver = webdriver.Chrome(executable_path='./chromedriver.exe')
driver.get('https://qzone.qq.com/')
# 在web 应用中经常会遇到frame 嵌套页面的应用,使用WebDriver
# 每次只能在一个页面上识别元素,对于frame 嵌套内的页面上的元素,
# 直接定位是定位是定位不到的。这个时候就需要通过switch_to.frame()方法将当前定位的主体切换了frame 里。
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
time.sleep(3)
#如果有别人的qq号 先清除
driver.find_element_by_id('u').clear()
# 这里填写你的QQ号
driver.find_element_by_id('u').send_keys('')
time.sleep(3)
#如果有别人的密码
driver.find_element_by_id('p').clear()
time.sleep(4)
driver.find_element_by_id('p').send_keys('xxxxxxxxx') # 这里填写你的QQ密码
time.sleep(3)
driver.find_element_by_id('login_button').click()
time.sleep(5)
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(2)
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(2)
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(2)
# page_text = driver.page_source
#
# tree = etree.HTML(page_text)
# # 执行解析操作
# li_list = tree.xpath('//ul[@id="feed_friend_list"]/li')
# for li in li_list:
# text_list = li.xpath('.//div[@class="f-info"]//text()|.//div[@class="f-info qz_info_cut"]//text()')
# text = ''.join(text_list)
# print(text + '\n\n\n') driver.close()
执行JavaScript
对于某些操作,Selenium API并没有提供。比如,下拉进度条,它可以直接模拟运行JavaScript,此时使用execute_script()
方法即可实现,代码如下:
from selenium import webdriver
#js操作
driver = webdriver.Chrome("./chromedrive.exe")
driver.get('https://www.jd.com/')
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
driver.execute_script('alert("123")')
获取页面源码数据
driver.page_source
模拟浏览器前进后退
import time
from selenium import webdriver
driver = webdriver.Chrome("./chromedriver.exe")
driver.get('https://www.baidu.com')
driver.get('https://www.jd.com')
driver.get('http://www.qq.com/')
driver.back()
time.sleep(5)
driver.forward()
driver.close()
Cookie处理
使用Selenium,还可以方便地对Cookies进行操作,例如获取、添加、删除Cookies等。示例如下:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())#获取
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'})#添加
print(browser.get_cookies())
browser.delete_all_cookies()#删除Cookies
print(browser.get_cookies())
总结:selenium就是模拟浏览器对数据进行操作。步骤总结:第一步导入from selenium import webdriver 第二步实例化浏览器对象driver = webdriver.Chrome(execute_path="驱动器路径",options=(反被监测),chrome_options=(无头浏览器))相关代码上面有 第三步检查相关节点是不是在iframe里面 是就切换frame(switch_to.frame(“id”)) 第四步找到目标节点进行相关操作 第五步获取页面源码(driver.page_source)最后根据个人需要进行解析。
07-selenium、PhantomJS(无头浏览器)的更多相关文章
- 基于Python, Selenium, Phantomjs无头浏览器访问页面
引言: 在自动化测试以及爬虫领域,无头浏览器的应用场景非常广泛,本文将梳理其中的若干概念和思路,并基于代码示例其中的若干使用技巧. 1. 无头浏览器 通常大家在在打开网页的工具就是浏览器,通过界面上输 ...
- 爬虫之图片懒加载技术、selenium工具与PhantomJS无头浏览器
图片懒加载技术 selenium爬虫简单使用 2.1 selenium简介 2.2 selenium安装 2.3 selenium简单使用 2.3.1 selenium使用案例 2.3.2 selen ...
- selenium+谷歌无头浏览器爬取网易新闻国内板块
网页分析 首先来看下要爬取的网站的页面 查看网页源代码:你会发现它是由js动态加载显示的 所以采用selenium+谷歌无头浏览器来爬取它 1 加载网站,并拖动到底,发现其还有个加载更多 2 模拟点击 ...
- Selenium 启动无头浏览器,只有chrome 和 firefox的,没有IE
使用无头浏览器,可以避免掉不确定的弹出框对脚本稳定性的影响,还能在脚本执行过程中省略掉了css 加载的时间. 以下是Selenium 启动无头浏览器的方法,只有chrome 和 firefox的. p ...
- 爬虫之selenium模块;无头浏览器的使用
一,案例 爬取站长素材中的图片:http://sc.chinaz.com/tupian/gudianmeinvtupian.html import requests from lxml import ...
- 爬虫如何使用phantomjs无头浏览器解决网页源代码经过渲染的问题(以scrapy框架为例)
一.浏览器的构成 许多开发商提供了商用的浏览器来解释和显示Web文档,而所有这些浏览器几乎都使用相同的体系架构.每一种浏览器(browser)通常由三部分构成:一个控制程序,客户协议和一些解释程序.控 ...
- selenium.Phantomjs设置浏览器请求头
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCap ...
- 无头浏览器phantomJS
selenium: 有头浏览器的代表(selenium+python也可实现静默运行 引入python的一个包,包叫:虚拟屏幕pyvirtualdisplay) PhantomJS : 无头浏览器的代 ...
- 爬虫:Selenium + PhantomJS
更:Selenium特征过多(language/UserAgent/navigator/en-US/plugins),以Selenium打开的浏览器处于自测模式,很容易被检测出来,解决方法可选: 用m ...
- 使用selenium+phantomJS实现网页爬取
有些网站反爬虫技术设计的非常好,很难采用WebClient等技术进行网页信息爬取,这时可以考虑采用selenium+phantomJS模拟浏览器(其实是真实的浏览器)的方式进行信息爬取.之前一直使用的 ...
随机推荐
- SpringAOP(注解方式实现面向切面编程)之常用Before、After、Around
一.首先在Springmvc.xml文件中引入如下内容(本示例是在ssm框架基础上实现的) 1.引入命名空间 xmlns:aop="http://www.springframework.or ...
- Codeforces 547C/548E - Mike and Foam 题解
目录 Codeforces 547C/548E - Mike and Foam 题解 前置芝士 - 容斥原理 题意 想法(口胡) 做法 程序 感谢 Codeforces 547C/548E - Mik ...
- python-参数化-(2)(数据库判断是否存在并返回满足条件的数据)
1.根据python-参数化-(1),生成的数据号码 在数据库查询后判断是否存在若不存在返回手机号码,若存在返回该手机号码对应数据的信息,未封装成类或函数上代码 import pymysqlconn= ...
- 剑指Offer-40.数组中只出现一次的数字(C++/Java)
题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 分析: 我们知道,两个相同的数字异或的结果等于0,所以利用这个性质将数组中所有的数字异或,求得的结 ...
- idea中导入别人的vue项目并运行
1. 下载node.js 在搭建vue的开发环境之前,先下载node.js,下载地址:https://nodejs.org/en/ https://blog.csdn.net/antma/articl ...
- error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in
问题: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_ ...
- nlohmann 最优秀的C++序列化工具库 详细入门教程
本文首发于个人博客https://kezunlin.me/post/f3c3eb8/,欢迎阅读最新内容! tutorial to use nlohmann json for serializing d ...
- 三行Jquery代码实现简单的选项卡
今晚,我们来用实现一个简单的选项卡切换代码,主要代码只有两行. 效果: 思路:通过切换JQuery控制div的显隐和样式的改变 其中那个一个div显示,其余全隐藏 实现: <!DOCTYPE h ...
- 第一篇随笔:用VB.NET搞点简单事情(1)
网络上能搜索到的爬虫文章大多是用python做的,也有少部分是C#做的(小声:所以用VB.NET也可以做爬虫.本文写的是第一步:获取网页) 使用代码前先imports以下内容 Imports Syst ...
- 清新三角格子风工作报告季度总结年终汇报通用PPT模板
选好合适的PPT模板,确定好主题,一个漂亮的PPT首先要简洁,其次文字不要太多,能用图片或视频讲解的最好用图片或视频.做好ppt后,对于讲解演示,也要提前做好练习准备. 模版来源:http://ppt ...