ユーチューブビデオをクロールのpythonは非中国の自動翻訳をマルチスレッド化

 

 

免責事項:私はすべての記事は、ブログの庭に作られて書いた、私は他のコピーを見て、過去にも書き込みにも、ソース、自分の透かしが付いて直接貼り付けます。本当に私は言いませんでした。

はじめに:いくつかの時間前に、いくつかの登山ビデオプロジェクトを行い、コードが書かれている、ここでは再びそれを再解析するために書面です。Moは犯罪を取ることは悪い場所を持っている:)

環境:python2.7 + win10

 

私は自分自身で開始、インターネットアクセスユーチューブ必要性科学、解決についてお話しましょう、それは最高のグローバルプロキシです。

[OK]を、今、最初に観察するためにサイトを開きます

 

 

 サイトは非常に清潔で快適で、行うには、この時間は、あなたは非常に良いを分類することができますので、英語で、一般家庭用ビデオです入力中国の検索結果は、それが海外にある場合は、キーワードに関連する動画をベースにしたもの検索を登ることです。

中国をテストするためにここで最初の、「」面白い「」を入力して、ビデオの多くを見つけ、あなたはまた、状況に応じてフィルタリングすることができ、YouTubeの動画へのリンクは非常に定期的に、このすべてhttps://www.youtube.com/watch?v=唯一のV値の背後にあるv_OVBHGwOaUは、ここではそれがIDと呼ばれ、同じではありません。

 

 

[OK]を、これらのビデオのリンクが内側にあるかどうかを確認するために、ページのソースコードを表示する最も簡単なスタートで始まり、私は見つけるために私の24kの単一犬の目を拡大しました。この動画の<script>タグの内側にあるすべてのを見ました。

 

 

 ケースであること、それがマッチする正規表現を指示することを

"url":"/watch\?v=(.*?)","webPageType"

これは、IDを一致させることでしょう。しかし、大丈夫以来のこと、多くの場合、仕事、フリップビデオは、AJAX要求に基づいて、この方法は、内部情報のソースは、常にデータの最初のページでないことが観察されていることを最初のページのビデオのみ、2ページ目らしいですこのように、我々はAJAXリクエストを分析する必要があり、私は、Googleのブラウザ、オープン開発ツール、ネットワーク、タスクパッケージを使用するようにしたいです。

マウスがプルダウンされている、それが自動的にポストの要求を要求します、ビデオメッセージを見が返されます。

 

 そう遠くないの勝利から、ここで見ることがうれしいです。しかし、ヘッダーおよびポストパラメータで見てみましょうはWTFに読み、その後、送られました。

 

私はこれらの暗号化パラメータが生成されたものと同様に、それはのステップ解析によるステップを持っているでしょう、それは過去のデータで構成されているため、相互作用の終了前と後に、それはフロントで生産されている必要があり、マークされて置くのPentiumで一万匹のアルパカ、 、最終的には。私は、分析のために出てきませんでした。最初のビューでは、次のjsファイルのjsパラメータは実際にかかわらず、内部で生成される苦しみます。TMD書き込みが複雑すぎます。限られた容量は、解決することはできません。それはまだあきらめることです。確かに、そうでなければ、記事が表示されませんではありません。だから、私は本当にビデオに戻り、アドレスバー&ページ=結果に入る考えを持っていました。FMLハッハッハは、私は本当にについて非常に幸せでした。フロントページなのでと全く回すボタンがない、私はこれは本当に反転できるとは思いませんでした。

 

 これ以来、私が推測されている、そのアイデアは、フリップ、非常に明確である - あなたはバルクビデオのリンクを取得することができ、その後、このリンクから直接ダウンロードする方法の再思考の後に行く - 通常の試合 - ソースコードを入手。BaiduのGoogleは多くの方法を見つけ、だけでなく、APIの多くを見つけることながらので、[OK]それは不必要な重複を直接、ホイールを作成することを使用します。

githubのユーチューブ-DL上のオープンソースプロジェクトは、コマンドラインアプリケーションは、インストール後に、彼はこれですさがあります。

 

youtube-dl -F https://www.youtube.com/watch?v=_iupLGTX890

これは、あなたがidでそれをダウンロードすることができ、すべての情報のビデオフォーマットを直接分析することができます。それは非常に使いやすいツールです。

その中にコードを使用する方法、直接しかし、ライン上のCMDコマンドを呼び出します。私はいくつかのビデオは、私は、このメソッドを使用していないので、フルをダウンロードし、外国のウェブサイト上でかなり良いAPIが見つかりませんでした常にあり、一括ダウンロード時間をテストした後、それを発見しました。

私はそれを導入していないだろう、とそう直接コードに添付されますAPIを使用する方法をどのように見つけるか、我々は一目で確認。

私はどのような彼のタイトルを翻訳し、ファイルの保存、正常にダウンロードので、ここで私はキーワードが英語で入力した場合、その後、探し出すことで、結果は、すべて英語です。中国語に翻訳し、私が翻訳に行って、私たちは、Kingsoftので終わる、とあなたは公式のAPIを使用する場合、料金があるように思えます。私はちょうど彼を登るか、英語で提出されたページ、中国のリターン、ページの解析、定期的に試合にそれを翻訳しますので、私は、私は、ページを登ってまっすぐつもりはありません。ちょっとちょっとちょっとそう。

[OK]をクリックします。コード今それを言って。

 

コードをコピー

# -*-coding:utf-8-*-
# author : Corleone
from bs4 import BeautifulSoup
import lxml
import Queue
import requests
import re,os,sys,random
import threading
import logging
import json,hashlib,urllib
from requests.exceptions import ConnectTimeout,ConnectionError,ReadTimeout,SSLError,MissingSchema,ChunkedEncodingError
import random

