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(无头浏览器)的更多相关文章

  1. 基于Python, Selenium, Phantomjs无头浏览器访问页面

    引言: 在自动化测试以及爬虫领域,无头浏览器的应用场景非常广泛,本文将梳理其中的若干概念和思路,并基于代码示例其中的若干使用技巧. 1. 无头浏览器 通常大家在在打开网页的工具就是浏览器,通过界面上输 ...

  2. 爬虫之图片懒加载技术、selenium工具与PhantomJS无头浏览器

    图片懒加载技术 selenium爬虫简单使用 2.1 selenium简介 2.2 selenium安装 2.3 selenium简单使用 2.3.1 selenium使用案例 2.3.2 selen ...

  3. selenium+谷歌无头浏览器爬取网易新闻国内板块

    网页分析 首先来看下要爬取的网站的页面 查看网页源代码:你会发现它是由js动态加载显示的 所以采用selenium+谷歌无头浏览器来爬取它 1 加载网站,并拖动到底,发现其还有个加载更多 2 模拟点击 ...

  4. Selenium 启动无头浏览器,只有chrome 和 firefox的,没有IE

    使用无头浏览器,可以避免掉不确定的弹出框对脚本稳定性的影响,还能在脚本执行过程中省略掉了css 加载的时间. 以下是Selenium 启动无头浏览器的方法,只有chrome 和 firefox的. p ...

  5. 爬虫之selenium模块;无头浏览器的使用

    一,案例 爬取站长素材中的图片:http://sc.chinaz.com/tupian/gudianmeinvtupian.html import requests from lxml import ...

  6. 爬虫如何使用phantomjs无头浏览器解决网页源代码经过渲染的问题(以scrapy框架为例)

    一.浏览器的构成 许多开发商提供了商用的浏览器来解释和显示Web文档,而所有这些浏览器几乎都使用相同的体系架构.每一种浏览器(browser)通常由三部分构成:一个控制程序,客户协议和一些解释程序.控 ...

  7. selenium.Phantomjs设置浏览器请求头

    from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCap ...

  8. 无头浏览器phantomJS

    selenium: 有头浏览器的代表(selenium+python也可实现静默运行 引入python的一个包,包叫:虚拟屏幕pyvirtualdisplay) PhantomJS : 无头浏览器的代 ...

  9. 爬虫:Selenium + PhantomJS

    更:Selenium特征过多(language/UserAgent/navigator/en-US/plugins),以Selenium打开的浏览器处于自测模式,很容易被检测出来,解决方法可选: 用m ...

  10. 使用selenium+phantomJS实现网页爬取

    有些网站反爬虫技术设计的非常好,很难采用WebClient等技术进行网页信息爬取,这时可以考虑采用selenium+phantomJS模拟浏览器(其实是真实的浏览器)的方式进行信息爬取.之前一直使用的 ...

随机推荐

  1. spring boot 2.2.0开始freemarker模板默认扩展名改为ftlh了

    2.2.0这个版本刚发布的时候更新到了这个版本,然后使用freemarker 的webapp运行报错. 查了spring boot的changelog,搜freemarker查到了这条.ftlh,使f ...

  2. getOutputStream() has already been called for this response 从了解到解决

    一.背景说明        在tomcat的localhost.log日志中时长见到 getOutputStream() has already been called for this respon ...

  3. mySql中Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的问题

    报错信息 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'a.id' ...

  4. SpringBoot2.0 基础案例(15):配置MongoDB数据库,实现增删改查逻辑

    本文源码:GitHub·点这里 || GitEE·点这里 一.NoSQL简介 1.NoSQL 概念 NoSQL( Not Only SQL ),意即"不仅仅是SQL".对不同于传统 ...

  5. AQS(AbstractQueuedSynchronizer)解析

    AbstractQueuedSynchronizer是JUC包下的一个重要的类,JUC下的关于锁相关的类(如:ReentrantLock)等大部分是以此为基础实现的.那么我们就来分析一下AQS的原理. ...

  6. C/C++ 中的宏/Macro

    宏(Macro)本质上就是代码片段,通过别名来使用.在编译前的预处理中,宏会被替换为真实所指代的代码片段,即下图中 Preprocessor 处理的部分. C/C++ 代码编译过程 - 图片来自 nt ...

  7. [转]JS将图片转为base64编码

    本文转自:https://blog.csdn.net/DeMonliuhui/article/details/79731359 1.根据img标签获取base64编码/** * * @param im ...

  8. rdd里的foreach无法对外界产生影响

    rdd只能用Map返回结果.里面的操作对外界毫无影响 因为rdd是分区进行的,都是各个位置的操作,所以为保证数据没有问题,其中的数据对外界操作没有影响 想要有影响,就将rdd.collect()实例化 ...

  9. WPF-自定义控件引用外部样式+转换器

    引用单个外部样式 <UserControl.Resources> <ResourceDictionary Source="pack://application:,,,/XM ...

  10. C#&.Net干货分享-构建Aocr_ImageHelper读取图片文字做解析

    直接源码,就是这么干脆... namespace Frame.Image{    /// <summary>    ///     /// </summary>    publ ...