python selenium 查找隐藏元素 自动播放视频功能


Posted in Python onJuly 24, 2019

在使用python做爬虫的过程中,有些页面的的部分数据是通过js异步加载的,js调用接口的请求中有时还带有些加密的参数很难破解无法使用requests这样的包直接爬取数据,因此需要借助seleniu来完成js的自动加载。

通过selenium 模拟浏览器的真是操作来获取页面中的所有请求,并且可以查找到一下页面上一些隐藏的元素,这些元素在html源码中无法看到,并且和能通过xpath和正则来捕获,因此需要使用selenium来查找隐藏元素,例如视频网站的播放按钮

代码如下

import time
# 导入自动化测试模块
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.action_chains import ActionChains
import re
import json
d = DesiredCapabilities.CHROME
d['loggingPrefs'] = {'performance': 'ALL'}
# 设置谷歌浏览器参数,设置语言和浏览器版本(使用真实浏览器头信息代替字符浏览器头)
options = webdriver.ChromeOptions()
options.add_argument('lang=zh_CN.UTF-8')
options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Mobile Safari/537.36"')
# 建立一个浏览器对象,调用PhantoJS来生成一个对象
browser = webdriver.Chrome(executable_path='D:\Python36\chromedriver.exe', chrome_options=options, desired_capabilities=d)
video_url = 'https://v.youku.com/v_show/id_XNDIyMjU1NjgzMg==.html?spm=a2ha1.12675304.m_2556_c_8261.d_2&s=a4de6bdc5675415ea280&scm=20140719.manual.2556.show_a4de6bdc5675415ea280'
browser.get(video_url)
time.sleep(10)
menu = browser.find_element_by_css_selector(".ykplayer") # 查找页面隐藏元素
# menu = browser.find_element_by_css_selector("div.x-video-play-ico.i-pause > dt").text
print(menu)
print(type(menu))
menu = browser.find_element_by_css_selector(".ykplayer").text # 获得隐藏元素的内容
print(menu)
print(type(menu))
###################
#ActionChains(browser).click()
browser.find_element_by_css_selector('.ykplayer').click() # 查找到隐藏元素位置后执行点击鼠标左键操作
time.sleep(10)
lo = browser.get_log('performance') # 捕获浏览器network中的数据
browser.get_network_conditions()
datalist = []
for entry in lo:
 try:
  print(entry)
  datalist.append(entry)
 except Exception as e:
  continue
browser.close()

视频中被播放按钮是一个隐藏元素,用xpaht定位到指定的标签后也无法获取这个标签中的元素

python selenium 查找隐藏元素 自动播放视频功能 

通过 browser.find_element_by_css_selector(“.ykplayer”) 方法查找  .ykplayer 可以查找到,查找后输出的内容这个视频的标题,这样就实现了使用chromedriver 自动播放视频的功能

python selenium 查找隐藏元素 自动播放视频功能

