当前位置: 首页 > news >正文

selenium测试工具用来模拟用户浏览器的操作

执行JS的类库:execjs,PyV8,selenium,node

pip list

pip install selenium

pip install xlrd

pip install xlwt

pip install PyExecJS

pip install xlutils

selenium测试工具可以用来模拟用户浏览器的操作,其支持的浏览器有:PhantomJS,Firefox,Chrome等等,开发者可以根据当前的系统形式选择不同的模拟浏览器
每种模拟浏览器都需要对应的浏览器驱动(一个以.exe为后缀的可执行文件),使用谷歌浏览器Chrome,对应的浏览器驱动可以通过下面的网址下载。要完整地安装Python-Selenium库,让Chrome浏览器实现自动化,需要完成下面4步:Chromedriver安装、Selenium库安装、测试、关闭Chrome浏览器自动更新。

ChromeDriver - WebDriver for Chrome - Downloads

如果您使用的是Chrome 115或更新版本,请参阅Chrome测试可用性仪表板。此页面为特定的ChromeDriver版本下载提供了方便的JSON端点。

# -*- coding: utf-8 -*-
"""
Created on Wed Jun 17 09:35:18 2020@author: Administrator
"""
import re
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from xlrd import open_workbookimport csv
import codecsimport xlwt
import execjs
from xlrd import open_workbook
from xlutils.copy import copy
import requests
import timeimport six
import packaging
import packaging.version
import packaging.specifiers
import packaging.requirements#  将数据写入新文件
def data_write(file_path, title, url,rownum):print(rownum)r_xls = open_workbook(file_path) # 读取excel文件row = r_xls.sheets()[0].nrows # 获取已有的行数excel = copy(r_xls) # 将xlrd的对象转化为xlwt的对象table = excel.get_sheet(0) # 获取要操作的sheet#对excel表追加一行内容table.write(row, 0, title) #括号内分别为行数、列数、内容table.write(row, 1, url)excel.save(file_path) # 保存并覆盖文件rownum+=1if __name__ == '__main__': i = int(input("视频起始页:"))try:#正常的操作for index in range(1, 1000):url = 'https://video.e-works.net.cn/Video/VideoDetail.aspx?'url = url + "vid="+format(i)# 将路径实例化为一个Service对象chrome_driver_path = 'C:\\Users\\admin\\Desktop\\chromedriver.exe'# 传入webdriver驱动的新方法 Service()函数;以前的报警告,即将弃用chrome_driver_path_obj = Service(chrome_driver_path)browser = webdriver.Chrome(service=chrome_driver_path_obj)#browser = webdriver.Chrome(executable_path='chromedriver.exe')# 实例化一个启动参数对象chrome_options = Options()# 设置浏览器窗口大小#chrome_options.add_argument('--window-size=1366,768')#无界面运行chrome_options.add_argument('--headless')prefs = {'profile.default_content_setting_values' : {'images' : 2,#禁用图片加载'notifications' : 2, #禁用浏览器弹窗}}#chrome_options.add_experimental_option('prefs',prefs) # avoid detection riskschrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])# 启动浏览器browser = webdriver.Chrome(options=chrome_options)browser.get(url)#print(browser.page_source)#执行js得到整个HTMLhtml_content = browser.execute_script("return document.documentElement.outerHTML")title=[]videoUrl=[]# 正则表达式匹配标题pat = r'<title>(.*?)</title>'#返回的是一个列表提 [0]取出来title = re.findall(pat,html_content)# 无id,无name,先定位iframe元素iframe = browser.find_elements_by_tag_name("iframe")if(iframe):print("iframe")#print(browser.find_elements_by_tag_name("iframe")[0].get_attribute("src"))videoUrl=browser.find_elements_by_tag_name("iframe")[0].get_attribute("src")#print("".join(videoUrl))else:reg = '<video.*?src="(.*?)"></video>'#返回的是一个列表提 [0]取出来videoUrl = re.findall(reg,html_content,re.S)#把爬取的内容保存到文件中if (len(title))and(len(videoUrl)):# 存在值即为真#print(title)#打印视频链接#print(videoUrl)data_write('data.xls',title[0],videoUrl,index)print(format(i))i+=1else:# 页面为空print(format(index)+" is none!")i+=1#video_links=videoUrl[0]#download_video_series(video_links)browser.quit()except Exception as e:# 发生异常,执行这块代码 访问异常的错误编号和详细信息print(e.args)print("异常抛出!")else:#如果没有异常执行这块代码print("执行完毕!")

相关文章:

  • MySQL常见面试题总结
  • Node.js基础---Express中间件
  • 利用 lxml 库的XPath()方法在网页中快速查找元素
  • kvm虚拟机修改网络模式
  • MySQL进阶之(三)InnoDB数据存储结构之数据页结构
  • SpringBoot源码解读与原理分析(三十八)SpringBoot整合WebFlux(一)WebFlux的自动装配
  • 利用FFMPEG 将RTSP流的音频G711 转码为AAC 并 推流到RTMP
  • Git源码管理
  • docker 基础(二)
  • 民爆5G智能制造工厂数字孪生可视化平台,推进民爆工业数字化转型
  • unity初学问题:如何修改图片的坐标
  • 大数据毕业设计之前端04:管理系统为什么要自己实现图标组件
  • 抽象类与抽象方法
  • 【STM32】江科大STM32学习笔记汇总(50)
  • 19.2 基于SpringBoot电商项目:一刷(❤❤❤❤)
  • 自己简单写的 事件订阅机制
  • 【刷算法】从上往下打印二叉树
  • Brief introduction of how to 'Call, Apply and Bind'
  • js递归,无限分级树形折叠菜单
  • Lsb图片隐写
  • mysql 5.6 原生Online DDL解析
  • Node项目之评分系统(二)- 数据库设计
  • Redash本地开发环境搭建
  • V4L2视频输入框架概述
  • windows下如何用phpstorm同步测试服务器
  • 包装类对象
  • 多线程事务回滚
  • 后端_MYSQL
  • 普通函数和构造函数的区别
  • 使用Gradle第一次构建Java程序
  • k8s使用glusterfs实现动态持久化存储
  • Mac 上flink的安装与启动
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 带你开发类似Pokemon Go的AR游戏
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (42)STM32——LCD显示屏实验笔记
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (三)mysql_MYSQL(三)
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)visual stdio 书签功能介绍
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET CLR Hosting 简介
  • .NET Core 项目指定SDK版本
  • .net 使用ajax控件后如何调用前端脚本
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .netcore如何运行环境安装到Linux服务器
  • .NET中的Exception处理(C#)
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...