侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   196

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

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

代码如下

import time# 导入自动化测试模块from selenium import webdriverfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesfrom selenium.webdriver.common.action_chains import ActionChainsimport reimport jsond = DesiredCapabilities.CHROMEd['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").textprint(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:  continuebrowser.close()

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

 

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

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

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

{"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-proxypip install selenium

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

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

?"""step 1 导入依赖库"""from os import pathfrom browsermobproxy import Serverfrom selenium import webdriverimport 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:      passif __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中url参数编码与解码的实例详解
    下一条:
    详解Python是如何实现issubclass的
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客