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网络编程学习笔记(六):Web客户端访问
Jun 09 Python
python爬虫入门教程--正则表达式完全指南(五)
May 25 Python
django从请求到响应的过程深入讲解
Aug 01 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
Python3 安装PyQt5及exe打包图文教程
Jan 08 Python
python Tkinter版学生管理系统
Feb 20 Python
在VS2017中用C#调用python脚本的实现
Jul 31 Python
python基于K-means聚类算法的图像分割
Oct 30 Python
Python无头爬虫下载文件的实现
Apr 02 Python
更新升级python和pip版本后不生效的问题解决
Apr 17 Python
python实现俄罗斯方块小游戏
Apr 24 Python
Flask中sqlalchemy模块的实例用法
Aug 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
服务器web工具 php环境下
2010/12/29 PHP
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
javascript学习网址备忘
2007/05/29 Javascript
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
jQuery操作checkbox选择(list/table)
2013/04/07 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
javascript实现循环广告条效果
2017/12/12 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
2017/08/31 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
python一些性能分析的技巧
2020/08/30 Python
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
英国大码女性时装零售商:Evans
2018/08/29 全球购物
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
商务经理岗位职责
2014/08/03 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
限期整改通知书
2015/04/22 职场文书