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数据结构之Array用法实例
Oct 09 Python
Python 的内置字符串方法小结
Mar 15 Python
python搭建虚拟环境的步骤详解
Sep 27 Python
利用django如何解析用户上传的excel文件
Jul 24 Python
python SMTP实现发送带附件电子邮件
May 22 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
python合并已经存在的sheet数据到新sheet的方法
Dec 11 Python
python交易记录整合交易类详解
Jul 03 Python
django如何自己创建一个中间件
Jul 24 Python
Python实现把多维数组展开成DataFrame
Nov 30 Python
使用Tensorflow将自己的数据分割成batch训练实例
Jan 20 Python
python 如何用terminal输入参数
May 25 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中用正则表达式清除字符串的空白
2011/01/17 PHP
解析PHP无限级分类方法及代码
2013/06/21 PHP
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
PHP实现验证码校验功能
2017/11/16 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
vue改变循环遍历后的数据实例
2019/11/07 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[46:40]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
儿童编程python入门
2018/05/08 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
杭州SQL浙江浙大网新恩普软件有限公司
2013/07/27 面试题
几个Shell Script面试题
2012/08/31 面试题
计算机网络专业推荐信
2013/11/24 职场文书
如何填写个人简历自我评价
2013/12/10 职场文书
公司营业员的自我评价
2014/03/04 职场文书
企业厂务公开实施方案
2014/03/26 职场文书
客户答谢会致辞
2015/01/20 职场文书
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis