一個好的編輯器我們可以方便的開發項目,編寫代碼,配置和管理我們的項目。所以我們開始編寫html代碼之前需要搭建開發環境。
基于html項目的開發和代碼編寫現在網上有很多編輯器,也有免費的,也有收費的編輯器。基于在Windows系統環境下開發和編寫html代碼最簡單的編輯器就是Windows自帶的記事本,我們可以使用記事本編輯html代碼。
使用記事本編寫html的步驟是首先新建一個文本文檔,按照html的語法規則編寫相關的代碼和保存文件,然后把文件的后綴名改為.html,使用電腦上的瀏覽器打開就可以查看我們代碼的運行結果。
雖然記事本也能編寫html代碼,但是效率不高也不方便,所以我們使用專業的編輯器來開發項目,編寫代碼和管理項目。
常用html代碼編寫的免費軟件有HBuilderX,vs code,Sublime Text 等等。
HBuilderX官網下載地址:
https://www.dcloud.io/hbuilderx.html
vs code的官網下載地址:
https://code.visualstudio.com/
Sublime Text官網下載地址:
http://www.sublimetext.com/
我們以后的教程都使用HBuilderX,所以下面為了同學們的學習方便,對HBuilderX的下載和安裝做詳細的教程。
一,下載
首先訪問HBuilderX的官網網址:
https://www.dcloud.io/hbuilderx.html
打開上面的HBuilderX下載網址后點擊頁面上download,在彈出的對話框里選擇適合自己電腦的HBuilderX版本下載。
在Windows10環境下下載后的文件是一個壓縮的.zip文件。
二,安裝
鼠標右擊下載下來的壓縮文件進行解壓。
解壓完成后是一個名為HBuilderX的文件夾。
解壓完成后鼠標雙擊HBuilderX文件夾:
雙擊運行名為HBuilderX.exe的應用程序文件即可啟動HBuilderX編輯器:
因為HBuilderX是一個綠色軟件所以沒有桌面快捷方式和開始菜單快速啟動程序,我們可以右擊HBuilderX.exe文件創建桌面快捷方式。
小百科:
綠色軟件指一類小型軟件,多數為免費軟件,最大特點是軟件無需安裝便可使用,可存放于閃存中,移除后也不會將任何記錄留在本機計算機上。通俗點講綠色軟件就是指不用安裝,下載直接可以使用的軟件。綠色軟件不會在注冊表中留下注冊表鍵值,所以相對一般的軟件來說,綠色軟件對系統的影響幾乎沒有,所以是很好的一種軟件類型。
三,新建項目
HBuilderX編輯器初次啟動時的默認界面是下圖所示:
按照下圖所示可以創建一個新的名為demo1空白項目:
名為demo1的空白項目創建成功后的界面如下圖所示:
接下來在剛我們新建的demo1項目下創建名為helloworld的html文件
鼠標右擊創建的demo1項目選擇新建在選擇.html文件:
在彈出的對話框里填入html文件的名稱:
編寫一段代碼:
運行:
在瀏覽器上觀察效果:
好了,到這里html的開發環境搭建和HBuilderX的安裝教程結束了。
下面再給大家教一下怎樣修改HBuilderX的主題風格,HBuilderX自身提供了修改軟件主題的功能,使用者可以自身需求和喜好修改HBuilderX的風格。在喜歡自己喜歡的環境下做開發也是令人羨慕的一件事。
按照一下步驟可以修改HBuilderX的主題,默認主題是綠柔,我們可以改成雅黑,雅藍或者自定義主題:
雅黑主題:
雅藍主題:
好了本節全部內容全部結束了,希望我準備的內容對你有所幫助
你的支持是我的最大動力,若覺得我的教程還可以對你有幫助為我點贊加關注!謝謝!
迎搜索我的公眾號:小道黑客
每天分享更多黑客技能,工具及體系化視頻教程
這里最近參與CIS大會,看到一款自動化滲透工具 Ary,特點是匯聚了各種可以調用的工具。
工具地址 https://github.com/TeraSecTeam/ary
POC收集 https://github.com/TeraSecTeam/poc-collection
Ary是一個集各種滲透工具于一體的工具,不過看起來還是一個開發中的版本,試用了一遍,感覺還不錯。
注意需要使用centos,好像ubuntu會報一些錯誤。
├── ary #二進制文件
├── configs #配置文件夾
├── input
├── log #日志記錄
├── output #輸出目錄
├── pocs #poc文件夾,可以用自己的POC或者網上的poc
├── README.md 使用說明
└── streams #執行流所在文件夾,自己定義組合
信息收集
工具聯動
1.安裝所有的工具引擎,執行命令后,將會自動下載第三方的滲透工具,如xray。也可以預先不下載,在執行命令的時候如果缺少某個第三方工具會自動下載。
./ary --vulnscan --engine all --update -v
./ary --assertscan --engine all --update -v
2.chrome 的安裝(爬蟲需要)
配置yum谷歌的源:
vi /etc/yum.repos.d/google.repo
將下面這段粘貼進文件
[google]
name=Google-x86_64
baseurl=http://dl.google.com/linux/rpm/stable/x86_64
enabled=1
gpgcheck=0
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
配置完之后,執行以下bash命令,安裝google-chrome
yum update
yum install google-chrome-stable
google-chrome --version
默認加載配置為帶有settings.ini的文件configs/example.settings.ini文件為配置示例,可以修改其內容,如加入網絡搜索引擎的token
1.目錄設置
可以設置各輸入和輸出目錄
2.第三方工具來源
xray下載地址及下載輸出位置
3.信息收集來源
包含rad,crawlergo,gospider等信息收集工具
4.空間搜索引擎配置
主要是配置fofa,shodan,censys的token或API key
1.網絡空間搜索
支持shodan、fofa、censys等空間搜索引擎,使用相關搜索需要在配置文件configs/example.settings.ini中配置相應的token。
相關命令
./ary --netsearch --engine shodan --keyword dedecms -v --limit 10
./ary --netsearch --engine shodan --keyword "tomcat country:"US"" -v --limit 10
./ary --netsearch --engine fofa --keyword redis -v --limit 10
./ary --netsearch --engine fofa --keyword "protocol=socks4 && banner="0x5a"" -v --limit 10
./ary --netsearch --engine censys --keyword redis -v --limit 1000
如使用shodan進行搜索
配置token(需要自己注冊shodan的賬號,獲取token)
cd configs[root@centos configs]# vim example.settings.ini
搜索dedecms框架, 限制10條
[root@centos kk]# ./ary --netsearch --engine shodan --keyword dedecms -v --limit 10
結果如下
搜索結果默認保存在sqlite中,在配置文件中配置,公開版默認配置sqlite
使用sqlite3工具 SQLiteStudio查看,可看到結果已保存到本地data.db中
采用shodan語法搜索, 搜索國家為美國的tomcat
[root@centos kk]# ./ary --netsearch --engine shodan --keyword "tomcat country:"US"" -v --limit 10
使用fofa基本語法搜索
[root@centos kk]# ./ary --netsearch --engine fofa --keyword redis -v --limit 10
根據特征搜索sock4代理,關鍵詞為
protocol=socks4 && banner="0x5a"
./ary --netsearch --engine fofa --keyword "protocol=socks4 && banner="0x5a"" -v --limit 10
結果
評論
censys的結果不精確,沒有相應的端口
推薦shodan和fofa
2.資產掃描
基于在線靶場測試http://testhtml5.vulnweb.com
基于ARL資產掃描
ARL是freebuf能力中心開源的一套資產掃描系統(https://github.com/TophantTechnology/ARL),提供docker版,有前端界面,基于ARL可以方便進行資產掃描和可視化
這里采用ARL 資產偵查燈塔系統
(https://hub.docker.com/r/tophant/arl/tags?page=1&ordering=last_updated)
直接使用docker版本的ARL,登錄進去后改密碼
在配置文件里配置ARL
ARL token在登錄后可以從cookie獲取
打開F12查看cookie
PS: 在啟動docker的時候可以配置固定token,
如果需要一直使用建議進行配置 之后在配置文件的[assertscan]中進行相應配置
通過ary調用ARL進行資產掃描
ARL:
./ary --assertscan --engine arl --input指定文件
./ary --assertscan --engine arl --url指定url,可指定多個url,url之間用逗號隔開
資產掃描相關命令
# 啟動一個任務
# 查找子域名
./ary --assertscan --engine arl --url www.aaa.com -v --condition subdomain
./ary --assertscan --engine arl --url www.aaa.com,www.bbb.com -v --condition subdomain
# 查找子域名 指定文件
./ary --assertscan --engine arl --input targets.txt -v --condition subdomain
# 查找子域名 指定輸出文件名
./ary --assertscan --engine arl --url www.aaa.com -v --condition subdomain --output arl.csv
# 查找端口
./ary --assertscan --engine arl --input targets.txt -v --condition portscan
# 獲取任務結果
./ary --assertscan --engine arl -v --fetch-result --keyword 5fd321f0a4a557000fb2a574
# 獲取任務結果 - 加載文件
./ary --assertscan --engine arl -v --fetch-result --input arl.csv
掃描測試
./ary --assertscan --engine arl --url http://testhtml5.vulnweb.com -v --condition subdomain
登錄ARL后臺,x.x.x.x:5003, 輸入賬號密碼,可以看到在ARL中已經啟動了任務
獲取掃描完畢的結果
[root@centos kk]# ./ary --assertscan --engine arl -v --fetch-result --keyword 5ff67b77ac258f000ccf4de2
或者直接把文件作為輸入
[root@centos kk]# ./ary --assertscan --engine arl -v --fetch-result --input output/arl_1_2021-01-07T03\:09\:43Z.txt.csv
端口掃描
./ary --assertscan --engine arl --input vulnweb.com -v --condition portscan
端口掃描僅限于top100,不太好用,不能指定端口
3.爬蟲類
./ary --assertscan --engine rad --url http://testphp.vulnweb.com/ -v
./ary --assertscan --engine gospider --url http://testphp.vulnweb.com/ -v
./ary --assertscan --engine crawlergo --url http://testphp.vulnweb.com/ -v
使用rad進行爬取
[root@centos kk]# ./ary --assertscan --engine rad --url http://testphp.vulnweb.com/ -v
如果沒有rad,會自動下載并開始爬取
rad配置文件rad_config.yml在當前目錄生成爬取過程
保存結果在
output/rad_1_2021-01-07T06:47:23Z.txt
使用gospider進行爬取
./ary --assertscan --engine gospider --url http://testphp.vulnweb.com/ -v
如果沒有gospider,會自動下載并開始爬取
結果保存在output/gospider文件夾下
2021-01-07 06:50:00,846 - [assertscan#143] - HIGHLIGHT - saved to output/gospider
gospider比rad在參數上更加詳細
使用crawlgo進行爬取
如果沒有crawlgo,會自動下載并開始爬取
[root@centos kk]# ./ary --assertscan --engine crawlergo --url http://testphp.vulnweb.com/ -vCrawlgo的也比較詳細,但是速度較gospider和rad慢
結果保存在output文件夾下
2021-01-07 06:57:40,600 - [assertscan#165] - HIGHLIGHT - saved to output/crawlergo_1_2021-01-07T06:56:05Z.txt
4.漏洞掃描
# 對目標進行掃描
./ary --vulnscan --url http://testphp.vulnweb.com/ --engine xray -v
# 對目標進行被動掃描(rad+xray)
./ary --vulnscan --engine xray --url http://testphp.vulnweb.com/ -v --passive
# 對文件中的目標進行被動掃描
./ary --vulnscan --engine xray --input target.txt -v --passive
# 讀取數據庫中的數據進掃描
./ary --vulnscan --engine xray --keyword tomcat -v
./ary --vulnscan --engine xray --keyword tomcat -v --crawl
直接調用xray進行掃描
./ary --vulnscan --url http://testphp.vulnweb.com/ --engine xray -v
如果沒有xray,會自動下載并開始爬取
xray的配置文件config.yaml默認在當前文件夾生成
下載完后保存在在thirdpartys文件夾下
xray結果以json格式保存在output目錄下
調用xray進行被動掃描
./ary --vulnscan --engine xray --url http://testphp.vulnweb.com/ -v --passive
效果不好,可能是使用姿勢不對,待進一步探索
xray+gospider分開跑
效果不錯
在兩個終端中運行程序:
運行xray, xray在7778端口監聽,被動掃描模式
./ary --vulnscan --engine xray --port 7778 --background -v
運行gospider,將流量轉發到7778端口給xray進行掃描,使用xray對go spider的內容進行掃描
./ary --assertscan --engine gospider --url http://testphp.vulnweb.com/ -v --passive --port 7778
效果如下
xray+rad分開跑
運行rad,將流量轉發到7778給xray掃描,效果不錯
xray+crawelgo分開跑
運行crawelgo,掃描的數量多一點,但是相對來說慢一點
5.POC使用
PoC 漏洞驗證
POC可自行在POC收集 https://github.com/TeraSecTeam/poc-collection項目中尋找
./ary --pocscan --input redis.txt --poc redis -v
./ary --pocscan --url xx.xx.xx.xx --poc ./pocs/redis -v
./ary --pocscan --poc tomcat --keyword tomcat -v
./ary --pocscan --keyword redis --poc redis -v
./ary --pocscan --keyword redis --poc redis -v --limit 1 --dumppcap redis
./ary --pocscan --keyword thinkphp --poc thinkphp_rce2 -v --limit 20 --dumppcap thinkphp
# 寫到數據庫
./ary --pocscan --url xx.xx.xx.xx --poc redis -v --limit 2 --upload
redis POC 效果
針對單個網站打poc
[root@centos kk]# ./ary --pocscan --url 122.xx.xx.xx --poc redis -v
針對數據庫中的關鍵詞打POC
[root@centos kk]# ./ary --pocscan --keyword redis --poc redis -v
對數據包詳細分析
執行流嘗試使用錄包功能,錄包之后為pcap格式,可以用wireshark打開
6.Stream模塊使用
使用這個模塊可以自定義過程。
使用steam進行POC驗證
自定義過程的配置在./streams/streams.yaml
./ary -v --stream --input streams.yaml --keyword "redis 未授權訪問漏洞"
可以看到名稱為redis 未授權訪問漏洞,故在命令行中輸入該關鍵詞`--keyword "redis 未授權訪問漏洞"`
將會使用shodan進行redis搜集,并且使用pocs目錄下的redis.py POC進行利用嘗試
效果如下
使用stream進行漏洞挖掘
也可以進行漏洞掃描,指定xray引擎,非passive方式掃描,
關鍵詞為test testphp.vulnweb.com
./ary -v --stream --input streams.yaml --keyword "test testphp.vulnweb.com"
即可進行xray掃描
效果 如下
1、API報錯
2021-01-07 02:28:23,382 - [netsearch#217] - DEBUG - fofa mail : hxxxxxl@163.com, secret : 238ebxxxxxxxxxxxxxxxxxx2440
2021-01-07 02:28:23,387 - [database#28] - DEBUG - using database : sqlite
2021-01-07 02:28:23,396 - [netsearch#249] - DEBUG - https://fofa.so/api/v1/search/all?email=hxxxxxl@163.com&key=238ebxxxxxxxxxxxxxxxxxx2440&qbase64=aXA9IjguOC144Ljgi&size=1
2021-01-07 02:28:24,597 - [netsearch#253] - ERROR - 401 Unauthorized, make sure 1.email and apikey is correct 2.FOFA coin is enough.
解決方法: 注冊賬號,獲取token,并在配置文件中填入相應的token
2、端口被占用
解決方法
[root@centos kk]# ./ary --kill --engine xray --port 7777 -v
- 快速的資產收集和工具聯動操作
- 在獲取某個POC和框架信息的情況下,可以快速聚合所需要的網站并且調用需要的工具進行掃描
- 適用于平時進行漏洞挖掘
- 數據庫的使用可以發揮更多的想象力,其他版本在數據方面應該會更友好
- 體驗下來,公開版適用于滲透測試前中期的自動化工作,輔助在測試中更快地尋找到突破點
作者:掙扎的小小
來源:https://www.freebuf.com/sectool/260698.html
、項目概述
有一天,我突然想找點事做,想起一直想學但是沒有學的C語言,就決定來學一下。可是怎么學呢?看書的話太無聊,報班學呢又快吃土了沒錢,不如去B站看看?果然,關鍵字C語言搜索,出現了很多C語言的講課視頻:
B站C語言講課視頻節選
B站https://www.bilibili.com/是一個很神奇的地方,簡直就是一個無所不有的寶庫,幾乎可以滿足你一切的需求和視覺欲。不管你是想看動畫、番劇 ,還是游戲、鬼畜 ,亦或科技和各類教學視頻 ,只要你能想到的,基本上都可以在B站找到。對于程序猿或即將成為程序猿的人來說,B站上的編程學習資源是學不完的,可是B站沒有提供下載的功能,如果想保存下載在需要的時候看,那就是一個麻煩了。我也遇到了這個問題,于是研究怎么可以實現一鍵下載視頻,最終用Python這門神奇的語言實現了。
當然了,項目實現之后,不是想學習編程、而是想看其他類別視頻的小伙伴也可以用這款工具進行下載了。
這次項目不需要太多的環境配置,最主要的是有ffmpeg(一套可以用來記錄、轉換數字音頻、視頻,并能將其轉化為流的開源計算機程序)并設置環境變量就可以了。ffmpeg主要是用于將下載下來的視頻和音頻進行合并形成完整的視頻。
可點擊https://download.csdn.net/download/CUFEECR/12234789或進入官網http://ffmpeg.org/download.html進行下載,并解壓到你想保存的目錄。
(1)復制ffmpeg的bin路徑,如xxx\ffmpeg-20190921-ba24b24-win64-shared\bin
(2)此電腦右鍵點擊屬性,進入控制面板\系統和安全\系統
(3)點擊高級系統設置→進入系統屬性彈窗→點擊環境變量→進入環境變量彈窗→選擇系統變量下的Path→點擊編輯點擊→進入編輯環境變量彈窗
(4)點擊新建→粘貼之前復制的bin路徑
(5)點擊確定,逐步保存退出
動態操作示例如下:
ffmpeg 設置環境變量
除了ffmpeg,還需要安裝pyinstaller庫用于程序打包。可用以下命令進行安裝:
pip install pyinstaller
如果遇到安裝失敗或下載速度較慢,可換源:
pip install pyinstaller -i https://pypi.doubanio.com/simple/
import json
import os
import re
import shutil
import ssl
import time
import requests
from concurrent.futures import ThreadPoolExecutor
from lxml import etree
導入的庫包括用于爬取和解析網頁的庫,還包括創建線程池的庫和進行其他處理的庫,大多數都是Python自帶的,如有未安裝的庫,可使用pip install xxx命令進行安裝。
# 設置請求頭等參數,防止被反爬
headers = {
'Accept': '*/*',
'Accept-Language': 'en-US,en;q=0.5',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
}
params = {
'from': 'search',
'seid': '9698329271136034665'
}
設置請求頭等參數,減少被反爬的可能。
def re_video_info(text, pattern):
'''利用正則表達式匹配出視頻信息并轉化成json'''
match = re.search(pattern, text)
return json.loads(match.group(1))
def create_folder(aid):
'''創建文件夾'''
if not os.path.exists(aid):
os.mkdir(aid)
def remove_move_file(aid):
'''刪除和移動文件'''
file_list = os.listdir('./')
for file in file_list:
# 移除臨時文件
if file.endswith('_video.mp4'):
os.remove(file)
pass
elif file.endswith('_audio.mp4'):
os.remove(file)
pass
# 保存最終的視頻文件
elif file.endswith('.mp4'):
if os.path.exists(aid + '/' + file):
os.remove(aid + '/' + file)
shutil.move(file, aid)
主要包括兩方面的基本處理,為正式爬取下載做準備:
def download_video_batch(referer_url, video_url, audio_url, video_name, index):
'''批量下載系列視頻'''
# 更新請求頭
headers.update({"Referer": referer_url})
# 獲取文件名
short_name = video_name.split('/')[2]
print("%d.\t視頻下載開始:%s" % (index, short_name))
# 下載并保存視頻
video_content = requests.get(video_url, headers=headers)
print('%d.\t%s\t視頻大小:' % (index, short_name),
round(int(video_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')
received_video = 0
with open('%s_video.mp4' % video_name, 'ab') as output:
headers['Range'] = 'bytes=' + str(received_video) + '-'
response = requests.get(video_url, headers=headers)
output.write(response.content)
# 下載并保存音頻
audio_content = requests.get(audio_url, headers=headers)
print('%d.\t%s\t音頻大小:' % (index, short_name),
round(int(audio_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')
received_audio = 0
with open('%s_audio.mp4' % video_name, 'ab') as output:
headers['Range'] = 'bytes=' + str(received_audio) + '-'
response = requests.get(audio_url, headers=headers)
output.write(response.content)
received_audio += len(response.content)
return video_name, index
def download_video_single(referer_url, video_url, audio_url, video_name):
'''單個視頻下載'''
# 更新請求頭
headers.update({"Referer": referer_url})
print("視頻下載開始:%s" % video_name)
# 下載并保存視頻
video_content = requests.get(video_url, headers=headers)
print('%s\t視頻大小:' % video_name, round(int(video_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')
received_video = 0
with open('%s_video.mp4' % video_name, 'ab') as output:
headers['Range'] = 'bytes=' + str(received_video) + '-'
response = requests.get(video_url, headers=headers)
output.write(response.content)
# 下載并保存音頻
audio_content = requests.get(audio_url, headers=headers)
print('%s\t音頻大小:' % video_name, round(int(audio_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')
received_audio = 0
with open('%s_audio.mp4' % video_name, 'ab') as output:
headers['Range'] = 'bytes=' + str(received_audio) + '-'
response = requests.get(audio_url, headers=headers)
output.write(response.content)
received_audio += len(response.content)
print("視頻下載結束:%s" % video_name)
video_audio_merge_single(video_name)
這部分包括系列視頻的批量下載和單個視頻的下載,兩者的大體實現原理近似,但是由于兩個函數的參數有差別,因此分別實現。在具體的實現中,首先更新請求頭,請求視頻鏈接并保存視頻(無聲音),再請求音頻鏈接并保存音頻,在這個過程中得到相應的視頻和音頻文件的大小。
def video_audio_merge_batch(result):
'''使用ffmpeg批量視頻音頻合并'''
video_name = result.result()[0]
index = result.result()[1]
import subprocess
video_final = video_name.replace('video', 'video_final')
command = 'ffmpeg -i "%s_video.mp4" -i "%s_audio.mp4" -c copy "%s.mp4" -y -loglevel quiet' % (
video_name, video_name, video_final)
subprocess.Popen(command, shell=True)
print("%d.\t視頻下載結束:%s" % (index, video_name.split('/')[2]))
def video_audio_merge_single(video_name):
'''使用ffmpeg單個視頻音頻合并'''
print("視頻合成開始:%s" % video_name)
import subprocess
command = 'ffmpeg -i "%s_video.mp4" -i "%s_audio.mp4" -c copy "%s.mp4" -y -loglevel quiet' % (
video_name, video_name, video_name)
subprocess.Popen(command, shell=True)
print("視頻合成結束:%s" % video_name)
這個過程也是批量和單個分開,大致原理差不多,都是調用subprogress模塊來生成子進程,Popen類來執行shell命令,由于已經將ffmpeg加入環境變量,所以shell命令可以直接調用ffmpeg來合并音視頻。
def batch_download():
'''使用多線程批量下載視頻'''
# 提示輸入需要下載的系列視頻對應的id
aid = input('請輸入要下載的視頻id(舉例:鏈接https://www.bilibili.com/video/av91748877?p=1中id為91748877),默認為91748877\t')
if aid:
pass
else:
aid = '91748877'
# 提示選擇清晰度
quality = input('請選擇清晰度(1代表高清,2代表清晰,3代表流暢),默認高清\t')
if quality == '2':
pass
elif quality == '3':
pass
else:
quality = '1'
acc_quality = int(quality) - 1
# ssl模塊,處理https請求失敗問題,生成證書上下文
ssl._create_default_https_context = ssl._create_unverified_context
# 獲取視頻主題
url = 'https://www.bilibili.com/video/av{}?p=1'.format(aid)
html = etree.HTML(requests.get(url, params=params, headers=headers).text)
title = html.xpath('//*[@id="viewbox_report"]/h1/span/text()')[0]
print('您即將下載的視頻系列是:', title)
# 創建臨時文件夾
create_folder('video')
create_folder('video_final')
# 定義一個線程池,大小為3
pool = ThreadPoolExecutor(3)
# 通過api獲取視頻信息
res_json = requests.get('https://api.bilibili.com/x/player/pagelist?aid={}'.format(aid)).json()
video_name_list = res_json['data']
print('共下載視頻{}個'.format(len(video_name_list)))
for i, video_content in enumerate(video_name_list):
video_name = ('./video/' + video_content['part']).replace(" ", "-")
origin_video_url = 'https://www.bilibili.com/video/av{}'.format(aid) + '?p=%d' % (i + 1)
# 請求視頻,獲取信息
res = requests.get(origin_video_url, headers=headers)
# 解析出視頻詳情的json
video_info_temp = re_video_info(res.text, '__playinfo__=(.*?)</script><script>')
video_info = {}
# 獲取視頻品質
quality = video_info_temp['data']['accept_description'][acc_quality]
# 獲取視頻時長
video_info['duration'] = video_info_temp['data']['dash']['duration']
# 獲取視頻鏈接
video_url = video_info_temp['data']['dash']['video'][acc_quality]['baseUrl']
# 獲取音頻鏈接
audio_url = video_info_temp['data']['dash']['audio'][acc_quality]['baseUrl']
# 計算視頻時長
video_time = int(video_info.get('duration', 0))
video_minute = video_time // 60
video_second = video_time % 60
print('{}.\t當前視頻清晰度為{},時長{}分{}秒'.format(i + 1, quality, video_minute, video_second))
# 將任務加入線程池,并在任務完成后回調完成視頻音頻合并
pool.submit(download_video_batch, origin_video_url, video_url, audio_url, video_name, i + 1).add_done_callback(
video_audio_merge_batch)
pool.shutdown(wait=True)
time.sleep(5)
# 整理視頻信息
if os.path.exists(title):
shutil.rmtree(title)
os.rename('video_final', title)
try:
shutil.rmtree('video')
except:
shutil.rmtree('video')
def multiple_download():
'''批量下載多個獨立視頻'''
# 提示輸入所有aid
aid_str = input(
'請輸入要下載的所有視頻id,id之間用空格分開\n舉例:有5個鏈接https://www.bilibili.com/video/av89592082、https://www.bilibili.com/video/av68716174、https://www.bilibili.com/video/av87216317、\nhttps://www.bilibili.com/video/av83200644和https://www.bilibili.com/video/av88252843,則輸入89592082 68716174 87216317 83200644 88252843\n默認為89592082 68716174 87216317 83200644 88252843\t')
if aid_str:
pass
else:
aid_str = '89592082 68716174 87216317 83200644 88252843'
if os.path.exists(aid_str):
shutil.rmtree(aid_str)
aids = aid_str.split(' ')
# 提示選擇視頻質量
quality = input('請選擇清晰度(1代表高清,2代表清晰,3代表流暢),默認高清\t')
if quality == '2':
pass
elif quality == '3':
pass
else:
quality = '1'
acc_quality = int(quality) - 1
# 創建文件夾
create_folder(aid_str)
# 創建線程池,執行多任務
pool = ThreadPoolExecutor(3)
for aid in aids:
# 將任務加入線程池
pool.submit(single_download, aid, acc_quality)
pool.shutdown(wait=True)
time.sleep(5)
# 刪除臨時文件,移動文件
remove_move_file(aid_str)
def single_download(aid, acc_quality):
'''單個視頻實現下載'''
# 請求視頻鏈接,獲取信息
origin_video_url = 'https://www.bilibili.com/video/av' + aid
res = requests.get(origin_video_url, headers=headers)
html = etree.HTML(res.text)
title = html.xpath('//*[@id="viewbox_report"]/h1/span/text()')[0]
print('您當前正在下載:', title)
video_info_temp = re_video_info(res.text, '__playinfo__=(.*?)</script><script>')
video_info = {}
# 獲取視頻質量
quality = video_info_temp['data']['accept_description'][acc_quality]
# 獲取視頻時長
video_info['duration'] = video_info_temp['data']['dash']['duration']
# 獲取視頻鏈接
video_url = video_info_temp['data']['dash']['video'][acc_quality]['baseUrl']
# 獲取音頻鏈接
audio_url = video_info_temp['data']['dash']['audio'][acc_quality]['baseUrl']
# 計算視頻時長
video_time = int(video_info.get('duration', 0))
video_minute = video_time // 60
video_second = video_time % 60
print('當前視頻清晰度為{},時長{}分{}秒'.format(quality, video_minute, video_second))
# 調用函數下載保存視頻
download_video_single(origin_video_url, video_url, audio_url, title)
def single_input():
'''單個文件下載,獲取參數'''
# 獲取視頻aid
aid = input('請輸入要下載的視頻id(舉例:鏈接https://www.bilibili.com/video/av89592082中id為89592082),默認為89592082\t')
if aid:
pass
else:
aid = '89592082'
# 提示選擇視頻質量
quality = input('請選擇清晰度(1代表高清,2代表清晰,3代表流暢),默認高清\t')
if quality == '2':
pass
elif quality == '3':
pass
else:
quality = '1'
acc_quality = int(quality) - 1
# 調用函數進行下載
single_download(aid, acc_quality)
在一般情形下,下載的需求包含3種情況:
(1)單個視頻的下載:
只有一個視頻,沒有和它屬于同一個系列的其他視頻,如下圖
單個視頻下載
此時,除了右下方的相關推薦中的視頻,沒有其他視頻,右上方只有彈幕列表、沒有視頻列表。為了代碼的復用,將單個視頻下載時提示用戶輸入需求的代碼單獨提取出來作為single_input(),下載的函數另外作為single_download(aid, acc_quality)函數實現,在該函數中:
通過視頻鏈接如https://www.bilibili.com/video/av89592082解析網頁,得到相應的字符串并轉化成json,如下:
視頻信息json轉化
字符串json格式化可使用https://www.sojson.com/editor.html進行在線轉化。
獲取到視頻的標題、根據輸入確定的視頻質量、持續時長、視頻鏈接和音頻鏈接,并調用download_video_single()函數下載該視頻。
(2)多個視頻的下載:
這里,多個視頻之間是沒有關系的,多個視頻的下載實際上是先獲取到所有的aid,并進行循環,對每個視頻鏈接傳入參數調用單個視頻下載的函數即可。同時設立線程池,大小為3,既不會對資源有太大的要求,也能實現多任務、提高下載效率。
(3)系列視頻的下載
此時,多個視頻屬于同一系列,如https://www.bilibili.com/video/av91748877是一個課程系列,如下:
系列視頻
顯然,此時右上方有視頻列表,標明了有65個子視頻,每個視頻用p標識,如第2個視頻就是https://www.bilibili.com/video/av91748877?p=2。對于所有視頻,先獲取到視頻的相關信息,再加入進程池進行下載,并在任務結束之后回調函數video_audio_merge_batch()合并音視頻,并進行文件整理。
def main():
'''主函數,提示用戶進行三種下載模式的選擇'''
download_choice = input('請輸入您需要下載的類型:\n1代表下載單個視頻,2代表批量下載系列視頻,3代表批量下載多個不同視頻,默認下載單個視頻\t')
# 批量下載系列視頻
if download_choice == '2':
batch_download()
# 批量下載多個單個視頻
elif download_choice == '3':
multiple_download()
# 下載單個視頻
else:
single_input()
if __name__ == '__main__':
'''調用主函數'''
main()
主函數中實現3種下載方式對應的函數的分別調用。
對3種方式進行測試的效果如下:
項目測試一:單個視頻測試
項目測試二:系列視頻測試
項目測試三:多個不同視頻測試
3種下載情景的測試效果均較好,下載速度也能與一般的下載速度相媲美。
代碼可點擊https://download.csdn.net/download/CUFEECR/12243122或https://github.com/corleytd/Python_Crawling/blob/master/bilibili_downloader_1.py進行下載。
B站網站也一直在變化,所以對于下載可能也會有一些變化,所以將改進的地方在下面列舉出來:
(1)網址參數變化
舉例說明:
這段時間發現B站一個視頻系列的鏈接變成https://www.bilibili.com/video/BV1x7411M74h?p=65,即是無規律的字符串(可能是經過某種算法編碼或加密得到的),現在從鏈接中不能得到視頻(系列)的aid,這時候可以借助瀏覽器工具抓包查看數據來找到該視頻的aid,如下:
B站視頻aid轉bvid
在左側尋找stat開頭的請求,后邊的參數即為aid,該請求api的完整鏈接為https://api.bilibili.com/x/web-interface/archive/stat?aid=91748877,所以可以直接在該鏈接中獲取aid,也可以查看該請求的具體內容,可以看到第一個數據就是aid,我們也可以看到隨機字符串就是bvid,可能是建立了aid和bvid的一一映射,找到aid就可以正常下載了。
在命令行中,使路徑位于代碼所在路徑運行
pyinstaller bilibili_downloader_1.py
打印
136 INFO: PyInstaller: 3.6
137 INFO: Python: 3.7.4
138 INFO: Platform: Windows-10-10.0.18362-SP0
140 INFO: wrote xxxx\Bili_Video_Batch_Download\bilibili_downloader_1.spec
205 INFO: UPX is not available.
209 INFO: Extending PYTHONPATH with paths
['xxxx\\Bili_Video_Batch_Download',
'xxxx\\Bili_Video_Batch_Download']
210 INFO: checking Analysis
211 INFO: Building Analysis because Analysis-00.toc is non existent
211 INFO: Initializing module dependency graph...
218 INFO: Caching module graph hooks...
247 INFO: Analyzing base_library.zip ...
5499 INFO: Caching module dependency graph...
5673 INFO: running Analysis Analysis-00.toc
5702 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
required by xxx\python\python37\python.exe
6231 INFO: Analyzing xxxx\Bili_Video_Batch_Download\bilibili_downloader_1.py
7237 INFO: Processing pre-safe import module hook urllib3.packages.six.moves
10126 INFO: Processing pre-safe import module hook six.moves
14287 INFO: Processing module hooks...
14288 INFO: Loading module hook "hook-certifi.py"...
14296 INFO: Loading module hook "hook-cryptography.py"...
14936 INFO: Loading module hook "hook-encodings.py"...
15093 INFO: Loading module hook "hook-lxml.etree.py"...
15097 INFO: Loading module hook "hook-pydoc.py"...
15099 INFO: Loading module hook "hook-xml.py"...
15330 INFO: Looking for ctypes DLLs
15334 INFO: Analyzing run-time hooks ...
15339 INFO: Including run-time hook 'pyi_rth_multiprocessing.py'
15344 INFO: Including run-time hook 'pyi_rth_certifi.py'
15355 INFO: Looking for dynamic libraries
15736 INFO: Looking for eggs
15737 INFO: Using Python library xxx\python\python37\python37.dll
15757 INFO: Found binding redirects:
[]
15776 INFO: Warnings written to xxxx\Bili_Video_Batch_Download\build\bilibili_downloader_1\war
n-bilibili_downloader_1.txt
15942 INFO: Graph cross-reference written to xxxx\Bili_Video_Batch_Download\build\bilibili_dow
nloader_1\xref-bilibili_downloader_1.html
15967 INFO: checking PYZ
15968 INFO: Building PYZ because PYZ-00.toc is non existent
15968 INFO: Building PYZ (ZlibArchive) xxxx\Bili_Video_Batch_Download\build\bilibili_downloade
r_1\PYZ-00.pyz
16944 INFO: Building PYZ (ZlibArchive) xxxx\Bili_Video_Batch_Download\build\bilibili_downloade
r_1\PYZ-00.pyz completed successfully.
16980 INFO: checking PKG
16981 INFO: Building PKG because PKG-00.toc is non existent
16981 INFO: Building PKG (CArchive) PKG-00.pkg
17030 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
17034 INFO: Bootloader xxx\python\python37\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe
17034 INFO: checking EXE
17035 INFO: Building EXE because EXE-00.toc is non existent
17035 INFO: Building EXE from EXE-00.toc
17037 INFO: Appending archive to EXE xxxx\Bili_Video_Batch_Download\build\bilibili_downloader_
1\bilibili_downloader_1.exe
17046 INFO: Building EXE from EXE-00.toc completed successfully.
17053 INFO: checking COLLECT
17053 INFO: Building COLLECT because COLLECT-00.toc is non existent
17055 INFO: Building COLLECT COLLECT-00.toc
出現INFO: Building EXE from EXE-00.toc completed successfully. 即打包成功。在當前路徑下找到dist或build目錄下的bilibili_downloader_1目錄下的bilibili_downloader_1.exe,即是打包后的軟件。點擊打開即可進行選擇和輸入,開始下載相應視頻。測試示例如下:
項目打包下載測試
在bilibili_downloader_1.exe的同級目錄下可以看到下載保存的視頻。
該項目是小編進行B站視頻下載的首次嘗試,難免有很多不足,在實現的過程中和后期的總結中,可以看出還存在一些問題:
*請認真填寫需求信息,我們會在24小時內與您取得聯系。