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+django实现文件下载
Jan 17 Python
python输入错误密码用户锁定实现方法
Nov 27 Python
python编程实现随机生成多个椭圆实例代码
Jan 03 Python
python实现百万答题自动百度搜索答案
Jan 16 Python
如何优雅地处理Django中的favicon.ico图标详解
Jul 05 Python
Pycharm 实现下一个文件引用另外一个文件的方法
Jan 17 Python
python安装pil库方法及代码
Jun 25 Python
Python字符串的修改方法实例
Dec 19 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 Python
python语音识别指南终极版(有这一篇足矣)
Sep 09 Python
基于python制作简易版学生信息管理系统
Apr 20 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
第一节--面向对象编程
2006/11/16 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
使用PHP编写的SVN类
2013/07/18 PHP
生成随机字符串和验证码的类的PHP实例
2013/12/24 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
解析arp病毒背后利用的Javascript技术附解密方法
2007/08/06 Javascript
jQuery ui 1.7更新小结
2009/08/15 Javascript
Js event事件在IE、FF兼容性问题
2011/01/01 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
Javascript中call和apply函数的比较和使用实例
2015/02/03 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
基于JavaScript实现点击页面任何位置返回
2016/08/31 Javascript
详解AngularJS中ng-src指令的使用
2016/09/07 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
angular-tree-component的使用详解
2018/07/30 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
使用Python读取安卓手机的屏幕分辨率方法
2018/03/31 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
python中验证码连通域分割的方法详解
2018/06/04 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
如何使用python传入不确定个数参数
2020/02/18 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
详解pandas映射与数据转换
2021/01/22 Python
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
趣味运动会策划方案
2014/06/02 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
交通违章检讨书
2014/09/21 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
出生公证书
2015/01/23 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书