分享Selenium测试工具用来模拟用户浏览器的操作

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

pip list

c6a7a6b08a9f42f59435f2a41dfb9ab5.png

pip install selenium

2420b497f48b44d3b0af2310d399e805.png

pip install xlrd

3524f152d1a545ca8390a8541c409947.png

pip install xlwt

166d8ef184e4466ebf3635805f940570.png

pip install PyExecJS

388270bbce66455d8ec049205ad4e9f9.png

pip install xlutils

9d54006a2af8474cae64938faef17776.png

 

252d3a76866241c293e41ede8da8fb8b.png

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

ChromeDriver - WebDriver for Chrome - Downloads

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

624ad2710afc4e209917ff56e0ecd689.png

 

a42042c6bc6c4f599d475ef2397ad324.png

 

# -*- 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_workbook

import csv
import codecs

import xlwt
import execjs
from xlrd import open_workbook
from xlutils.copy import copy
import requests
import time

import 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+=1

if __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 risks
        chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])

        # 启动浏览器
        browser = webdriver.Chrome(options=chrome_options)
            
        browser.get(url)
        #print(browser.page_source)
        
        #执行js得到整个HTML
        html_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+=1
        else:
             # 页面为空
             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("执行完毕!")
    

d7f8d9f6caee44d7a0baaedb84b1b9bc.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/422162.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ssm172旅行社管理系统的设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一 、设计说明 1.1 研究…

【InternLM 笔记】使用InternStudio 体验书生·浦语2-chat-1.8b随记

书生浦语2-chat-1.8b 介绍 书生浦语-1.8B (InternLM2-1.8B) 是第二代浦语模型系列的18亿参数版本。为了方便用户使用和研究&#xff0c;书生浦语-1.8B (InternLM2-1.8B) 共有三个版本的开源模型&#xff0c;他们分别是&#xff1a; InternLM2-1.8B: 具有高质量和高适应灵活性…

CSP-201712-2-游戏

CSP-201712-2-游戏 解题思路 初始化变量&#xff1a;定义整数变量n和k&#xff0c;分别用来存储小朋友的总数和淘汰的特定数字。然后定义了num&#xff08;用来记录当前报的数&#xff09;和peopleIndex&#xff08;用来记录当前报数的小朋友的索引&#xff09;。 初始化小朋…

什么是VR虚拟社区|VR元宇宙平台|VR主题馆加盟

VR虚拟社区是指一种基于虚拟现实技术构建的在线社交平台或环境&#xff0c;用户可以在其中创建虚拟化的个人形象&#xff08;也称为avatars&#xff09;并与其他用户进行交流、互动和合作。在VR虚拟社区中&#xff0c;用户可以选择不同的虚拟场景和环境&#xff0c;如虚拟公园、…

autocrlf和safecrlf

git远程拉取及提交代码&#xff0c;windows和linux平台换行符转换问题&#xff0c;用以下两行命令进行配置&#xff1a; git config --global core.autocrlf false git config --global core.safecrlf true CRLF是windows平台下的换行符&#xff0c;LF是linux平台下的换行符。…

揭示 Wasserstein 生成对抗网络的潜力:生成建模的新范式

导 读 Wasserstein 生成对抗网络 (WGAN) 作为一项关键创新而出现&#xff0c;解决了经常困扰传统生成对抗网络 (GAN) 的稳定性和收敛性的基本挑战。 由 Arjovsky 等人于2017 年提出&#xff0c;WGAN 通过利用 Wasserstein 距离彻底改变了生成模型的训练&#xff0c;提供了一个…

如何在群晖Docker运行本地聊天机器人并结合内网穿透发布到公网访问

文章目录 1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛&#xff0c;包括聊天机…

Tokenize Anything via Prompting论文解读

文章目录 前言一、摘要二、引言三、模型结构图解读四、相关研究1、Vision Foundation Models2、Open-Vocabulary Segmentation3、Zero-shot Region Understanding 五、模型方法解读1、Promptable TokenizationPre-processingPromptable segmentationConcept predictionZero-sho…

