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