执行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_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("执行完毕!")