您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

python多线程爬取youtube视频,外面的世界很精彩

时间:2019-08-21 09:58:56  来源:  作者:

开发环境:

  • Python/ target=_blank class=infotextkey>Python2.7 + win10

开始先说一下,访问YouTube需要那啥的,请自行解决,最好是全局代理。

python多线程爬取youtube视频,外面的世界很精彩

 

实现代码:

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
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
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 检查是否已FQ"
 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()


Tags:python youtube   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
开发环境: python2.7 + win10开始先说一下,访问youtube需要那啥的,请自行解决,最好是全局代理。 实现代码:from bs4 import BeautifulSoupimport lxmlimport Queueimport request...【详细内容】
2019-08-21  Tags: python youtube  点击:(563)  评论:(0)  加入收藏
▌简易百科推荐
大家好,我是皮皮。一、前言前几天在小小明大佬的Python交流群中遇到一个粉丝问了一个使用Python实现数理统计的实战问题,觉得还挺有用的,这里拿出来跟大家一起分享下。Excel数...【详细内容】
2022-11-03  Python进阶学习交流  今日头条  Tags:Python   点击:(4)  评论:(0)  加入收藏
#安装数据库#根据数据用途选择MySQL\PostgreSQL\SQLite\MariaDB\MongoDB\clickhouse等数据库#本文以MySQL PostgreSQL 为例,其他类似。安装方法自行搜索,不在赘述。# -*- codi...【详细内容】
2022-11-01  Pgabc    Tags:Python   点击:(8)  评论:(0)  加入收藏
为什么叫猴子补丁?猴子补丁的这个叫法起源于Zope框架,大家在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerillapatch)”,后来guerilla就渐渐的...【详细内容】
2022-11-01  VT漫步  今日头条  Tags:Python   点击:(5)  评论:(0)  加入收藏
一、前言前几天在Python钻石交流群【心田有垢生荒草】问了一个Python网络爬虫的问题,下图是截图:代码初步看上去好像没啥问题,但是结果就是不对,地图上显示的结果和网络爬虫抓到...【详细内容】
2022-10-31  Python进阶者    Tags:Python   点击:(6)  评论:(0)  加入收藏
mport sysimport osfrom PyQt5 import QtWidgetsfrom PyQt5.QtGui import QIconimport xlrdimport datetimeimport timefrom openpyxl import Workbookfrom openpyxl.styles...【详细内容】
2022-10-26  张先生870707  今日头条  Tags:Python   点击:(14)  评论:(0)  加入收藏
学习目标 了解分类器的任务和数据样式 掌握如何用Pytorch实现一个分类器分类器任务和数据介绍 构造一个将不同图像进行分类的神经网络分类器, 对输入的图片进行判别并完成分...【详细内容】
2022-10-25  传智教育官方账号  今日头条  Tags:Pytorch实   点击:(11)  评论:(0)  加入收藏
Python作为时下最热门的编程语言之一,有许多库资源。这么多资源,有哪些是程序员必备的Python库呢?老K根据了自己和身边程序员同事及朋友的经验,结合了Github上的star数据,汇总出...【详细内容】
2022-10-25  老K玩代码  今日头条  Tags:Python库   点击:(18)  评论:(0)  加入收藏
参加数学建模比赛,需要明确的一点: 专业知识是一方面,不要单纯地以为把文章写好就能够拿奖; 软件的运用,文章的排版也很重要,排版美观,插图好看,讲事实摆道理通过仿真图,比如函数的拟...【详细内容】
2022-10-24  思铺学院    Tags:数学建模   点击:(1)  评论:(0)  加入收藏
案例需求:定义一个数字(1~10,随机产生),通过3次判断来猜出来数字 案例要求: 1.数字随机产生,范围1-10 2.有3次机会猜测数字,通过3层嵌套判断实现 3.每次猜不中,会提示大了或小了...【详细内容】
2022-10-24  念兮暮霞如烟    Tags:python   点击:(9)  评论:(0)  加入收藏
用python画不断增大的渐变色片状立体图形,源码解释如下:import turtle as t 调用turtle库import colorsys 调用颜色t.bgcolor("black") 设置背景颜色t.tracer(100) 设置追踪频...【详细内容】
2022-10-24   嘻呱嘻呱大又圆     Tags:python   点击:(11)  评论:(0)  加入收藏
站内最新
站内热门
站内头条