執行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("執行完畢!")