序文
実用的であり、将来的にPythonでビデオ資料をダウンロードする効率を改善し、ビデオ関連の知識ポイントをダウンロードする可用性を高めるために、
この記事は随時更新および改善されます。
ビデオをダウンロード
方法1 ----->あなたが得る
ダウンロードして
使用
する利点
は、端末(cmd)で実行
でき、音楽のダウンロードが高速なコード行、ビデオショート非常に便利な
測定結果は30画面のみ9完全ダウン、最初は控えているためです
you-get https://v.youku.com/v_show/id_XMzk4NDE2Njc4OA==.html?firsttime=0
ビデオとオーディオの合成手順を
ffmpegに依存する必要が
あります
オプション | 説明 | 使ったことがありますか |
---|---|---|
-私 | フォーマット、解像度、サイズなどのリソース情報を表示します。 | √ |
-u | ダウンロードまたは表示するURLを指定します。-uを省略してURLを直接追加できる場合もあります | |
- | 出力フォルダを設定します。つまり、保存パスを設定します。指定しない場合は、現在の作業ディレクトリに保存されます。 | √ |
-THE | ファイル名を設定すると、デフォルトのファイル名を使用できます | √ |
-f | 既存のファイルを強制的に上書きする | |
-l | 最初にリスト全体をダウンロードしてください | |
-P | パスワードを使用する(ビデオにアクセスするためにパスワードが必要な場合) | |
-t | タイムアウト期間を秒単位で設定します | |
-c | クッキーを使用し、cookies.txtまたはcookies.sqliteをロードします |
短所
サポートされるプラットフォームは限られていますが、主にbサイト、Youku Video、Douban、NetEase Cloud、iQiyi、Kugouを含む多くのプラットフォームがあります。
まとめ
You-getは実用的、コンパクト、実用的で、最小限の時間コストでビデオを取得します。ただし、機能は単一で、操作スペースは広くありません。一般的なビデオダウンロードツールとしては非常に適しています。映画のビデオファイルのクロールには適していません。
方法2 -------> you-get plus pycharm
方向性
あなたの
便利さを利用してください-ユーザーインタラクションインターフェイスを使用するの
が簡単なプログラムを作成し、特定のターゲットを繰り返しダウンロードするためのコードをさらに書くこともできます
方法3 ------->コードの実装
次のビデオ
url
URLはリソースアドレスとして知られていますが、ビデオ画面のURLは多くの外観を持ち、それらは異なる意味を持っています。URLの詳細な説明については、ここで.mp4で終わるURLを参照してください。
http://ggkkmuup9wuugp6ep8d.exp.bcevod.com/mda-km671xd58s1yy16y/mda-km671xd58s1yy16y.mp4
これは典型的な例であり、プロトコル名、ドメイン名、仮想ディレクトリ、そして.mp4が含まれています。
このようなリンクを取得した後、直接ダウンロードできます
最初にこのリンクをクリックして、直接再生できるかどうかを確認します。結果は
次のように表示されます。次に、次の2つの方法を使用します
。方法1:
import requests
headers = { # 模拟浏览器身份头向对方发送消息
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
url = "http://ggkkmuup9wuugp6ep8d.exp.bcevod.com/mda-km671xd58s1yy16y/mda-km671xd58s1yy16y.mp4“
content = requests.get(url,headers=headers).content
with open("D:/base/%s.mp4"%i,"ab") as fp:
fp.write(content)
print("正在下载s")
方法2:
open('D:/base/test.mp4', "wb") as mp4:
for chunk in r.iter_content(chunk_size=1024 * 1024):
if chunk:
mp4.write(chunk)
2番目の方法に関連する知識が最初にクリックされます。
.mp4で終わらないURL
一般に、.mp4urlを直接取得するのはそれほど簡単ではありません。
url -----要素の2つの方向のいずれかを見つけます
ソースコードを見ると、URLはコードのレイヤーの下にあります。上記の例のmp4urlは、2レイヤーのページの下に隠されているタグのsrcです。秘訣は、最初にソースコードページを確認することです。構造がはっきりしている場合は、ほとんど複雑ではありません。ビデオ再生ページに戻り、右クリックしてタグを注意深く確認します
しかし、ソースコードページを見て、理解できない長い段落がたくさんあることに気付いた場合、特に中括弧やjsスタイルがたくさんある場合は、間違ったページが一目でわかります。場合、要素検索で見つけることができません。セレルニウム、パケットキャプチャ技術(データパケット)などの手段が必要です。
URL -----ネットワークの2つの方向のいずれかを見つけます
この方向は、今述べたパケットキャプチャ技術に少し似ていますが、パケットキャプチャを実際に使用するには、専門のツールの助けが必要です。ここではまず、ブラウザに組み込まれているパケットキャプチャ機能を使用してURLを検索する方法を紹介します。つまり、右クリックして確認し、ネットワークをクリックして、データストリームを見つけ、1つずつ確認して有用な情報を見つけます。この方法は、主に動的なWebページ用です。
URLを見つける2つの方向は基本的に同じであり、どちらもデータから有用な情報をフィルタリングしています
最初は直接ダウンロードする.mp4のURLを探していましたが、ソースコードのWebページが非常に複雑な場合、.mp4のURLはまったく存在しないことは明らかです(存在も暗号化されます)
この場合、考えを変えてインターフェース(api)を見つけてください
インターフェイス(api)は、他の開発者によって作成されたラッパー関数のようなものです。いくつかのパラメーターを追加した後、対応するコンテンツを取得できます。
ステーションbを例にとると、ビデオインターフェイスがあります。このインターフェイスを見つけて、対応するパラメータを追加して、指定したビデオを取得します。このインターフェースに必要なURLが含まれている必要があることを確認するのは難しくありませんが、このURLの形式は.mp4ほど単純ではなく、パラメーターを追加することで接続できます。また、この場合、スプライスされたURLを取得しても、上記の2つのコードでダウンロードできるかどうかは不明です。
ステーションbを例として取り上げて、ステーションbを使用して
インターフェイスを検索します。
'https://api.bilibili.com/x/player/playurl?' + 'bvid=' + bvid +'&cid=' + str(cid) + '&qn=64&type=&otype=json'
または、URLを検索するコード(ネットワーク内の一部の動画にはplayurlがあり、一部にはありません。通常を使用して検索します)、
通常を使用して、ターゲットWebページのソースコード内の動画の直接URLを含むjsonファイルを検索する必要があります。 。
pattern = r'\<script\>window\.__playinfo__=(.*?)\</script\>'
result = re.findall(pattern, html)[0]
次に、jsonを解析します
temp = json.loads(result)
次に、コンテンツを抽出します
video_url = temp['data']['dash']['video'][0]['baseUrl']
print(video_url)
これが印刷結果です
{'code': 0, 'message': '0', 'ttl': 1, 'data': {'from': 'local', 'result': 'suee', 'message': '', 'quality': 32, 'format': 'flv480', 'timelength': 8679, 'accept_format': 'flv720,flv480,mp4', 'accept_description': ['高清 720P', '清晰 480P', '流畅 360P'], 'accept_quality': [64, 32, 16], 'video_codecid': 7, 'seek_param': 'start', 'seek_type': 'offset', 'dash': {'duration': 9, 'minBufferTime': 1.5, 'min_buffer_time': 1.5, 'video': [{'id': 64, 'baseUrl': 'https://upos-sz-mirrorkodo.bilivideo.com/upgcxcode/43/29/288562943/288562943-1-30064.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1613228680&gen=playurl&os=kodobv&oi=827278138&trid=3625ae10dddf49fc88c17490d5867c64u&platform=pc&upsig=1d6f8c7c311ba495bca7f2da3fe288f6&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=0&orderid=0,3&agrr=0&logo=80000000', 'base_url': 'https://upos-s
base_urlのようなリンクが表示されていることがわかります。そのようなリンクを開くと、アクセスできないことがわかります。これは.mp4ではありませんが、これはダウンロードする必要のあるURLです
。base_urlはネットワークで直接見つけることもできます。。
base_urlを取得した後にダウンロードするためにそれを使用する方法は?
ほんの短いショットです。
最終的なコードは次のとおりです。
import requests
url = "https://cn-jszj-dx-v-09.bilivideo.com/upgcxcode/18/28/287972818/287972818-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1613356156&gen=playurl&os=vcache&oi=827278138&trid=3f0f02d09e5a46e8943e7bb069e62f60u&platform=pc&upsig=343a85c8a72a750ba56c93eee4c28d63&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&cdnid=8192&mid=410239695&orderid=0,3&agrr=0&logo=80000000"
headers = { # 模拟浏览器身份头向对方发送消息
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
}
begin = 0
end = 1024 * 1024 - 1
flag = 0
headers.update({'Range': 'bytes=' + str(begin) + '-' + str(end)})
while True:
# 添加请求头键值对,写上 range:请求字节范围
headers.update({'Range': 'bytes=' + str(begin) + '-' + str(end)})
res = requests.get(url=url, headers=headers)
if res.status_code != 416:
# 响应码不为416时有数据,由于我们不是b站服务器,最终那个数据包的请求range肯定会超出限度,所以传回来的http状态码是416而不是206
begin = end + 1
end = end + 1024 * 1024
else:
headers.update({'Range': str(end + 1) + '-'})
res = requests.get(url=url, headers=headers)
flag = 1
with open("D:/base/a.mp4", 'ab') as fp:
fp.write(res.content)
fp.flush()
if flag == 1:
fp.close()
最後のステップは、範囲バイト範囲を追加しないと成功しません。
これは大きな問題です。m4sファイルのみをダウンロードしましたが、m4sファイルを完全に視聴するには、ビデオファイルとオーディオファイルを組み合わせる必要があります...
別の考え方は、ビデオインターフェイスに従って直接flvリンクを見つけることです............
bステーションインターフェースはgetリクエストです。
インターフェースに応じて、指定されたbv番号で単一または一連のビデオをクロールできるようになりました。
クロール動画の本質がURLまたはインターフェースを見つけることであると理解している限り、それは当然のことです。
知っておく必要があります
1.エラーのデモンストレーションは次のようになります
import requests
headers = { # 模拟浏览器身份头向对方发送消息
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
for i in range(142):
url = "https://www.bilibili.com/video/BV17o4y1976Q?p=%s"%i
content = requests.get(url,headers=headers).content
with open("D:/base/%s.mp4"%i,"ab") as fp:
fp.write(content)
print("正在下载%s"%i)
ここでは、間接的なURLはもちろん、エラーが発生します。直接URLとして使用され、それがダウンロードされたときにファイルを開くことができません。
変更をします
import requests
headers = { # 模拟浏览器身份头向对方发送消息
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
url = "http://ggkkmuup9wuugp6ep8d.exp.bcevod.com/mda-km671xd58s1yy16y/mda-km671xd58s1yy16y.mp4"
content = requests.get(url,headers=headers).content
with open("D:/base/s.mp4","ab") as fp:
fp.write(content)
print("正在下载s")
正常にダウンロードできます
2.暗号化されたURL
場合によっては、アドレスを右クリックしてビデオをコピーできます(このURLは通常は役に立ちません)
このような
blob:https://www.bilibili.com/62cc1137-e104-4360-a03f-b856bf1079ca
このURLは暗号化されています。詳細については、ビデオリンクアドレスはブロブである理由を参照して
一括ダウンロードを達成するためのウェブページデータへの直接URLの相対的な位置を見つけることと、クローラのニーズ。
3.
後にURLを直接ダウンロードしないでください。インターフェイスを見つける。ヘッダーに範囲バイト範囲を追加する
4.
通常のダウンロード速度は非常に遅い
5.
ブレークポイント再開
次の映画の最も単純なケース
映画のウェブサイトを例に
とってみましょう。ネットワーク上でjsファイルを見つけます。名前の末尾が注文されており、登山防止方法はありません。直接ダウンロードできます(これは、直接URLダウンロードを見つけるためです。最初のエラー上記の場合はこの場合と同じです。混乱)関連
する原則には、上記の再開可能な
送信も含まれます。HTTPプロトコルでは、Content-Lengthは、HTTPメッセージエンティティのメッセージ本文の転送長を表すために使用されます。
ほんの数行のコード
import requests
from urllib3.exceptions import InsecureRequestWarning
from urllib3 import disable_warnings
disable_warnings(InsecureRequestWarning) # https问题的报错
print("开始下载!")
for i in range(1712):
url = "url%s.ts" % i
ret = requests.get(url,verify=False).content
with open( r"D:/base/白日夢想家4.mp4","ab") as f:
f.write(ret)
print("第%d个ts文件已写入"%i)
print("下载完毕!")
メリットメリットはあり
ませんが、ダウンロードできるのは少し嬉しいです。
映画を一緒にダウンロードすることはできません。この方法では、少なくとも
デメリットを克服
できます。上記のいくつかのコードのダウンロード速度は非常に高速です。スレッドプールとマルチスレッドの知識を使用すると、速度を上げることができる場合があります(この項目は実行されます)。そうでない場合、実用的な
要約はあり
ません。すべてのWebサイトがそれほど
簡単にクロールできるわけではありません。この方法はめったに使用されません。使用できても速度が非常に遅いです。速度を上げて
も
習得には時間がかかります。、動画取得の意義よりも大きいかもしれ
ません。この2つの問題が問題なければ、マルチスレッド、スレッドプール、さらにはエージェントの学習などは、もともとクローラーを学習するためのものです。知っておく必要があります。映画を入手することはあなたにとって非常に重要です。私には映画コレクションの趣味があります。それから、より多くのpsを学ぶことができ
ます。現在、私はマルチスレッドについて十分な知識がなく、映画をクロールする特別な必要はありません。この場合、より実用的でマルチスレッド学習をスキップできる学習を選択することをお勧めします。Scapy、スクレープフレームワークとセレンを使用してテキスト、画像、ビデオをダウンロードする方法
を学び、映画をダウンロードするための学習の方向よりもコストパフォーマンスが高くなるようにします。ロジックを明確にするのに時間がかかります。
より困難な状況
jsファイルは上記のものと同じではありません。暗号化およびエンコードされているようです。少し検索しても解決できません。一時的に棚上げされ、後で追加されます。
方法4 -----------> scrapyダウンロード
少し
ビデオ処理とその強力なソフトウェアについても
フォーマットファクトリ
これ以上言う必要はありません
総括する
Pythonで動画や映画をダウンロードできることは、常に学習する動機の1つです。この方法が多くのメリットをもたらすことを願っています。もちろん、学習の過程で、この目標が多くのソフトウェアにあることに徐々に気づきました。 、そしてネットワークは今日開発されています。Pythonの関数をさりげなく置き換える方法はたくさんありますが、この考え方は私のビジョンを制限します。