pythonでビデオのダウンロード器を作ります。


前言
夜が更けて人が寝静まる夜に、夜は風がそよそよと吹いて、月の光が私の書斎に差し込む。
フォルダを開けて、昔のことを振り返ると、複雑に見える退屈なコードがたくさん出てきます。私は足をたたいて正座していますが、一つの考えが生まれました。「生活はもうつまらなくなったので、もうちょっとパッパをしたほうがいい」と。
そこで、一つのテーマを決めて、キモル君というつまらない発明品です。
いいですね
周知のように、ビデオは新しい姿勢の知識を学ぶ良いメディアです。では、どうやって爬虫を利用して動画を簡単にダウンロードできますか?本論文では、パケット分析からコード実現までを比較的完全に解説します。
一、爬虫類分析
今回選択した目的の動画サイトは、ある度の傘下の美しい動画です。

https://haokan.baidu.com
1.ビデオ検索
ホームページに入ると、検索ボックスが目に見えます。

検索ボタンをクリックするとキーワード(ps.ここでテストします。よく見てください。😋)一致したビデオを見ると、要求データを分析するために鞄をつかむことが必要です。
トラッキングツールについては、サードパーティツール(FiddlerまたはBurpsuitなど)を選択することができ、もちろん、ブラウザが備えるデバッグツール(ブラウザでF 12を押すと開くことができる)を選択することもできる。
ここで後者を選択しました。F 12デバッグツールを開けて、ネットワークを選択します。

検索ボタンをクリックした後、対応するネットワーク要求が下のツールボックスに表示されます。

簡単な検索によって、対応する検索要求(赤枠の表示部分)を容易に見つけることができます。

https://haokan.baidu.com/videoui/page/search?query=kimol 666
この要求をレクェスライブラリによってシミュレーションして、動画検索の機能を実現することができる。

import requests
res = requests.get('https://haokan.baidu.com/videoui/page/search?query=xxxxx')# xxxxx           
注:ここでは要求ヘッドヘデスを使う必要はありませんが、一概には言えません。要求先が必要かどうかは具体的なウェブサイトによって分析します。
あなたは見間違えていません。2行のコードだけで動画サイトの検索機能を実現しました。ある時、爬虫類はこんなに簡単です。😉!
要求を得た後、この要求から戻ったデータを分析します。同様にF 12デバッグツールで右側の応答をクリックすると、要求の応答が見られます。

ここで戻ってきたのはHTML形式のデータです。私たちはREライブラリやbs 4ライブラリなどを通じて必要なデータを抽出してもいいです。これでビデオ検索についての分析はほぼ完了しました。
しかし!注意深い仲間は発見することができて、私達は今検索結果を得ることができて、しかしページを選ぶ方法がありません。そうですか?どうすればいいですか?
同様に、私達は引き続きカバンをつかんで分析してもいいじゃないですか?やはり、マウスを落とした後に私達は新しい要求を得ました。

その要求アドレスは以下のようになります。

https://haokan.baidu.com/videoui/page/search?pn=2&rn=10&_format=json&tab=video&query=kimol 666
お願いが多くなりました。format、tabなどのパラメータを返してもらうフォーマットもJSON形式になっています。欲しいデータを抽出しやすくなりました)。簡単なテストによって、これらのパラメータはそれぞれ表していることが分かります。
パラメータ
説明
pn
要求のページ番号
rn
要求毎に返されるデータ量
_。フォーマット
戻りを要求するデータフォーマット
タb
要求されたラベルの種類
では、対応するコードを以下に変更することができます。

import requests
page = 1
keyword = 'xxxxx' # xxxxx       
url = 'https://haokan.baidu.com/videoui/page/search?pn=%d&rn=10&_format=json&tab=video&query=%s'%(page,keyword)
res = requests.get(url)
data = res.json()
これでビデオ検索部分の分析が一段落しました。
2.ビデオのダウンロード
ビデオのダウンロードのアイデアもはっきりしています。動画を再生する画面に入って、該当ビデオの元のファイルアドレスを見つけたらいいです。
手を小さくして、ビデオの再生インターフェースに入りました。そのURLはとても規則的です。vidのパラメータを通して対応するビデオを指しています。

右クリック動画再生ページのソースコードを確認します。(または右クリック動画で要素を確認してもいいです。)ビデオ再生のsrcを見つけられます。その対応する正規表現は以下の通りです。

p = '<video class="video" src=(.*?)>'
ビデオの元のファイルアドレスを解析する関数を定義できます。