reload(sys)
sys.setdefaultencoding('gbk')

# 日志模块
logger = logging.getLogger("AppName")
formatter = logging.Formatter('%(asctime)s %(levelname)-5s: %(message)s')
console_handler = logging.StreamHandler(sys.stdout)
console_handler.formatter = formatter
logger.addHandler(console_handler)
logger.setLevel(logging.INFO)

q = Queue.Queue()   # url队列
page_q = Queue.Queue()  # 页面

def downlaod(q,x,path):
    urlhash = "https://weibomiaopai.com/"
    try:
        html = requests.get(urlhash).text
    except SSLError:
        logger.info(u"网络不稳定 正在重试")
        html = requests.get(urlhash).text
    reg = re.compile(r'var hash="(.*?)"', re.S)
    result = reg.findall(html)
    hash_v = result[0]
    while True:
        data = q.get()
        url, name = data[0], data[1].strip().replace("|", "")
        file = os.path.join(path, '%s' + ".mp4") % name
        api = "https://steakovercooked.com/api/video/?cached&hash=" + hash_v + "&video=" + url
        api2 = "https://helloacm.com/api/video/?cached&hash=" + hash_v + "&video=" + url
        try:
            res = requests.get(api)
            result = json.loads(res.text)
        except (ValueError,SSLError):
            try:
                res = requests.get(api2)
                result = json.loads(res.text)
            except (ValueError,SSLError):
                q.task_done()
                return False
        vurl = result['url']
        logger.info(u"正在下载:%s" %name)
        try:
            r = requests.get(vurl)
        except SSLError:
            r = requests.get(vurl)
        except MissingSchema:
            q.task_done()
            continue
        try:
            with open(file,'wb') as f:
                f.write(r.content)
        except IOError:
            name = u'好开心么么哒 %s' % random.randint(1,9999)
            file = os.path.join(path, '%s' + ".mp4") % name
            with open(file,'wb') as f:
                f.write(r.content)
        logger.info(u"下载完成:%s" %name)
        q.task_done()

def get_page(keyword,page_q):
    while True:
        headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'
        }
        page = page_q.get()
        url = "https://www.youtube.com/results?sp=EgIIAg%253D%253D&search_query=" + keyword + "&page=" + str(page)
        try:
            html = requests.get(url, headers=headers).text
        except (ConnectTimeout,ConnectionError):
            print u"不能访问youtube 检查是否已翻墙"
            os._exit(0)
        reg = re.compile(r'"url":"/watch\?v=(.*?)","webPageType"', re.S)
        result = reg.findall(html)
        logger.info(u"第 %s 页" % page)
        for x in result:
            vurl = "https://www.youtube.com/watch?v=" + x
            try:
                res = requests.get(vurl).text
            except (ConnectionError,ChunkedEncodingError):
                logger.info(u"网络不稳定 正在重试")
                try:
                    res = requests.get(vurl).text
                except SSLError:
                    continue
            reg2 = re.compile(r"<title>(.*?)YouTube",re.S)
            name = reg2.findall(res)[0].replace("-","")
            if u'\u4e00' <= keyword <= u'\u9fff':
                q.put([vurl, name])
            else:
                # 调用金山词霸
                logger.info(u"正在翻译")
                url_js = "http://www.iciba.com/" + name
                html2 = requests.get(url_js).text
                soup = BeautifulSoup(html2, "lxml")
                try:
                    res2 = soup.select('.clearfix')[0].get_text()
                    title = res2.split("\n")[2]
                except IndexError:
                    title = u'好开心么么哒 %s' % random.randint(1, 9999)
                q.put([vurl, title])
        page_q.task_done()


def main():
    # 使用帮助
    keyword = raw_input(u"请输入关键字:").decode("gbk")
    threads = int(raw_input(u"请输入线程数量(建议1-10): "))
    # 判断目录
    path = 'D:\youtube\%s' % keyword
    if os.path.exists(path) == False:
        os.makedirs(path)
    # 解析网页
    logger.info(u"开始解析网页")
    for page in range(1,26):
        page_q.put(page)
    for y in range(threads):
        t = threading.Thread(target=get_page,args=(keyword,page_q))
        t.setDaemon(True)
        t.start()
    page_q.join()
    logger.info(u"共 %s 视频" % q.qsize())
    # 多线程下载
    logger.info(u"开始下载视频")
    for x in range(threads):
        t = threading.Thread(target=downlaod,args=(q,x,path))
        t.setDaemon(True)
        t.start()
    q.join()
    logger.info(u"全部视频下载完成!")

main()

コードをコピー

 

、あなた自身を変更してください実行するLinux上の場合はここで言って、私はすべてのGBKをコードする全てのwin10でした。マルチスレッドのダウンロード、デフォルトのダウンロードディレクトリDは:\ユーチューブは、ビデオ内のキーワードに基づいてサブディレクトリを作成するには、内側にあります。私はスクリーン内のコードを使用しますがちなみに、更新のみの1日以内に登ります。毎日再びそれを登ります。

テストします。ダウンロード速度は、それは時間のテストで、ネットワークが良くありません、私は例外をキャッチしていないいくつかがあるかもしれません。私はFQサーバーの速度もOKです探しすることができます。

 

 

[OK]をここで記事全体は、以上ですほとんど時間の書き込み記事を取得します。やることは容易ではありません: - 

私のgithubのアドレスhttps://github.com/binglansky/spider

公開された115元の記事 ウォン称賛41 ビュー60000 +

おすすめ

転載: blog.csdn.net/pangzhaowen/article/details/104230623