退屈で友達と一緒に映画を見たいのですが、何を見るかわからないので、高評価の映画を見てください。前回Douban映画のトップ250に登ったとき、最初の評価は「The Shemption of Shen Shaoke」でした。 TencentのメンバーがTencent Videoに行って見つけなかったため、このような傑作は9.6ポイントを獲得できます。この時点でスイカビデオについて考え、最初に映画のリソースを見つけました:https : //www.xigua555.com/dianying/juqingpian/xiaoshenkedejiushu/player-2-0.html
明快さはそれだけですが、カードを長時間見てください。それはcdnアクセラレーションであってはならず、元の速度を見ることができません。それをダウンロードして見ることを考えたので、右クリックして要素を確認し、Webページのソースコードを見てみましたが、期待どおりの一連のリソースが見つかりませんでした。したがって、Webページの要求情報を見て、手掛かりを取得しようとすると、実際に.m3u8ファイルがいくつか見つかり、すべてのtsビデオクリップをダウンロードして確認できます。WebページのWebリクエストもこれらのtsファイルをリクエストしました。これらのリクエストが定期的であることを確認してください。リクエストライブラリを使用してダウンロードし、ウィンドウのcopy / bコマンドを使用してつなぎ合わせることができます。この考えでは、開始するのが待ちきれませんあまりにも。
xxx.m3u8ファイルの内容:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:4.24,
/20180705/hPpePutf/800kb/hls/qKHCDKwg5034000.ts
#EXTINF:6.32,
/20180705/hPpePutf/800kb/hls/qKHCDKwg5034001.ts
#EXTINF:4,
/20180705/hPpePutf/800kb/hls/qKHCDKwg5034002.ts
#EXTINF:2.08,
/20180705/hPpePutf/800kb/hls/qKHCDKwg5034003.ts
#EXTINF:4.44,
/20180705/hPpePutf/800kb/hls/qKHCDKwg5034004.ts
qKHCDKwg5034001.tsファイルのリクエスト情報:
リクエストヘッダーには、リクエスト時に追加する必要があるReferer属性があります。コードの最初のバージョンは次のとおりです。
import requests
from bs4 import BeautifulSoup
import os
from pathlib import Path
# 定义请求头的浏览器代理,伪装成浏览器
headers = {'UserAgent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
'Referer': 'https://www.xigua555.com/js/player/m3u8.html'}
def download(link):
r = requests.get(link, headers = headers,timeout = 200)
if r.status_code == 200:
print(link + "下载成功!" + str(r.status_code))
else:
print(link + "下载失败!" + str(r.status_code))
return r.content
def save(name,contents):
with open(name, "wb") as file:
file.write(contents)
print("文件{0}已保存。".format(name))
if __name__ == '__main__':
print("程序开始...")
print("创建目录...")
tmpDir = ".tmp/"
if not Path(tmpDir).exists():
os.mkdir(tmpDir)
prefix = "https://cn2.zuidadianying.com/20180705/hPpePutf/800kb/hls/"
tsPre = "qKHCDKwg5034"
# 根据m3u8文件下载0-2137
for tsNum in range(0, 2138):
tsFileName = tsPre + str(tsNum).zfill(3) + ".ts"
url = prefix + tsFileName
print("正在下载文件:" + tsFileName)
while True:
try:
contents = download(url)
save(tmpDir + tsFileName, contents)
except Exception:
print(tsFileName + "正在重试...")
continue
else:
break
print("程序结束...")
案の定、プログラムは実行され、満足しました…。いいえ!待って!5つのファイルをダウンロードする前に、10分の遅いダウンロード方法は?合計で2,000以上のファイルがありますが、このダウンロードはいつ行われますか?突然不満を感じます。問題はそれほど大きくありません。これはまだマルチスレッドではありませんか?Pythonはあまり馴染みがなく、あまり多くのスレッドを使用していません。
一般的な考え方は、128スレッドを作成することです(一部の人が自分のマシンに3wプロセスを持っていることを確認してください。最初に2138プロセスを開始したいのですが、それらの半分が爆破していることに気付きました)。すべてのプロセスがダウンロードされた後、128並列の次のラウンドが実行されます。ダウンロードしますが、実際には問題があります。ショートボードエフェクトは常に最も遅いものを待ち、2回目のラウンドまで待たないこともあります。したがって、キュー、プロデューサーコンシューマーモードを考えましたが、小さなチキンです。これを書くか、スリープを直接使用して問題を回避するにはまだ時間がかかるため、マルチスレッドバージョンを作成しました。
import requests
from bs4 import BeautifulSoup
import os
import threading
import time
# 定义请求头的浏览器代理,伪装成浏览器
headers = {'UserAgent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
'Referer': 'https://www.xigua555.com/js/player/m3u8.html'}
# 保存目录
tmpDir = ".tmp/"
prefix = "https://cn2.zuidadianying.com/20180705/hPpePutf/800kb/hls/"
tsPre = "qKHCDKwg5034"
def download(link):
r = requests.get(link, headers = headers,timeout = 200)
if r.status_code == 200:
print(link + "下载成功!" + str(r.status_code))
else:
print(link + "下载失败!" + str(r.status_code))
return r.content
def save(name,contents):
with open(name, "wb") as file:
file.write(contents)
print("文件{0}已保存。".format(name))
# 创建文件夹
def mkdir(file_path):
if os.path.exists(file_path) and os.path.isdir(file_path):
pass
else:
os.mkdir(file_path)
def init():
print("初始化...")
mkdir(tmpDir)
def excute(tsNum):
retry = 5
tsFileName = tsPre + str(tsNum).zfill(3) + ".ts"
url = prefix + tsFileName
print("正在下载文件:" + tsFileName)
while True:
try:
contents = download(url)
save(tmpDir + tsFileName, contents)
except Exception:
if retry > 0:
print(tsFileName + "正在重试...")
continue
else:
print(tsFileName + "重试上限!")
break
else:
break
if __name__ == '__main__':
print("程序开始...")
init()
# 多线程计数器
thread_max = 128
thread_counter = thread_max;
threads = []
# 根据m3u8文件下载0-2137
for tsNum in range(0, 2138):
if thread_counter > 0:
thread_counter -= 1;
t = threading.Thread(target = excute, args = (tsNum,))
threads.append(t)
t.start()
else:
"""
# 等待所有线程任务结束
for t in threads:
t.join()
print("所有线程任务完成")
"""
time.sleep(60)
thread_counter = thread_max
time.sleep(60*60*24)
print("程序结束...")
私の考えによると、このプログラムはまだ登るのがとてもエキサイティングです。結局のところ、初めてマルチスレッドを使用すると、特定の目的を達成できます。ダウンロードのピーク速度は5M /秒(元の50K /秒)に達しています。要するに、かなりのスピードアップであり、おそらくコストがかかります20分以上経過しても、ダウンロードできないファイルが15個残っていることがわかりましたが、ダウンロードされなかったファイルはプログラムによって記録されなかったため、ダウンロードされなかったファイルを見つけるために別のコードを記述しました。
import os
import re
def getFileList(dir_name):
list = []
for filename in os.listdir(dir_name):
ret = re.search("\d+",filename,flags = 0)
list.append(int(ret.group()))
return list
if __name__ == "__main__":
nlist = getFileList(".tmp/")
nlist.sort()
glist = [int("5034" + str(i).zfill(3)) for i in range(0, 2138)]
diflist = list(set(glist) - set(nlist))
print (diflist)
コードは少しナンセンスなので、あまり言いませんが、目的はそれを達成すること、ダウンロードされていないファイルの名前を確認すること、ダウンロードを続行するプログラムを作成すること、そして長い間動きがないことを見つけることです。15ファイルは多すぎません、最も愚かな方法は手動でダウンロードしてリンクをブラウザにコピーすることです、それは安定していると思いました、そして最後の3つが残っているときに問題があり、リンクへのアクセスが許可されていません、それはIPをブロックする必要があります、それでエージェントを開いて残りのファイルをダウンロードしました。
すべてのtsファイルがようやくここにあります。次に、それらをどのようにマージしますか?ワイルドカードをサポートするためにWindowsコマンドラインに付属のコマンドcopy / bを使用しますが、スプライスの順序はdirコマンドで表示される順序と同じです。最初に、tsファイルを名前で配置します。分類。
分類後、次のコマンドを繰り返し使用します。
> copy /b *.ts new.ts
最後に、774M tsファイルを取得し、名前を変更してダブルクリックして視聴します。注文に問題はなく、満足です!
電話する〜