这里虽然实现的视频自动播放,但是请求优酷视频的视频地址的接口调用的结果却依然没法通过 browser.get_log(‘performance')来获得,原因是有一部分数据没有全部加载,但接口实际已经取得了完整的数据。虽然可以通过 get_log中的结果获得请求的地址,但是这个请求的地址在此使用requests进行请求会提示无权访问,可以看到这个请求已经有请求体了,但是使用get_log却无法捕获。

python selenium 查找隐藏元素 自动播放视频功能

而且这个请求地址是一次性的,在次请求的结果是没权限

{"cost":0.003000000026077032,"data":{"error":{"note":"客户端无权播放,201","code":-6004}},"e":{"code":0,"provider":"hsfprovider","desc":""}}

要解决这个问题需要使用到browsermob-proxy

利用BrowserMob Proxy实现类似chrome的开发者工具中network的功能,

监控浏览器中该页面的request,获取对应的response,从而得到对应的json数据。

其大致原理是设置一个本地代理,并监控浏览器通过该代理的网络活动。

最后,我的解决方案是:python3 + selenium + chrome + browsermob-proxy

下载好BrowserMob Proxy和chromedriver,并记住对应的路径,稍后需要配置。

https://bmp.lightbody.net/

http://npm.taobao.org/mirrors/chromedriver/

另外,使用browsermob-proxy需要安装Java依赖环境,首次安装后可能需要重启。

python的环境可安装anaconda获得,然后是安装额外的python库

pip install browsermob-proxy
pip install selenium

软件环境配置完成后,可开始搭建抓取动态网页的框架,

下面是我做的一个简单框架(browsermonitor.py),其中未涉及数据的加工,可针对需要抓取的网页,直接继承后,根据需求加工数据:

?
"""step 1 导入依赖库"""
from os import path
from browsermobproxy import Server
from selenium import webdriver
import re
"""step 2 新建浏览器监控类"""
class Monitor(object):
  """
  step 3 配置chromedriver 和 browermobproxy 路径
  需要使用完整路径,否则browsermobproxy无法启动服务
  我是将这两个部分放到了和monitor.py同一目录
  同时设置chrome为屏蔽图片,若需要抓取图片可自行修改
  """
  PROXY_PATH = path.abspath("./browsermob-proxy/bin/browsermob-proxy.bat")
  CHROME_PATH = path.abspath("./chromedriver.exe")
  CHROME_OPTIONS = {"profile.managed_default_content_settings.images":2}
  def __init__(self):
    """
    类初始化函数暂不做操作
    """
    pass
  def initProxy(self):
    """
    step 4 初始化 browermobproxy
    设置需要屏蔽的网络连接,此处屏蔽了css,和图片(有时chrome的设置会失效),可加快网页加载速度
    新建proxy代理地址
    """
    self.server = Server(self.PROXY_PATH)
    self.server.start()    
    self.proxy = self.server.create_proxy()
    self.proxy.blacklist(["http://.*/.*.css.*","http://.*/.*.jpg.*","http://.*/.*.png.*","http://.*/.*.gif.*"],200)
  def initChrome(self):
    """
    step 5 初始化selenium, chrome设置
    将chrome的代理设置为browermobproxy新建的代理地址
    """      
    chromeSettings = webdriver.ChromeOptions()
    chromeSettings.add_argument('--proxy-server={host}:{port}'.format(host = "localhost", port = self.proxy.port))
    chromeSettings.add_experimental_option("prefs", self.CHROME_OPTIONS)
    self.driver = webdriver.Chrome(executable_path = self.CHROME_PATH, chrome_options = chromeSettings)
  def genNewRecord(self, name = "monitor", options={'captureContent':True}):
    """
    step 6 新建监控记录,设置内容监控为True
    """
    self.proxy.new_har(name,options = options)
  def getContentText(self, targetUrl):
    """
    step 7 简单的获取目标数据的函数
    其中 targetUrl 为浏览器获取对应数据调用的url,需要用正则表达式表示
    """
    if self.proxy.har['log']['entries']:
      for loop_record in self.proxy.har['log']['entries']:
        try:
          if re.fullmatch(targetUrl , loop_record["request"]['url']):
            return loop_record["response"]['content']["text"]
        except Exception as err:
          print(err)
          continue
    return None
  def Start(self):
    """step 8 配置monitor的启动顺序"""
    try:
      self.initProxy()
      self.initChrome()
    except Exception as err:
      print(err)
  def Quit(self):
    """
    step 9 配置monitor的退出顺序
    代理sever的退出可能失败,目前是手动关闭,若谁能提供解决方法,将不胜感激
    """
    self.driver.close()
    self.driver.quit()
    try:
      self.proxy.close()
      self.server.process.terminate()
      self.server.process.wait()
      self.server.process.kill()
    except OSError:
      pass
if __name__ == '__main__':
  monitor = Monitor()
  monitor.Start()
  monitor.genNewRecord()
  # 这使用优酷视频的地址
  url = 'https://v.youku.com/v_show/id_XNDIyMjU1NjgzMg==.html?spm=a2ha1.12675304.m_2556_c_8261.d_2&s=a4de6bdc5675415ea280&scm=20140719.manual.2556.show_a4de6bdc5675415ea280'  
  monitor.driver.get(url)
  targetUrl = "https://ups.youku.com/ups/get.json.*" # 这是获取视频播放地址的接口请求的前缀
  text = monitor.getContentText(targetUrl)
  monitor.Quit()

总结

以上所述是小编给大家介绍的python selenium 查找隐藏元素 自动播放视频功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python 获取本机ip地址的两个方法
Feb 25 Python
Python线程的两种编程方式
Apr 14 Python
python去除空格和换行符的实现方法(推荐)
Jan 04 Python
详谈python http长连接客户端
Jun 12 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
python之Character string(实例讲解)
Sep 25 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 Python
Python 为什么推荐蛇形命名法原因浅析
Jun 18 Python
python中复数的共轭复数知识点总结
Dec 06 Python
编写python程序的90条建议
Apr 14 Python
Python OpenCV超详细讲解基本功能
Apr 02 Python
简单了解Django应用app及分布式路由
Jul 24 #Python
django的ORM操作 删除和编辑实现详解
Jul 24 #Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 #Python
django一对多模型以及如何在前端实现详解
Jul 24 #Python
详解Python是如何实现issubclass的
Jul 24 #Python
Django中在xadmin中集成DjangoUeditor过程详解
Jul 24 #Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
Jul 24 #Python
You might like
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
使用NetBeans + Xdebug调试PHP程序的方法
2011/04/12 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
php使用google地图应用实例
2014/12/31 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
ThinkPHP中create()方法自动验证表单信息
2017/04/28 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
求解开jscript.encode代码的asp函数
2007/02/28 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
jquery+html5烂漫爱心表白动画代码分享
2015/08/24 Javascript
jquery选择器简述
2015/08/31 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
js实现右键自定义菜单
2016/12/03 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
ReactNative中使用Redux架构总结
2017/12/15 Javascript
JS定义函数的几种常用方法小结
2019/05/23 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
vue实现在线翻译功能
2019/09/27 Javascript
详解如何在Javascript和Sass之间共享变量
2019/11/13 Javascript
python3.6连接MySQL和表的创建与删除实例代码
2017/12/28 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
如何基于Python按行合并两个txt
2020/11/03 Python
房地产出纳岗位职责
2013/12/01 职场文书
建筑系毕业生自我鉴定
2014/01/24 职场文书
材料会计岗位职责
2014/03/06 职场文书
校园学雷锋活动月总结
2014/03/09 职场文书
2019最新激励员工口号大全!
2019/06/28 职场文书
python 实现的截屏工具
2021/05/08 Python
Python面向对象之内置函数相关知识总结
2021/06/24 Python