Pitón arrastrándose video de youtube multiproceso no chino de traducción automática

 

 

Exención de responsabilidad: Escribí todos los artículos se producen en el jardín blog, vi la otra copia y pega el pasado ni siquiera una fuente para escribir, dirigir mediante el correspondiente marca de agua. . . Realmente no he dicho.

Introducción: Hace algún tiempo qué algunos escalada proyecto de vídeo, código está escrito, que aquí está escrito a volver a analizar de nuevo. Mo tiene un mal lugar para ofenderse :)

Medio Ambiente: python2.7 + win10

 

Permítanme hablar sobre el inicio, el acceso a Internet youtube ciencia necesidad, resuelven por sí solos, es mejor aproximación global.

ok, ahora, en primer lugar abrir el sitio para observar

 

 

 El sitio es muy limpio y confortable, esta vez hay que hacer es subir los de búsqueda basado en palabras clave relacionadas con los vídeos, para que pueda clasificar una muy buena, si la entrada china resultados de búsqueda que son generalmente de vídeo doméstica, en Inglés, entonces es en el extranjero.

Aquí el primero en probar los chinos, introduzca '' divertido '', que se encuentra a cabo una gran cantidad de vídeo, también puede filtro de acuerdo con las condiciones, enlaces de vídeo de YouTube muy regular, todo esto https://www.youtube.com/watch?v= v_OVBHGwOaU, sólo por detrás del valor v no es lo mismo, que aquí se llama ID.

 

 

OK, se inicia con el inicio más fácil de ver el código fuente de la página para ver si estos enlaces de vídeo están en el interior, Ensanché ojos mi única 24k del perro para averiguar. . . Mirado en absoluto en este vídeo <script> dentro de la etiqueta.

 

 

 Siendo ese el caso, sería dirigir la expresión regular para que coincida

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

Esto se corresponde ID. Pero parece que sólo el vídeo de la primera página, la segunda página que se observa a menudo que este método no funciona, vídeo del tirón se basa en la solicitud Ajax, la fuente de información privilegiada es siempre la primera página de datos, bien que desde de esta manera, tenemos que analizar petición Ajax, me gustaría usar el navegador de Google, herramientas de desarrollo abierto, la red, el paquete de tarea.

Mouse ha sido derribado, solicitará automáticamente una solicitud posterior, se devuelve un vistazo al mensaje de vídeo.

 

 Me alegro de ver aquí, no muy lejos de la victoria. Pero, vamos a ver los encabezados y los parámetros de correos enviada, a continuación, leer en un wtf. . .

 

Diez mil alpacas en el Pentium, que ponen esos parámetros de cifrado están marcados, antes y después del final de la interacción, ya que está hecho de los datos del pasado, que debe haber sido producido en la parte delantera, en cuanto a lo que se produce, tendría análisis paso a paso de la , por fin. No he venido a cabo para el análisis. . . A primera vista próxima a sufrir parámetro de archivo js js verdad se generan en el interior, sin embargo. . . TMD escritura demasiado complicado. . . capacidad limitada, no se puede resolver. ¿Es para dar todavía. Por supuesto que no, de lo contrario no podrá ver el artículo. Por lo tanto, tenía una idea, que entran en la barra de dirección de & page = resultados, realmente volver al video. . . FML Ja ja ja, yo estaba realmente muy feliz. Debido a que la primera página y no hay botón de giro, no pensé que esto realmente puede voltear. . . jaja

 

 Dado que este se me ha adivinado, esa idea es muy clara, flip - obtener el código fuente - Partido regulares - usted puede conseguir mayor enlace de video, y luego ir después de la re-pensar en maneras de descargar directamente a través de este enlace . Así, mientras que Baidu Google para encontrar muchas formas, sino también encontrar una gran cantidad de API, bien que la duplicación innecesaria crear la rueda, directamente utilice eso.

Hay un proyecto de código abierto en github youtube-dl es una aplicación de línea de comandos, después de la instalación, que es esto.

 

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

Esto permite el análisis directo de todos los formatos de vídeo de información, a continuación, puede descargarlo por id. Es una herramienta muy fácil de usar.

Como utilizar el código dentro de ella, llamar directamente el comando cmd en la línea, sin embargo. Lo encontré después de la prueba, el tiempo de descarga por lotes, siempre hay un poco de vídeo no descarga el pleno, por lo que no hizo uso de este método, y se encontró un API bastante bueno en los sitios web extranjeros.

Como encontrar la manera de utilizar la API no me he presentado, y así se une directamente al código, vemos a simple vista.

Aquí, en que cuando entro en una palabra clave está en Inglés, a continuación, buscar a los resultados están en Inglés, por lo que he descargado correctamente, guarde el archivo a traducir lo que su título. Traducido al chino, y fui a la traducción, nos encontramos con Kingsoft, y si se utiliza la API oficial, parece que hay cargos. . No voy, voy directamente a subir a la página, así que voy a subir sus páginas o traducir, presentados en Inglés, chino retorno, análisis de páginas, partido regular de la misma. Así eh eh eh. .

ok. Habiendo dicho que ahora el código.

 

Copiar el código

# -*-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()

Copiar el código

 

Aquí decir, yo estaba win10 codificación gbk de todo, si el Linux en ejecución anterior, modifique su propia. Es de descarga multi-hilo, la descarga por defecto el directorio d: \ youtube continuación, cree un subdirectorio en función de las palabras clave en el vídeo se encuentran en el interior. Por cierto no utilizo el código dentro de cribado, sólo para subir el plazo de 1 día de actualización. Subir de nuevo todos los días.

Para probar. Las velocidades de descarga, es la prueba del tiempo, la red no es buena, puede haber algo que no he cogido una excepción. . . I puede estar buscando la velocidad del servidor FQ también está bien. .

 

 

bien aquí todo el artículo es más, obtener artículos de la escritura casi una hora. . No es fácil de hacer: - 

Mi dirección github https://github.com/binglansky/spider

Publicados 115 artículos originales · ganado elogios 41 · Vistas a 60000 +

Supongo que te gusta

Origin blog.csdn.net/pangzhaowen/article/details/104230623
Recomendado
Clasificación