STM32标准库开发—实时时钟(BKP+RTC)

BKP配置结构 注意事项 BKP基本操作 时钟初始化 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);PWR_BackupAccessCmd(ENABLE);//设置PWR_CR的DBP&#xff0c;使能对PWR以及BKP的访问读写寄存器操作 uint16_t ArrayW…

LeetCode--72

72. 编辑距离 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 "horse", word2 …

Mysql与StarRocks语法上的不同

&#x1f413; 序言 StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理&#xff0c;可以用StarRocks 来支持多种数据分析场景的极速分析。 &#x1f413; 语法…

STL容器之string类

文章目录 STL容器之string类1、 什么是STL2、STL的六大组件3、string类3.1、string类介绍3.2、string类的常用接口说明3.2.1、string类对象的常见构造3.2.2、string类对象的容量操作3.2.3、string类对象的访问及遍历操作3.2.4、 string类对象的修改操作3.2.5、 string类非成员函…

springBoot整合Redis(二、RedisTemplate操作Redis)

Spring-data-redis是spring大家族的一部分&#xff0c;提供了在srping应用中通过简单的配置访问redis服务&#xff0c;对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装&#xff0c;RedisTemplate提供了redis各种操作、异常处理及序列化&#xff0c;支持发布订阅&…

支持向量机算法(带你了解原理 实践)

引言 在机器学习和数据科学中&#xff0c;分类问题是一种常见的任务。支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种广泛使用的分类算法&#xff0c;因其出色的性能和高效的计算效率而受到广泛关注。本文将深入探讨支持向量机算法的原理、特点、应用&…

Unity(第二十一部)动画的基础了解(感觉不了解其实也行)

1、动画组件老的是Animations 动画视频Play Automatically 是否自动播放Animate Physics 驱动方式&#xff0c;勾选后是物理驱动Culling Type 剔除方式 默认总是动画化就会一直执行下去&#xff0c;第二个是基于渲染播放&#xff08;离开镜头后不执行&#xff09;&#xff0c; …

蓝桥杯倒计时 43天 - 前缀和,单调栈

最大数组和 算法思路&#xff1a;利用前缀和化简 for 循环将 n^2 简化成 nn&#xff0c;以空间换时间。枚举每个 m&#xff0c;m是删除最小两个数&#xff0c;那k-m就是删除最大数&#xff0c;m<k&#xff0c;求和最大的值。暴力就是枚举 m-O(n)&#xff0c;计算前 n-(k-m)的…

Revit-二开之创建TextNote-(1)

Revit二开之创建TextNote TextNode在Revit注释模块中&#xff0c;具体位置如图所示 图中是Revit2018版本 【Revit中的使用】 Revit 中的操作是点击上图中的按钮在平面视图中点击任意放置放置就行&#xff0c; 在属性中可以修改文字 代码实现 创建TextNode ExternalComm…

有趣的CSS - 故障字体效果

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是用 css 实现一个404故障字体效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面…

2024年全国乙卷高考理科数学备考:十年选择题真题和解析

今天距离2024年高考还有三个多月的时间&#xff0c;今天我们来看一下2014~2023年全国乙卷高考理科数学的选择题&#xff0c;从过去十年的真题中随机抽取5道题&#xff0c;并且提供解析。后附六分成长独家制作的在线练习集&#xff0c;科学、高效地反复刷这些真题&#xff0c;吃…

Linux上搭建并使用ffmpeg(Java)

关于MacOs和Windows系统上使用ffmpeg就不多说了&#xff0c;有很多相关文章&#xff0c;今天给大家分享一个在Linux环境下使用Java语言来使用ffmpeg 一、首先去官网下载一个Linux对应的ffmpeg包 1、进入ffmpeg官网&#xff1a;官网 2、点击左侧导航栏Download 3、选择Linux对…