def get_videoUrl(vid):
 '''
              
 '''
 res = requests.get('https://haokan.baidu.com/v?vid=%s'%vid)
 html = res.text
 videoUrl = re.findall('<video class="video" src=(.*?)>',html)[0]
 return videoUrl
ビデオのidパラメータを入力すると、ビデオの本当のファイルアドレスに戻ります。ビデオの住所ができたら、ビデオをダウンロードするのは手当たり次第です。

def download_video(vid):
 '''
       
 '''
 savePath = 'xxxxx.mp4' #         
 videoUrl = get_videoUrl(vid) #          
 res = requests.get(videoUrl)
 with open(savePath,'wb') as f:
 f.write(res.content)
これで、キーワードによって関連ビデオを検索できます。そしてビデオを現地にダウンロードできます。これはつまり、今回の動画ダウンロードについての爬虫類の紹介が終わりました。残りは自分の実際の需要に応じてコードを包装すればいいです。
二、私のコード
ここで自分のコードを提供します。参考までに。

# =============================================================================
#     _v0.1
# =============================================================================
import re
import os
import time
import queue
import requests
import threading
import pandas as pd

class Haokan:
 def __init__(self):
 self.url = 'https://haokan.baidu.com/videoui/page/search?pn=%d&rn=20&_format=json&tab=video&query=%s'
 self.headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0',
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
  'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
  'Connection': 'keep-alive',
  'Upgrade-Insecure-Requests': '1',
  'TE': 'Trailers',
 }
 self.savaPath = './videos' #       
 
 def get_info(self,keywords,page):
 '''
      ,        
 '''
 self.result = [] #       
 for p in range(1,page+1):
  res = requests.get(self.url%(p,keywords),headers=self.headers)
  data = res.json()['data']['response']
  videos = data['list']
  self.result.extend(videos)
  print('" %d "    !'%(p+1))
 self.result = pd.DataFrame(self.result)
 self.result.to_excel('%s.xlsx'%keywords,index=False)
 #     ,         
 self.url_queue = queue.Queue() 
 for vid,url in zip(self.result['vid'],self.result['url']):
  self.url_queue.put((vid,url))
 
 def get_videoUrl(self,url):
 '''
              
 '''
 res = requests.get(url,headers=self.headers)
 html = res.text
 videoUrl = re.findall('<video class="video" src=(.*?)>',html)[0]
 return videoUrl
 
 def download_video(self,videoId,videoUrl):
 '''
       
 '''
 #               
 if not os.path.exists(self.savaPath):
  os.mkdir(self.savaPath)
 res = requests.get(videoUrl,headers=self.headers)
 with open('%s/%s.mp4'%(self.savaPath,videoId),'wb') as f:
  f.write(res.content)
  
 def run(self):
 while not self.url_queue.empty():
  t_s = time.time()
  vid,url = self.url_queue.get()
  try:
  video_url = self.get_videoUrl(url)
  self.download_video(vid,video_url)
  except:
  print('"%s.mp4"    !'%vid)
  continue
  t_e = time.time()
  print('"%s.mp4"    !(  %.2fs)'%(vid,t_e-t_s))
  
if __name__ == "__main__":
 keywords = '  A '
 page = 1 #     ,  20   
 t_s = time.time()
 haokan = Haokan()
 haokan.get_info(keywords,page)
 N_thread = 3 #    
 thread_list = []
 for i in range(N_thread):
 thread_list.append(threading.Thread(target=haokan.run))
 for t in thread_list:
 t.start()
 for t in thread_list:
 t.join()
 t_e = time.time()
 print('    !(  %.2fs)'%(t_e-t_s))
 
コードを実行して、しきりにすべて私の碗の中に来たことが見えます。😍~

最後に書く
今日分かち合うビデオのダウンロードは最も基礎的なものと言えます。優しいおばあさんのように、優しい目と笑顔を持っています。煩雑な反登山機構はありません。(headersさえ検証しません。)データの戻り方もとても友好的で、映像のフォーマットもとても優しいです。
彼女と一緒にいると信じています。爬虫類の第一歩を学びましょう。今後もIP検証、パラメータ検証、検証コード、行動検出、瑞数システムなど多くのアンロードテストに直面するとしても、ビデオフォーマットの変換などのチャレンジに対応する必要があるかもしれません。
でも、キモル君がずっとそばにいることを覚えてください。
最後に、たくさんの本を読んでくださってありがとうございます。また会いましょう。
以上はpythonでビデオのダウンロード器の詳しい内容を作って、更にpythonに関してビデオのダウンロード器の資料を作って私達のその他の関連している文章に注意して下さい!