如何使用Python预测机票价格

印度的机票价格基于供需关系浮动,很少受到监管机构的限制。因此它通常被认为是不可预测的,而动态定价机制更增添了人们的困惑。

我们的目的是建立一个机器学习模型,根据历史数据预测未来航班的价格,这些航班价格可以给客户或航空公司服务提供商作为参考价格。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install pandas
pip install numpy
pip install matplotlib
pip install seaborn
pip install scikit-learn

2.导入相关数据集

本文的数据集是 Data_Train.xlsx,首先看看训练集的格式:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')


flights = pd.read_excel('./Data_Train.xlsx')
flights.head()

可见训练集中的字段有航空公司(Airline)、日期(Date_of_Journey)、始发站(Source)、终点站(Destination)、路线(Route)、起飞时间(Dep_Time)、抵达时间(Arrival_Time)、历经时长(Duration)、总计停留站点个数(Total_Stops)、额外信息(Additional_Info),最后是机票价格(Price)。

与其相对的测试集,除了缺少价格字段之外,与训练集的其他所有字段均一致。

访问:https://pythondict.com/download/predict-ticket/

或在Python实用宝典后台回复:预测机票,下载完整数据源和代码。

3.探索性数据分析

3.1 清理缺失数据

看看所有字段的基本信息:

flights.info()

其他的非零值数量均为10683,只有路线和停靠站点数是10682,说明这两个字段缺少了一个值。

谨慎起见,我们删掉缺少数据的行:

# clearing the missing data
flights.dropna(inplace=True)
flights.info()

现在非零值达到一致数量,数据清理完毕。

3.2 航班公司分布特征

接下来看看航空公司的分布特征:

sns.countplot('Airline', data=flights)
plt.xticks(rotation=90)
plt.show()

前三名的航空公司分别是 IndiGo, Air India, JetAirways.

其中可能存在廉价航空公司。

3.3 再来看看始发地的分布

sns.countplot('Source',data=flights)
plt.xticks(rotation=90)
plt.show()

某些地区可能是冷门地区,存在冷门机票的可能性比较大。

3.4 停靠站点的数量分布

sns.countplot('Total_Stops',data=flights)
plt.xticks(rotation=90)
plt.show()

看来大部分航班在飞行途中只停靠一次或无停靠。

会不会某些停靠多的航班比较便宜?

3.5 有多少数据含有额外信息

plot=plt.figure()
sns.countplot('Additional_Info',data=flights)
plt.xticks(rotation=90)

大部分航班信息中都没有包含额外信息,除了部分航班信息有:不包含飞机餐、不包含免费托运。

这个信息挺重要的,是否不包含这两项服务的飞机机票比较便宜?

3.6 时间维度分析

首先转换时间格式:

flights['Date_of_Journey'] = pd.to_datetime(flights['Date_of_Journey'])
flights['Dep_Time'] = pd.to_datetime(flights['Dep_Time'],format='%H:%M:%S').dt.time

接下来,研究一下出发时间和价格的关系:

flights['weekday'] = flights[['Date_of_Journey']].apply(lambda x:x.dt.day_name())
sns.barplot('weekday','Price',data=flights)
plt.show()

大体上价格没有差别,说明这个特征是无效的。

那么月份和机票价格的关系呢?

flights["month"] = flights['Date_of_Journey'].map(lambda x: x.month_name())
sns.barplot('month','Price',data=flights)
plt.show()

没想到4月的机票价格均价只是其他月份的一半,看来4月份是印度的出行淡季吧。

起飞时间和价格的关系

flights['Dep_Time'] = flights['Dep_Time'].apply(lambda x:x.hour)
flights['Dep_Time'] = pd.to_numeric(flights['Dep_Time'])
sns.barplot('Dep_Time','Price',data=flights)
plot.show()

可以看到,红眼航班(半夜及早上)的机票比较便宜,这是符合我们的认知的。

3.7 清除无效特征

把那些和价格没有关联关系的字段直接去除掉:

flights.drop(['Route','Arrival_Time','Date_of_Journey'],axis=1,inplace=True)
flights.head()

4.模型训练

接下来,我们可以准备使用模型来预测机票价格了,不过,还需要对数据进行预处理和特征缩放。

4.1 数据预处理

将字符串变量使用数字替代:

from sklearn.preprocessing import LabelEncoder
var_mod = ['Airline','Source','Destination','Additional_Info','Total_Stops','weekday','month','Dep_Time']
le = LabelEncoder()
for i in var_mod:
    flights[i] = le.fit_transform(flights[i])
flights.head()

对每列数据进行特征缩放,提取自变量(x)和因变量(y):

flights.corr()
def outlier(df):
    for i in df.describe().columns:
        Q1=df.describe().at['25%',i]
        Q3=df.describe().at['75%',i]
        IQR= Q3-Q1
        LE=Q1-1.5*IQR
        UE=Q3+1.5*IQR
        df[i]=df[i].mask(df[i]<LE,LE)
        df[i]=df[i].mask(df[i]>UE,UE)
    return df
flights = outlier(flights)
x = flights.drop('Price',axis=1)
y = flights['Price']

划分测试集和训练集:

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=101)

4.2 模型训练及测试

使用随机森林进行模型训练:

from sklearn.ensemble import RandomForestRegressor
rfr=RandomForestRegressor(n_estimators=100)
rfr.fit(x_train,y_train)

在随机森林中,我们有一种根据数据的相关性来确定特征重要性的方法:

features=x.columns
importances = rfr.feature_importances_
indices = np.argsort(importances)
plt.figure(1)
plt.title('Feature Importances')
plt.barh(range(len(indices)), importances[indices], color='b', align='center')
plt.yticks(range(len(indices)), features[indices])
plt.xlabel('Relative Importance')

可以看到,Duration(飞行时长)是影响最大的因子。

对划分的测试集进行预测,得到结果:

predictions=rfr.predict(x_test)
plt.scatter(y_test,predictions)
plt.show()

这样看不是很直观,接下来我们要数字化地评价这个模型。

4.3 模型评价

sklearn 提供了非常方便的函数来评价模型,那就是 metrics :

from sklearn import metrics
print('MAE:', metrics.mean_absolute_error(y_test, predictions))
print('MSE:', metrics.mean_squared_error(y_test, predictions))
print('RMSE:', np.sqrt(metrics.mean_squared_error(y_test, predictions)))
print('r2_score:', (metrics.r2_score(y_test, predictions)))
MAE: 1453.9350628905618
MSE: 4506308.3645551
RMSE: 2122.806718605135
r2_score: 0.7532074710409375

这4个值中你可以只关注R2_score,r2越接近1说明模型效果越好,这个模型的分数是0.75,算是很不错的模型了。

看看其残差直方图是否符合正态分布:

sns.distplot((y_test-predictions),bins=50)
plt.show()

不错,多数预测结果和真实值都在-1000到1000的范围内,算是可以接受的结果。其残差直方图也基本符合正态分布,说明模型是有效果的。

部分译自 https://www.kaggle.com/harikrishna9/how-to-predict-flight-ticket-price/notebook,有较多的增删。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

推荐一款小众且好用的 Python 爬虫库—RoboBrowser

1. 前言

今天推荐一款小众轻量级的爬虫库:RoboBrowser

RoboBrowser,Your friendly neighborhood web scraper!由纯 Python 编写,运行无需独立的浏览器,它不仅可以做爬虫,还可以实现 Web 端的自动化

项目地址:

https://github.com/jmcarp/robobrowser

2. 安装及用法

在实战之前,我们先安装依赖库及解析器

PS:官方推荐的解析器是 「lxml」

# 安装依赖
pip3 install robobrowser

# lxml解析器(官方推荐)
pip3 install lxml

RoboBrowser 常见的 2 个功能为:

  • 模拟表单 Form 提交

  • 网页数据爬取

使用 RoboBrowser 进行网页数据爬取,常见的 3 个方法如下:

  • find

    查询当前页面满足条件的第一个元素

  • find_all

    查询当前页面拥有共同属性的一个列表元素

  • select

    通过 CSS 选择器,查询页面,返回一个元素列表

需要指出的是,RoboBrowser 依赖于 BS4,所以它的使用方法和 BS4 类似

更多功能可以参考:

https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

3. 实战一下

我们以「 百度搜索及爬取搜索结果列表 」为例

3-1  打开目标网站

首先,我们实例化一个 RoboBrowser 对象

from time import sleep

from robobrowser import RoboBrowser

home_url = 'https://baidu.com'

#  parser: 解析器,HTML parser; used by BeautifulSoup
#  官方推荐:lxml
rb = RoboBrowser(history=True, parser='lxml')

# 打开目标网站
rb.open(home_url)

然后,使用 RoboBrowser 实例对象中的 open() 方法打开目标网站

3-2  自动化表单提交

首先,使用 RoboBrowser 实例对象获取网页中的表单 Form

然后,通过为表单中的输入框赋值模拟输入操作

最后,使用 submit_form() 方法进行表单提交,模拟一次搜索操作

# 获取表单对象
bd_form = rb.get_form()

print(bd_form)

bd_form['wd'].value = "AirPython"

# 提交表单,模拟一次搜索
rb.submit_form(bd_form)

3-3  数据爬取

分析搜索页面的网页结构,利用 RoboBrowser 中的 select() 方法匹配出所有的搜索列表元素

遍历搜索列表元素,使用 find() 方法查询出每一项的标题及 href 链接地址

# 查看结果
result_elements = rb.select(".result")

# 搜索结果
search_result = []

# 第一项的链接地址
first_href = ''

for index, element in enumerate(result_elements):
    title = element.find("a").text
    href = element.find("a")['href']
    search_result.append(title)

    if index == 0:
        first_href = element.find("a")
        print('第一项地址为:', href)

print(search_result)

最后,使用 RoboBrowser 中的 follow_link() 方法模拟一下「点击链接,查看网页详情」的操作

# 跳转到第一个链接
rb.follow_link(first_href)

# 获取历史
print(rb.url)

需要注意的是,follow_link() 方法的参数为带有 href 值的 a 标签

4. 最后

文中结合百度搜索实例,使用 RoboBrowser 完成了一次自动化及爬虫操作

相比 Selenium、Helium 等,RoboBrowser 更轻量级,不依赖独立的浏览器驱动

如果想处理一些简单的爬虫或 Web 自动化,RoboBrowser 完全够用;但是面对一些复杂的自动化场景,更建议使用 Selenium、Pyppeteer、Helium 等

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

jinja2+yagmail 批量定制化渲染发送元旦祝福邮件

上一篇关于邮件的自动发送教程中,我们讲解了如何使用yagmail进行简单的邮件发送。

现实生活中,如果只是发邮件给自己,像上一篇文章那样简陋的格式是可以接受的,但若要针对每个人进行邮件的定制化,群发给公司客户、内部员工、亲戚朋友,则需更加高级的邮件发送方式。

我们可以通过HTML制作一封精美的元旦祝福邮件,但是邮件的内容——比如姓名、祝福语等应该怎样动态渲染呢?答案是jinja2.

jinja2 是一个Python 的模板引擎,使用jinja2,我们能够在邮件HTML中设定占位符,在Python发送邮件的时候,将指定文本渲染到该占位符中,实现动态渲染的目的。

比如举一个jinja2的简单例子:

from jinja2 import Template

name = 'Peter'
age = 34

tm = Template("My name is {{ name }} and I am {{ age }}")
msg = tm.render(name=name, age=age)

print(msg)

使用 {{}} 圈起来的是占位符,称之为模板字符串。模板字符串呈现两个变量:名称和年龄,在这个例子中,硬编码了name和age的值传入模板,得到输出:

My name is Peter and I am 34

在本篇文章中,我将教大家如何通过Html及Python+jinja2给你的好友们定制元旦祝福邮件。

本文所有素材及源代码均可以在此下载:
https://pythondict.com/download/python-new-year-mail/

或Python实用宝典公众号回复:元旦邮件 直接拿到网盘下载链接。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

此外,推荐大家用VSCode编辑器,因为它实在是太方便了:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

pip install jinja2
pip install yagmail

2.编写HTML

将需要发送的邮件模板的HTML编写好。并将占位符变量提前写入HTML中。由于我的HTML文件过大,这里就不完全展示了,只展示几个关键变量。

为简化教程的复杂度,并尽可能覆盖到知识点,这里我们使用4个变量:

1.LOGO图片(让你更好地理解图片是如何渲染到HTMl里并发邮件)
2.背景图片
3.祝福对象
4.祝福语言

首先,是图片变量的配置:

<tr>
    <td valign="left" width="50%" class="logo sub-gd" style="padding-left:0;">
        <h1>
            <img src="data:image/png;base64, {{pythondict_img}}">
        </h1>
    </td>
</tr>

由于我们需要发送html形的邮件,因此像代码这样将图片转码为base64再发送是最方便的。

其中,base64部分用jinja2语法 {{}} 包起来,中间就是变量名,一会render渲染的时候就会将base64渲染进来。

背景图片的配置比较特殊,使用 base64 渲染的话QQ邮箱会自动过滤为#号,因此必须使用url的形式:

<td valign="middle"style="background-image: url({{backgroud}});">

其次是祝福对象和祝福语言的配置:

<h2>
    {{name}}
    <br>
    祝您2021年元旦快乐
</h2>
<p>
    {{bless}}.
</p>

使用 {{}} 包裹变量,name是祝福的对象,bless是祝福语。这里简化了代码,还有许多样式要配置详细的大家可以看源代码中的 index_detail.html.

对了,我们源代码里包括两份html,一份是 index_detail.html 是未经过压缩的源代码,还有一份是 index.html,是被压缩过的源代码。

为什么要压缩HTML呢?因为邮箱客户端在解析HTML的时候,有可能会将换行符解析成<br>,因此压缩HTML不保留任何空格和换行符是最保险的做法。

详细的HTML代码,大家可以看源代码中的 index_detail.html.

3.Python代码

发送邮件的方法,我们在Python 自动发送邮件详细教程中已经详细地讲过了:

class Mail:
    """
    邮件相关类
    """

    def log(self, content):
        now_time = time.strftime(
            "%Y-%m-%d %H:%M:%S", time.localtime()
        )
        print(f'{now_time}: {content}')

    def sendmail(self, html, title, receivers):
        """
        发送邮件
        Arguments:
            html {str} -- 邮件正文(html)
            title {str} -- 邮件标题
            receivers {list} -- 邮件接收者,数组
        """

        yag = yagmail.SMTP(
            host='您的邮箱SMTPHOST', user='您的邮箱',
            password='您的邮箱密码', smtp_ssl=True
        )

        yag.send(receivers, title, html)
        self.log("邮件发送成功")

此外,为了渲染图片,需要将图片转化为base64,这个方法是这样的:

def get_image_base64(path):
    """
    获得图片的base64编码

    Args:
        path (str): 图片路径

    Returns:
        str: base64编码
    """
    import base64
    f = open(path, "rb")
    base64_data = base64.b64encode(f.read())
    f.close()
    return base64_data.decode("utf-8")

当然,最重要的地方是下面,需要针对每个人定制祝福语,我们可以采用字典的数据结构来保存数据:

bless_info = {
    "admin@pythondict.com": {
        "pythondict_img": get_image_base64("./images/pythondict.png"),
        "name": "实用宝典",
        "background": "https://背景图片.jpg",
        "bless": "愿所有的幸运与您不期而遇..",
        "title": "祝宝典哥明年粉丝破十万"
    },
    "test@qq.com": {
        "pythondict_img": get_image_base64("./images/pythondict.png"),
        "name": "老王",
        "background": "https://背景图片.jpg",
        "bless": "祝您女儿明年考研顺顺利利,全家幸福安康..",
        "title": "老王,祝您元旦快乐!"
    },
}

可以看到 bless_info 字典里的每个key是发送对象的邮箱,而这些 key 对应的value 中就有需要渲染到邮件的变量: pythondict_img, name, background 及 祝福语bless. 最后一个变量title,是用于指定邮件标题的。

这样,渲染+发送邮件做起来就方便多了:

tm = Template(open('./index.html', encoding="utf-8").read())
for mail in bless_info:
    msg = tm.render(bless_info[mail])
    Mail().sendmail(html=msg, title=bless_info[mail]["title"], receivers=[mail])

Mail().sendmail():是我们的发送邮件函数,应该不必多说。

bless_info[mail]:是需要渲染的变量,这里面的变量少了可不行,多了没关系。

bless_info[mail][“title”]:就是刚刚在字典里指定的最后一个变量 title

由于 sendmail() 函数里的 receivers 是支持多人的,因此这里需要以数组的形式传入函数。

不过这里还有一个有趣的改进,如果你需要用同一个模板邮件发送给同一家人,你可以这么做:

bless_info = {
    ...,
    "test1@qq.com,test2@qq.com,test3@qq.com": {
        "pythondict_img": get_image_base64("./images/pythondict.png"),
        "name": "老王一家",
        "background": "https://背景图片.jpg",
        "bless": "祝王小女明年考研顺顺利利,老王全家幸福安康,吉祥如意..",
        "title": "老王一家,祝你们元旦快乐!"
    },
}

tm = Template(open('./index.html', encoding="utf-8").read())
for mail in bless_info:
    msg = tm.render(bless_info[mail])
    Mail().sendmail(html=msg, title=bless_info[mail]["title"], receivers=mail.split(","))

没错,只需要在key里将这一家人的邮箱用逗号分隔开,然后receivers里改为mail.split(“,”),你就能实现同一份邮件发给一家人的功能,是不是非常方便?

大家可以自己找喜欢的背景图片,也可以用我在代码里已给大家提供的图片。想要去除LOGO的话,直接将pythondict_img设为空,或者设为你自己的卡片即可。

在源代码目录下​运行代码:

python mail.py

即可成功发送邮件,快打开编辑器试一下吧(记得先测试)!

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

TheFuck—超实用的控制台命令纠正工具

The Fuck 是一款功能强大的、Python编写的应用程序,其灵感来自@liamosaur推文,可用于纠正控制台命令中的错误,如下图所示:

更多示例如:

自动识别没有权限,在命令前面添加 sudo:

➜ apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

➜ fuck
sudo apt-get install vim [enter/↑/↓/ctrl+c]
[sudo] password for nvbn:
Reading package lists... Done
...

识别到没有推送到远程分支,自动追加:

➜ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
 
    git push --set-upstream origin master

➜ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

识别到拼写错误:

➜ puthon
No command 'puthon' found, did you mean:
 Command 'python' from package 'python-minimal' (main)
 Command 'python' from package 'python3' (main)
zsh: command not found: puthon

➜ fuck
python [enter/↑/↓/ctrl+c]
Python 3.4.2 (default, Oct  8 2014, 13:08:17)
...

而且,如果你不担心fuck修正的结果是错误的,你可以禁用require_confirmation 选项,让fuck自动运行更正的命令:

➜ apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

➜ fuck
sudo apt-get install vim
[sudo] password for nvbn:
Reading package lists... Done
...

在开发机上可以这么做,在生产机器上最好是谨慎一点,不推荐这么做。

1.安装

在OS X上,可以通过Homebrew(或在Linux上通过Linuxbrew)安装The Fuck

brew install thefuck

在Ubuntu / Mint上,使用以下命令安装The Fuck

sudo apt update
sudo apt install python3-dev python3-pip python3-setuptools
sudo pip3 install thefuck

在FreeBSD上,使用以下命令安装The Fuck

pkg install thefuck

在其他系统上, 使用pip安装The Fuck

pip install thefuck

2.配置

接下来需要把这个命令写入到 .bash_profile, .bashrc.zshrc 等启动脚本中。

根据你的终端类型,运行相应的命令即可:

Bash

chcp.com 65001 
eval "$(thefuck --alias)"

其中 chcp.com 65001 只有在windows环境下才需要运行。

Zsh:

eval "$(thefuck --alias)"

其他的可见:

https://github.com/nvbn/thefuck/wiki/Shell-aliases

3.原理

其实TheFuck的原理就是规则匹配(正则表达式),如果找到匹配规则的命令,则创建一个命令给用户选择或直接运行。

默认情况下的规则有:

  • cat_dir – 当你尝试cat目录的时候,用ls替换cat;
  • cd_correction – 拼写检查和纠正失败的cd命令;
  • cd_mkdir – 在进入目录之前创建目录;
  • cd_parent – 更改 cd..cd ..
  • dry – 修复类似的重复问题:git git push
  • fix_alt_space – 用空格字符代替Alt + Space;
  • git_checkout–修改分支名称或创建新分支;
  • … ….

等等,具体可以在官方文档中找到:
https://github.com/nvbn/thefuck

4. 创建自己的修复规则

要添加自己的规则,在~/.config/thefuck/rules 创建一个文件名为your-rule-name.py 的规则文件,必须包含两个函数:

match(command: Command) -> bool
get_new_command(command: Command) -> str | list[str]

下面是简单的 sudo 规则示例:

def match(command):
    return ('permission denied' in command.output.lower()
            or 'EACCES' in command.output)


def get_new_command(command):
    return 'sudo {}'.format(command.script)

# Optional:
enabled_by_default = True

def side_effect(command, fixed_command):
    subprocess.call('chmod 777 .', shell=True)

priority = 1000  # Lower first, default is 1000

requires_output = True

如果命令运行结果出现 permission denied 或者 EACCES,则执行 sudo xxx.

此外,还可以配置side_effect,如果你配置了enabled_by_default = True,side_effect函数内的操作将会被执行,本例中是对当前目录下的文件夹执行赋权操作: chmod 777 .​​

大家可以动手试试自己配一个修复命令。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

100-Days-Of-ML-Code—机器学习100天

[download_code]

下面截取前4天的内容,其他的请在网盘内下载。

机器学习100天

英文原版请移步Avik-Jain。数据在这里

翻译前请先阅读规范。常见问题解答见FAQ

目录

数据预处理 | 第1天

数据预处理实现

简单线性回归 | 第2天

简单线性回归实现

多元线性回归 | 第3天

多元线性回归实现

逻辑回归 | 第4天

我擦(TheFuck)—纠正您的控制台命令

[download_code] Fuck是一款功能强大的 应用程序,其灵感来自@liamosaur推文,可纠正控制台命令中的错误。 更多示例:
➜ apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

➜ fuck
sudo apt-get install vim [enter/↑/↓/ctrl+c]
[sudo] password for nvbn:
Reading package lists... Done
...
➜ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master


➜ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...
➜ puthon
No command 'puthon' found, did you mean:
 Command 'python' from package 'python-minimal' (main)
 Command 'python' from package 'python3' (main)
zsh: command not found: puthon

➜ fuck
python [enter/↑/↓/ctrl+c]
Python 3.4.2 (default, Oct  8 2014, 13:08:17)
...
➜ git brnch
git: 'brnch' is not a git command. See 'git --help'.

Did you mean this?
    branch

➜ fuck
git branch [enter/↑/↓/ctrl+c]
* master
➜ lein rpl
'rpl' is not a task. See 'lein help'.

Did you mean this?
         repl

➜ fuck
lein repl [enter/↑/↓/ctrl+c]
nREPL server started on port 54848 on host 127.0.0.1 - nrepl://127.0.0.1:54848
REPL-y 0.3.1
...

如果您不害怕盲目地运行已更正的命令, 则可以禁用require_confirmation 设置选项,让fuck自动帮您运行更正的命令:
➜ apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

➜ fuck
sudo apt-get install vim
[sudo] password for nvbn:
Reading package lists... Done
...

环境要求

  • python (3.4+)
  • pip
  • python-dev

安装

在OS X上,您可以通过Homebrew(或在Linux上通过Linuxbrew)安装The Fuck
brew install thefuck
在Ubuntu / Mint上,使用以下命令安装The Fuck
sudo apt update
sudo apt install python3-dev python3-pip python3-setuptools
sudo pip3 install thefuck
在FreeBSD上,使用以下命令安装The Fuck
pkg install thefuck
在Chrome操作系统上,使用chromebrew通过以下命令安装The Fuck
crew install thefuck
在其他系统上, 使用来安装The Fuckpip
pip install thefuck
或者,您可以使用OS软件包管理器(OS X,Ubuntu,Arch)。

配置

接下来需要把这个命令写入到 .bash_profile, .bashrc.zshrc 等启动脚本中。 根据你的终端类型,运行相应的命令即可: Bash
chcp.com 65001 
eval "$(thefuck --alias)"
其中 chcp.com 65001 只有在windows环境下才需要运行。 Zsh:
eval "$(thefuck --alias)"
其他的可见: https://github.com/nvbn/thefuck/wiki/Shell-aliases 要在不进行确认的情况下运行固定命令,请使用--yeah选项(或者-y简称,或者--hard如果您特别沮丧):
fuck --yeah
要递归修复命令直到成功,请使用以下-r选项:
fuck -r

更新中

pip3 install thefuck --upgrade
注意:别名功能在The Fuck的v1.34中已更改

这个怎么运作

Fuck尝试将前一个命令与规则匹配。如果找到匹配项,则使用匹配的规则创建一个新命令并执行。默认情况下启用以下规则:
  • adb_unknown_command–修复类似拼写错误的命令adb logcta
  • ag_literal-增加了-Qag建议的时候;
  • aws_cli–修复类似拼写错误的命令aws dynamdb scan
  • az_cli–修复类似拼写错误的命令az providers
  • cargo–运行cargo build代替cargo
  • cargo_no_command–修复错误命令,例如cargo buid
  • cat_dir-替换catls当您尝试cat目录;
  • cd_correction –拼写检查和纠正失败的cd命令;
  • cd_mkdir –在进入目录之前创建目录;
  • cd_parent–更改cd..cd ..
  • chmod_x –增加执行位;
  • choco_install –附加巧克力包装的通用后缀;
  • composer_not_command –修正了作曲家的命令名称;
  • cp_create_destination-创建一个新的目录当您尝试cpmv到一个不存在的一个
  • cp_omitting_directory-acp目录中添加;
  • cpp11-std=c++11g++或添加缺失clang++
  • dirty_untar–修复tar x了当前目录中未解压缩的命令;
  • dirty_unzip–修复unzip了在当前目录中解压缩的命令;
  • django_south_ghost--delete-ghost-migrations因鬼魂django向南迁移而增加失败;
  • django_south_merge–增加--merge了不一致的django南迁徙;
  • docker_login–执行docker login并重复上一个命令;
  • docker_not_command–修复了错误的docker命令,如docker tags
  • docker_image_being_used_by_container ‐在移除图像之前先移除使用图像的容器;
  • dry–修复类似的重复git git push
  • fab_command_not_found –修复拼写错误的结构命令;
  • fix_alt_space –用空格字符代替Alt + Space;
  • fix_file–打开您的错误文件$EDITOR
  • gem_unknown_command–修正错误的gem命令;
  • git_add–修复了“ pathspec’foo’与git已知的任何文件都不匹配。” ;
  • git_add_force-添加--forcegit add <pathspec>...当路径.gitignore’d;
  • git_bisect_usage-修复git bisect strtgit bisect gooodgit bisect rset,平分时等;
  • git_branch_delete–更改git branch -dgit branch -D
  • git_branch_delete_checked_out-变化git branch -dgit checkout master && git branch -D试图删除已签出分支的时候;
  • git_branch_exists– offer git branch -d foogit branch -D foogit checkout foo在创建已经存在的分支时;
  • git_branch_listgit branch list代替git branch并删除创建的分支;
  • git_checkout –修改分支名称或创建新分支;
  • git_clone_git_clone–替换git clone git clone ...git clone ...
  • git_commit_amendgit commit --amend先前提交后的报价;
  • git_commit_resetgit reset HEAD~先前提交后的报价;
  • git_diff_no_index–添加--no-index到以前git diff的未跟踪文件上;
  • git_diff_staged–添加--staged到前一个git diff具有意外输出;
  • git_fix_stash–修复git stash命令(拼写错误的子命令和missing save);
  • git_flag_after_filename –修复 fatal: bad flag '...' after filename
  • git_help_aliased–修复git help <alias>用别名命令替换的命令;
  • git_hook_bypass-增加--no-verify标志之前的git amgit commitgit push命令;
  • git_lfs_mistype–修正输入错误的git lfs <command>命令;
  • git_merge –将远程名称添加到分支名称;
  • git_merge_unrelated--allow-unrelated-histories必要时添加
  • git_not_command–修复错误的git命令,如git brnch;
  • git_pull–在执行上一个之前设置上游git pull
  • git_pull_clone –在仓库不存在时克隆而不是拉取;
  • git_pull_uncommitted_changes –在拉动之前隐藏更改,然后将其弹出;
  • git_push–添加--set-upstream origin $branch到以前的失败git push
  • git_push_different_branch_names –修复本地分支名称与远程分支名称不匹配时的推送;
  • git_push_pullgit pullpush被拒绝时运行;
  • git_push_without_commits–在创建git add .新项目时,如果您忘记并且仅创建一个初始提交;
  • git_rebase_no_changes–运行git rebase --skip而不是git rebase --continue没有更改时;
  • git_remote_delete–替换git remote delete remote_namegit remote remove remote_name
  • git_rm_local_modifications–添加-f--cached尝试添加到rm本地修改的文件;
  • git_rm_recursive-r尝试访问rm目录时添加;
  • git_rm_staged–添加-f--cached当您尝试对rm文件进行分阶段更改时
  • git_rebase_merge_dir–在进行重新设置基准时提供git rebase (--continue | --abort | --skip)或删除.git/rebase-merge目录;
  • git_remote_seturl_add-运行git remote addgit remote set_url不存在的遥控器上;
  • git_stash –在重新建立基础或转移分支之前存储本地修改;
  • git_stash_pop –在弹出存储区之前添加您的本地修改,然后重置;
  • git_tag_force-增加了--forcegit tag <tagname>当标签已经存在;
  • git_two_dashes–给诸如git commit -amend或的命令添加破折号git rebase -continue
  • go_run.go在编译/运行Go程序时附加扩展名;
  • go_unknown_command–修复错误的go命令,例如go bulid
  • gradle_no_task–修复未找到的gradle任务或模棱两可的任务;
  • gradle_wrapper–替换gradle./gradlew
  • grep_arguments_order–修复grep类似情况的参数顺序grep -lir . test
  • grep_recursive-r尝试grep目录时添加;
  • grunt_task_not_found–修复拼写错误的grunt命令;
  • gulp_not_task–修复拼写错误的gulp任务;
  • has_exists_script./在脚本/二进制文件存在时开始;
  • heroku_multiple_apps–添加--app <app>heroku类似命令heroku pg
  • heroku_not_command–修复错误的heroku命令,例如heroku log
  • history –尝试用历史记录中最相似的命令替换命令;
  • hostscli–试图解决hostscli用法问题;
  • ifconfig_device_not_found-修正错误的设备名称,如wlan0wlp2s0;
  • java.java在运行Java程序时删除扩展名;
  • javac.java编译Java文件时追加缺少的内容;
  • lein_not_task–修复错误的lein任务,例如lein rpl
  • long_form_help-改变-h--help时不支持缩写形式
  • ln_no_hard_link –在目录上捕获硬链接创建,建议符号链接;
  • ln_s_order–确定ln -s参数顺序;
  • ls_all-添加-Als时输出是空的;
  • ls_lah–添加-lahls
  • man –更改手册部分;
  • man_no_space–例如mandiff,修复无空格的man命令;
  • mercurial–修正错误的hg命令;
  • missing_space_before_subcommand–修复缺少空格的命令,如npminstall;
  • mkdir_p-p当您尝试创建没有父目录的目录时添加;
  • mvn_no_command–添加clean packagemvn
  • mvn_unknown_lifecycle_phase–修复拼写错误的生命周期阶段mvn
  • npm_missing_script–修复npm自定义脚本名称npm run-script <script>
  • npm_run_script–增加run-script自定义npm脚本的缺失;
  • npm_wrong_command–修复错误的npm命令,如npm urgrade;
  • no_command–修复错误的控制台命令,例如vom/vim
  • no_such_file–使用mvcp命令创建丢失的目录;
  • open–要么在http://传递给的地址之前添加地址,open要么创建一个新的文件或目录,然后将其传递给open
  • pip_install–通过在必要时pip install添加--user或添加前缀来解决命令的权限问题sudo
  • pip_unknown_command–修复错误的pip命令,例如pip instatl/pip install
  • php_s–尝试运行本地php服务器时替换-s-S
  • port_already_in_use –杀死绑定端口的进程;
  • prove_recursively-r用目录调用时添加;
  • pyenv_no_such_command–修复错误的pyenv命令,例如pyenv isntallpyenv list;
  • python_commandpython当您尝试运行不可执行/没有./python脚本时准备;
  • python_execute.py执行Python文件时追加缺少的内容;
  • quotation_marks-修正的不均用法'"含有当ARGS’;
  • path_from_history –用与历史记录相似的绝对路径替换未找到的路径;
  • react_native_command_unrecognized–修复无法识别的react-native命令;
  • remove_shell_prompt_literal–删除$从文档复制命令时常见的前导外壳提示符号;
  • remove_trailing_cedilla–删除尾随的小提琴ç,这是欧洲键盘布局的常见错字;
  • rm_dir-rf当您尝试删除目录时添加;
  • scm_correction-修正错误的SCM喜欢hg loggit log;
  • sed_unterminated_s–在seds命令中添加缺少的“ /” ;
  • sl_ls–更改slls
  • ssh_known_hosts–从known_hosts警告中删除主机;
  • sudosudo如果由于权限失败而在前一个命令之前添加;
  • sudo_command_from_user_path-运行来自用户的命令$PATHsudo;
  • switch_lang –将命令从您的本地布局切换到en;
  • systemctl–正确订购混乱的参数systemctl
  • terraform_init.pyterraform init在计划或应用之前运行;
  • test.py–运行py.test代替test.py
  • touch –在“接触”之前创建丢失的目录;
  • tsuru_logintsuru login如果未通过身份验证或会话过期,则运行;
  • tsuru_not_command–修复错误的tsuru命令,例如tsuru shell
  • tmux–修复tmux命令;
  • unknown_command–修复了hadoop hdfs样式的“未知命令”,例如在上的命令中添加了丢失的“-” hdfs dfs ls
  • unsudosudo如果进程拒绝以超级用户特权运行,则从上一个命令中删除。
  • vagrant_up –启动无业游民的实例;
  • whois–修复whois命令;
  • workon_doesnt_exists–修复了virtualenvwrapperos建议创建新的env名称的问题。
  • yarn_alias–修复yarn类似别名的命令yarn ls
  • yarn_command_not_found–修复拼写错误的yarn命令;
  • yarn_command_replaced–修复了替换的yarn命令;
  • yarn_help–使打开yarn文件更加容易;
默认情况下,以下规则仅在特定平台上启用:
  • apt_get–如果未安装,则从apt安装应用(需要python-commandnotfoundpython3-commandnotfound);
  • apt_get_search–更改尝试使用搜索进行apt-get搜索apt-cache
  • apt_invalid_operation–修复无效aptapt-get呼叫,例如apt-get isntall vim
  • apt_list_upgradable–帮助您apt list --upgradable追赶apt update
  • apt_upgrade–帮助您apt upgrade追赶apt list --upgradable
  • brew_cask_dependency –安装桶依赖关系;
  • brew_install–固定公式名称brew install
  • brew_reinstall-转brew install <formula>brew reinstall <formula>;
  • brew_link--overwrite --dry-run链接失败时添加;
  • brew_uninstall-增加了--forcebrew uninstall是否已安装了多个版本;
  • brew_unknown_command–修复错误的冲煮命令,例如brew docto/brew doctor
  • brew_update_formula-转brew update <formula>brew upgrade <formula>;
  • dnf_no_such_command –修正了错误键入的DNF命令;
  • nixos_cmd_not_found –在NixOS上安装应用;
  • pacman–与pacman未安装的应用一起安装(使用yayyaourt可用);
  • pacman_invalid_optionpacman用大写字母替换小写字母选项。
  • pacman_not_found-与修复包的名称pacmanyayyaourt
  • yum_invalid_operation–修复无效的yum呼叫,例如yum isntall vim;
以下命令与The Fuck捆绑在一起,但默认情况下未启用:
  • git_push_force–增加--force-with-leasegit push(可能与冲突git_push_pull);
  • rm_root–添加--no-preserve-rootrm -rf /命令。

创建自己的规则

要添加自己的规则,在~/.config/thefuck/rules 创建一个文件名为your-rule-name.py 的规则文件,必须包含两个函数:
match(command: Command) -> bool
get_new_command(command: Command) -> str | list[str]
下面是简单的 sudo 规则示例:
def match(command):
    return ('permission denied' in command.output.lower()
            or 'EACCES' in command.output)


def get_new_command(command):
    return 'sudo {}'.format(command.script)

# Optional:
enabled_by_default = True

def side_effect(command, fixed_command):
    subprocess.call('chmod 777 .', shell=True)

priority = 1000  # Lower first, default is 1000

requires_output = True
如果命令运行结果出现 permission denied 或者 EACCES,则执行 sudo xxx. 此外,还可以配置side_effect,如果你配置了enabled_by_default = True,side_effect函数内的操作将会被执行。

设定值

可以在文件中更改几个Fuck参数$XDG_CONFIG_HOME/thefuck/settings.py ($XDG_CONFIG_HOME默认为~/.config):
  • rules–默认情况下已启用规则的列表thefuck.const.DEFAULT_RULES
  • exclude_rules–默认情况下禁用的规则列表[]
  • require_confirmation–默认情况下True,在运行新命令之前需要确认;
  • wait_command –获取先前命令输出的最长时间(以秒为单位);
  • no_colors –禁用彩色输出;
  • priority–具有规则优先级的字典,具有较低优先级的规则priority将首先匹配;
  • debug–默认情况下启用调试输出False
  • history_limit–将扫描多少个历史命令的数值,例如2000
  • alter_history–默认情况下True,将固定命令推送到历史记录;
  • wait_slow_command–如果先前的命令输出在slow_commands列表中,则以秒为单位的最长时间;
  • slow_commands –慢速命令列表;
  • num_close_matches–默认情况下建议的最大匹配数3
一个例子settings.py
rules = ['sudo', 'no_command']
exclude_rules = ['git_push']
require_confirmation = True
wait_command = 10
no_colors = False
priority = {'sudo': 100, 'no_command': 9999}
debug = False
history_limit = 9999
wait_slow_command = 20
slow_commands = ['react-native', 'gradle']
num_close_matches = 5
或通过环境变量:
  • THEFUCK_RULES–启用的规则列表,例如DEFAULT_RULES:rm_rootsudo:no_command
  • THEFUCK_EXCLUDE_RULES–禁用规则列表,例如git_pull:git_push
  • THEFUCK_REQUIRE_CONFIRMATION–在运行新命令之前需要确认true/false
  • THEFUCK_WAIT_COMMAND –获取先前命令输出的最长时间(以秒为单位);
  • THEFUCK_NO_COLORS–禁用彩色输出true/false
  • THEFUCK_PRIORITY–规则的优先级,例如no_command=9999:apt_get=100,优先级较低的规则priority将首先匹配;
  • THEFUCK_DEBUG–启用调试输出true/false
  • THEFUCK_HISTORY_LIMIT–将扫描多少个历史命令,例如2000
  • THEFUCK_ALTER_HISTORY–将固定命令推向历史true/false
  • THEFUCK_WAIT_SLOW_COMMAND–如果先前的命令输出在slow_commands列表中,则以秒为单位的最长时间;
  • THEFUCK_SLOW_COMMANDS–慢速命令列表,例如lein:gradle
  • THEFUCK_NUM_CLOSE_MATCHES–建议的接近匹配的最大数量,例如5
例如:
export THEFUCK_RULES='sudo:no_command'
export THEFUCK_EXCLUDE_RULES='git_pull:git_push'
export THEFUCK_REQUIRE_CONFIRMATION='true'
export THEFUCK_WAIT_COMMAND=10
export THEFUCK_NO_COLORS='false'
export THEFUCK_PRIORITY='no_command=9999:apt_get=100'
export THEFUCK_HISTORY_LIMIT='2000'
export THEFUCK_NUM_CLOSE_MATCHES='5'

具有规则的第三方软件包

如果您想制定一组特定的非公共规则,但仍想与其他人共享,请创建一个thefuck_contrib_*具有以下结构的包:
thefuck_contrib_foo
  thefuck_contrib_foo
    rules
      __init__.py
      *third-party rules*
    __init__.py
    *third-party-utils*
  setup.py
Fuck将找到位于rules模块中的规则。

实验即时模式

The Fuck的默认行为需要时间来重新运行以前的命令。在即时模式下,The Fuck通过使用script记录输出,然后读取日志来节省时间。 目前,即时模式仅支持bash或zsh的Python 3。还必须禁用zsh的自动更正功能,以使其正常工作。 要启用即时模式,添加--enable-experimental-instant-mode 到别名初始化.bashrc.bash_profile.zshrc。 例如:
eval $(thefuck --alias --enable-experimental-instant-mode)

发展

参见CONTRIBUTING.md

麻省理工学院许可证

项目许可证可以在这里找到。

Youtube-dl—从youtube.com或其他视频平台下载视频

[download_code]

安装

要立即为所有UNIX用户(Linux,macOS等)安装它,请键入:

sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl

如果没有curl,则可以使用wget:

sudo wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl

Windows用户可以下载.exe文件并将其放置在其PATH上的任何位置,除了%SYSTEMROOT%\System32(例如,不要放入C:\Windows\System32)。

您还可以使用pip:

sudo -H pip install --upgrade youtube-dl

如果您已经安装了此命令,它将更新youtube-dl。有关更多信息,请参见pypi页面

macOS用户可以使用Homebrew安装youtube-dl :

brew install youtube-dl

或使用MacPorts

sudo port install youtube-dl

或者,请参阅开发人员说明以了解如何检出并使用git存储库。有关其他选项(包括PGP签名)的信息,请参见youtube-dl下载页面

描述

youtube-dl是一个命令行程序,可以从YouTube.com和其他一些网站下载视频。它需要2.6、2.7或3.2+版本的Python解释器,并且它不是特定于平台的。它应该可以在您的Unix机器,Windows或macOS上运行。它已发布到公共领域,这意味着您可以随意修改,重新分发或使用它。

youtube-dl [OPTIONS] URL [URL...]

选项

-h, --help                       Print this help text and exit
--version                        Print program version and exit
-U, --update                     Update this program to latest version. Make
                                 sure that you have sufficient permissions
                                 (run with sudo if needed)
-i, --ignore-errors              Continue on download errors, for example to
                                 skip unavailable videos in a playlist
--abort-on-error                 Abort downloading of further videos (in the
                                 playlist or the command line) if an error
                                 occurs
--dump-user-agent                Display the current browser identification
--list-extractors                List all supported extractors
--extractor-descriptions         Output descriptions of all supported
                                 extractors
--force-generic-extractor        Force extraction to use the generic
                                 extractor
--default-search PREFIX          Use this prefix for unqualified URLs. For
                                 example "gvsearch2:" downloads two videos
                                 from google videos for youtube-dl "large
                                 apple". Use the value "auto" to let
                                 youtube-dl guess ("auto_warning" to emit a
                                 warning when guessing). "error" just throws
                                 an error. The default value "fixup_error"
                                 repairs broken URLs, but emits an error if
                                 this is not possible instead of searching.
--ignore-config                  Do not read configuration files. When given
                                 in the global configuration file
                                 /etc/youtube-dl.conf: Do not read the user
                                 configuration in ~/.config/youtube-
                                 dl/config (%APPDATA%/youtube-dl/config.txt
                                 on Windows)
--config-location PATH           Location of the configuration file; either
                                 the path to the config or its containing
                                 directory.
--flat-playlist                  Do not extract the videos of a playlist,
                                 only list them.
--mark-watched                   Mark videos watched (YouTube only)
--no-mark-watched                Do not mark videos watched (YouTube only)
--no-color                       Do not emit color codes in output

网络选项:

--proxy URL                      Use the specified HTTP/HTTPS/SOCKS proxy.
                                 To enable SOCKS proxy, specify a proper
                                 scheme. For example
                                 socks5://127.0.0.1:1080/. Pass in an empty
                                 string (--proxy "") for direct connection
--socket-timeout SECONDS         Time to wait before giving up, in seconds
--source-address IP              Client-side IP address to bind to
-4, --force-ipv4                 Make all connections via IPv4
-6, --force-ipv6                 Make all connections via IPv6

地理限制:

--geo-verification-proxy URL     Use this proxy to verify the IP address for
                                 some geo-restricted sites. The default
                                 proxy specified by --proxy (or none, if the
                                 option is not present) is used for the
                                 actual downloading.
--geo-bypass                     Bypass geographic restriction via faking
                                 X-Forwarded-For HTTP header
--no-geo-bypass                  Do not bypass geographic restriction via
                                 faking X-Forwarded-For HTTP header
--geo-bypass-country CODE        Force bypass geographic restriction with
                                 explicitly provided two-letter ISO 3166-2
                                 country code
--geo-bypass-ip-block IP_BLOCK   Force bypass geographic restriction with
                                 explicitly provided IP block in CIDR
                                 notation

视频选择:

--playlist-start NUMBER          Playlist video to start at (default is 1)
--playlist-end NUMBER            Playlist video to end at (default is last)
--playlist-items ITEM_SPEC       Playlist video items to download. Specify
                                 indices of the videos in the playlist
                                 separated by commas like: "--playlist-items
                                 1,2,5,8" if you want to download videos
                                 indexed 1, 2, 5, 8 in the playlist. You can
                                 specify range: "--playlist-items
                                 1-3,7,10-13", it will download the videos
                                 at index 1, 2, 3, 7, 10, 11, 12 and 13.
--match-title REGEX              Download only matching titles (regex or
                                 caseless sub-string)
--reject-title REGEX             Skip download for matching titles (regex or
                                 caseless sub-string)
--max-downloads NUMBER           Abort after downloading NUMBER files
--min-filesize SIZE              Do not download any videos smaller than
                                 SIZE (e.g. 50k or 44.6m)
--max-filesize SIZE              Do not download any videos larger than SIZE
                                 (e.g. 50k or 44.6m)
--date DATE                      Download only videos uploaded in this date
--datebefore DATE                Download only videos uploaded on or before
                                 this date (i.e. inclusive)
--dateafter DATE                 Download only videos uploaded on or after
                                 this date (i.e. inclusive)
--min-views COUNT                Do not download any videos with less than
                                 COUNT views
--max-views COUNT                Do not download any videos with more than
                                 COUNT views
--match-filter FILTER            Generic video filter. Specify any key (see
                                 the "OUTPUT TEMPLATE" for a list of
                                 available keys) to match if the key is
                                 present, !key to check if the key is not
                                 present, key > NUMBER (like "comment_count
                                 > 12", also works with >=, <, <=, !=, =) to
                                 compare against a number, key = 'LITERAL'
                                 (like "uploader = 'Mike Smith'", also works
                                 with !=) to match against a string literal
                                 and & to require multiple matches. Values
                                 which are not known are excluded unless you
                                 put a question mark (?) after the operator.
                                 For example, to only match videos that have
                                 been liked more than 100 times and disliked
                                 less than 50 times (or the dislike
                                 functionality is not available at the given
                                 service), but who also have a description,
                                 use --match-filter "like_count > 100 &
                                 dislike_count <? 50 & description" .
--no-playlist                    Download only the video, if the URL refers
                                 to a video and a playlist.
--yes-playlist                   Download the playlist, if the URL refers to
                                 a video and a playlist.
--age-limit YEARS                Download only videos suitable for the given
                                 age
--download-archive FILE          Download only videos not listed in the
                                 archive file. Record the IDs of all
                                 downloaded videos in it.
--include-ads                    Download advertisements as well
                                 (experimental)

下载选项:

-r, --limit-rate RATE            Maximum download rate in bytes per second
                                 (e.g. 50K or 4.2M)
-R, --retries RETRIES            Number of retries (default is 10), or
                                 "infinite".
--fragment-retries RETRIES       Number of retries for a fragment (default
                                 is 10), or "infinite" (DASH, hlsnative and
                                 ISM)
--skip-unavailable-fragments     Skip unavailable fragments (DASH, hlsnative
                                 and ISM)
--abort-on-unavailable-fragment  Abort downloading when some fragment is not
                                 available
--keep-fragments                 Keep downloaded fragments on disk after
                                 downloading is finished; fragments are
                                 erased by default
--buffer-size SIZE               Size of download buffer (e.g. 1024 or 16K)
                                 (default is 1024)
--no-resize-buffer               Do not automatically adjust the buffer
                                 size. By default, the buffer size is
                                 automatically resized from an initial value
                                 of SIZE.
--http-chunk-size SIZE           Size of a chunk for chunk-based HTTP
                                 downloading (e.g. 10485760 or 10M) (default
                                 is disabled). May be useful for bypassing
                                 bandwidth throttling imposed by a webserver
                                 (experimental)
--playlist-reverse               Download playlist videos in reverse order
--playlist-random                Download playlist videos in random order
--xattr-set-filesize             Set file xattribute ytdl.filesize with
                                 expected file size
--hls-prefer-native              Use the native HLS downloader instead of
                                 ffmpeg
--hls-prefer-ffmpeg              Use ffmpeg instead of the native HLS
                                 downloader
--hls-use-mpegts                 Use the mpegts container for HLS videos,
                                 allowing to play the video while
                                 downloading (some players may not be able
                                 to play it)
--external-downloader COMMAND    Use the specified external downloader.
                                 Currently supports
                                 aria2c,avconv,axel,curl,ffmpeg,httpie,wget
--external-downloader-args ARGS  Give these arguments to the external
                                 downloader

文件系统选项:

-a, --batch-file FILE            File containing URLs to download ('-' for
                                 stdin), one URL per line. Lines starting
                                 with '#', ';' or ']' are considered as
                                 comments and ignored.
--id                             Use only video ID in file name
-o, --output TEMPLATE            Output filename template, see the "OUTPUT
                                 TEMPLATE" for all the info
--autonumber-start NUMBER        Specify the start value for %(autonumber)s
                                 (default is 1)
--restrict-filenames             Restrict filenames to only ASCII
                                 characters, and avoid "&" and spaces in
                                 filenames
-w, --no-overwrites              Do not overwrite files
-c, --continue                   Force resume of partially downloaded files.
                                 By default, youtube-dl will resume
                                 downloads if possible.
--no-continue                    Do not resume partially downloaded files
                                 (restart from beginning)
--no-part                        Do not use .part files - write directly
                                 into output file
--no-mtime                       Do not use the Last-modified header to set
                                 the file modification time
--write-description              Write video description to a .description
                                 file
--write-info-json                Write video metadata to a .info.json file
--write-annotations              Write video annotations to a
                                 .annotations.xml file
--load-info-json FILE            JSON file containing the video information
                                 (created with the "--write-info-json"
                                 option)
--cookies FILE                   File to read cookies from and dump cookie
                                 jar in
--cache-dir DIR                  Location in the filesystem where youtube-dl
                                 can store some downloaded information
                                 permanently. By default
                                 $XDG_CACHE_HOME/youtube-dl or
                                 ~/.cache/youtube-dl . At the moment, only
                                 YouTube player files (for videos with
                                 obfuscated signatures) are cached, but that
                                 may change.
--no-cache-dir                   Disable filesystem caching
--rm-cache-dir                   Delete all filesystem cache files

缩略图:

--write-thumbnail                Write thumbnail image to disk
--write-all-thumbnails           Write all thumbnail image formats to disk
--list-thumbnails                Simulate and list all available thumbnail
                                 formats

详细度/模拟选项:

-q, --quiet                      Activate quiet mode
--no-warnings                    Ignore warnings
-s, --simulate                   Do not download the video and do not write
                                 anything to disk
--skip-download                  Do not download the video
-g, --get-url                    Simulate, quiet but print URL
-e, --get-title                  Simulate, quiet but print title
--get-id                         Simulate, quiet but print id
--get-thumbnail                  Simulate, quiet but print thumbnail URL
--get-description                Simulate, quiet but print video description
--get-duration                   Simulate, quiet but print video length
--get-filename                   Simulate, quiet but print output filename
--get-format                     Simulate, quiet but print output format
-j, --dump-json                  Simulate, quiet but print JSON information.
                                 See the "OUTPUT TEMPLATE" for a description
                                 of available keys.
-J, --dump-single-json           Simulate, quiet but print JSON information
                                 for each command-line argument. If the URL
                                 refers to a playlist, dump the whole
                                 playlist information in a single line.
--print-json                     Be quiet and print the video information as
                                 JSON (video is still being downloaded).
--newline                        Output progress bar as new lines
--no-progress                    Do not print progress bar
--console-title                  Display progress in console titlebar
-v, --verbose                    Print various debugging information
--dump-pages                     Print downloaded pages encoded using base64
                                 to debug problems (very verbose)
--write-pages                    Write downloaded intermediary pages to
                                 files in the current directory to debug
                                 problems
--print-traffic                  Display sent and read HTTP traffic
-C, --call-home                  Contact the youtube-dl server for debugging
--no-call-home                   Do NOT contact the youtube-dl server for
                                 debugging

解决方法:

--encoding ENCODING              Force the specified encoding (experimental)
--no-check-certificate           Suppress HTTPS certificate validation
--prefer-insecure                Use an unencrypted connection to retrieve
                                 information about the video. (Currently
                                 supported only for YouTube)
--user-agent UA                  Specify a custom user agent
--referer URL                    Specify a custom referer, use if the video
                                 access is restricted to one domain
--add-header FIELD:VALUE         Specify a custom HTTP header and its value,
                                 separated by a colon ':'. You can use this
                                 option multiple times
--bidi-workaround                Work around terminals that lack
                                 bidirectional text support. Requires bidiv
                                 or fribidi executable in PATH
--sleep-interval SECONDS         Number of seconds to sleep before each
                                 download when used alone or a lower bound
                                 of a range for randomized sleep before each
                                 download (minimum possible number of
                                 seconds to sleep) when used along with
                                 --max-sleep-interval.
--max-sleep-interval SECONDS     Upper bound of a range for randomized sleep
                                 before each download (maximum possible
                                 number of seconds to sleep). Must only be
                                 used along with --min-sleep-interval.

视频格式选项:

-f, --format FORMAT              Video format code, see the "FORMAT
                                 SELECTION" for all the info
--all-formats                    Download all available video formats
--prefer-free-formats            Prefer free video formats unless a specific
                                 one is requested
-F, --list-formats               List all available formats of requested
                                 videos
--youtube-skip-dash-manifest     Do not download the DASH manifests and
                                 related data on YouTube videos
--merge-output-format FORMAT     If a merge is required (e.g.
                                 bestvideo+bestaudio), output to given
                                 container format. One of mkv, mp4, ogg,
                                 webm, flv. Ignored if no merge is required

字幕选项:

--write-sub                      Write subtitle file
--write-auto-sub                 Write automatically generated subtitle file
                                 (YouTube only)
--all-subs                       Download all the available subtitles of the
                                 video
--list-subs                      List all available subtitles for the video
--sub-format FORMAT              Subtitle format, accepts formats
                                 preference, for example: "srt" or
                                 "ass/srt/best"
--sub-lang LANGS                 Languages of the subtitles to download
                                 (optional) separated by commas, use --list-
                                 subs for available language tags

身份验证选项:

-u, --username USERNAME          Login with this account ID
-p, --password PASSWORD          Account password. If this option is left
                                 out, youtube-dl will ask interactively.
-2, --twofactor TWOFACTOR        Two-factor authentication code
-n, --netrc                      Use .netrc authentication data
--video-password PASSWORD        Video password (vimeo, youku)

Adobe Pass选项:

--ap-mso MSO                     Adobe Pass multiple-system operator (TV
                                 provider) identifier, use --ap-list-mso for
                                 a list of available MSOs
--ap-username USERNAME           Multiple-system operator account login
--ap-password PASSWORD           Multiple-system operator account password.
                                 If this option is left out, youtube-dl will
                                 ask interactively.
--ap-list-mso                    List all supported multiple-system
                                 operators

后处理选项:

-x, --extract-audio              Convert video files to audio-only files
                                 (requires ffmpeg or avconv and ffprobe or
                                 avprobe)
--audio-format FORMAT            Specify audio format: "best", "aac",
                                 "flac", "mp3", "m4a", "opus", "vorbis", or
                                 "wav"; "best" by default; No effect without
                                 -x
--audio-quality QUALITY          Specify ffmpeg/avconv audio quality, insert
                                 a value between 0 (better) and 9 (worse)
                                 for VBR or a specific bitrate like 128K
                                 (default 5)
--recode-video FORMAT            Encode the video to another format if
                                 necessary (currently supported:
                                 mp4|flv|ogg|webm|mkv|avi)
--postprocessor-args ARGS        Give these arguments to the postprocessor
-k, --keep-video                 Keep the video file on disk after the post-
                                 processing; the video is erased by default
--no-post-overwrites             Do not overwrite post-processed files; the
                                 post-processed files are overwritten by
                                 default
--embed-subs                     Embed subtitles in the video (only for mp4,
                                 webm and mkv videos)
--embed-thumbnail                Embed thumbnail in the audio as cover art
--add-metadata                   Write metadata to the video file
--metadata-from-title FORMAT     Parse additional metadata like song title /
                                 artist from the video title. The format
                                 syntax is the same as --output. Regular
                                 expression with named capture groups may
                                 also be used. The parsed parameters replace
                                 existing values. Example: --metadata-from-
                                 title "%(artist)s - %(title)s" matches a
                                 title like "Coldplay - Paradise". Example
                                 (regex): --metadata-from-title
                                 "(?P<artist>.+?) - (?P<title>.+)"
--xattrs                         Write metadata to the video file's xattrs
                                 (using dublin core and xdg standards)
--fixup POLICY                   Automatically correct known faults of the
                                 file. One of never (do nothing), warn (only
                                 emit a warning), detect_or_warn (the
                                 default; fix file if we can, warn
                                 otherwise)
--prefer-avconv                  Prefer avconv over ffmpeg for running the
                                 postprocessors
--prefer-ffmpeg                  Prefer ffmpeg over avconv for running the
                                 postprocessors (default)
--ffmpeg-location PATH           Location of the ffmpeg/avconv binary;
                                 either the path to the binary or its
                                 containing directory.
--exec CMD                       Execute a command on the file after
                                 downloading and post-processing, similar to
                                 find's -exec syntax. Example: --exec 'adb
                                 push {} /sdcard/Music/ && rm {}'
--convert-subs FORMAT            Convert the subtitles to other format
                                 (currently supported: srt|ass|vtt|lrc)

组态

您可以通过将任何受支持的命令行选项放置到配置文件中来配置youtube-dl。在Linux和macOS上,系统范围的配置文件位于,/etc/youtube-dl.conf用户范围的配置文件位于~/.config/youtube-dl/config。在Windows上,用户范围的配置文件位置为%APPDATA%\youtube-dl\config.txtC:\Users\<user name>\youtube-dl.conf。请注意,默认情况下配置文件可能不存在,因此您可能需要自己创建它。

例如,使用以下配置文件youtube-dl将始终提取音频,而不复制mtime,使用代理并将所有视频保存Movies在主目录下的目录下:

# Lines starting with # are comments

# Always extract audio
-x

# Do not copy the mtime
--no-mtime

# Use this proxy
--proxy 127.0.0.1:3128

# Save all videos under Movies directory in your home directory
-o ~/Movies/%(title)s.%(ext)s

请注意,配置文件中的选项与常规命令行调用中使用的选项(也称为开关)相同,因此,在或之后必须没有空格,例如,但不能或。----o--proxy- o-- proxy

--ignore-config如果您要为特定的youtube-dl运行禁用配置文件,则可以使用。

--config-location如果要针对特定​​的youtube-dl运行使用自定义配置文件,也可以使用。

.netrc文件认证

您可能还希望为支持身份验证的提取程序配置自动凭据存储(通过使用--username和提供登录名和密码--password),以便在每次youtube-dl执行时都不将凭据作为命令行参数传递,并防止在shell命令历史记录中跟踪纯文本密码。您可以在每个提取器的基础上使用.netrc文件来实现此目的。为此,您将需要.netrc在自己的文件中创建一个文件,$HOME并限制只有您自己才能读/写的权限:

touch $HOME/.netrc
chmod a-rwx,u+rw $HOME/.netrc

之后,您可以采用以下格式添加提取程序的凭据,其中extractor提取程序的名称,小写形式:

machine <extractor> login <login> password <password>

例如:

machine youtube login myaccount@gmail.com password my_youtube_password
machine twitch login my_twitch_account_name password my_twitch_password

要使用该.netrc文件激活身份验证,您应该传递--netrc给youtube-dl或将其放置在配置文件中

在Windows上,您可能还需要%HOME%手动设置环境变量。例如:

set HOME=%USERPROFILE%

输出模板

-o选项允许用户指示输出文件名的模板。

tl; dr: 导航至示例

基本用法是在下载单个文件时(例如中的)不设置任何模板参数youtube-dl -o funny_video.flv "https://some/video"。但是,它可能包含特殊的序列,这些序列将在下载每个视频时被替换。可以根据python字符串格式化操作对特殊序列进行格式化。例如,%(NAME)s%(NAME)05d。为了明确起见,这是一个百分号,后跟一个括号,然后是格式化操作。允许的名称以及序列类型为:

  • id (字符串):视频标识符
  • title (字符串):视频标题
  • url (字符串):视频网址
  • ext (字符串):视频文件扩展名
  • alt_title (字符串):视频的辅助标题
  • display_id (字符串):视频的备用标识符
  • uploader (字符串):视频上传者的全名
  • license (字符串):视频所许可的许可名称
  • creator (字符串):视频的创建者
  • release_date (字符串):视频发布的日期(YYYYMMDD)
  • timestamp (数字):视频可用时的UNIX时间戳。
  • upload_date (字符串):视频上传日期(YYYYMMDD)
  • uploader_id (字符串):视频上传者的昵称或ID
  • channel (字符串):上传视频的频道的全名
  • channel_id (字符串):频道的ID
  • location (字符串):录制视频的实际位置
  • duration (数字):视频长度(以秒为单位)
  • view_count (数字):有多少用户在平台上观看了视频
  • like_count (数字):视频的正面评价数
  • dislike_count (数字):视频的负面评价数
  • repost_count (数字):视频的转发次数
  • average_rating (数字):用户给出的平均评分,使用的比例取决于网页
  • comment_count (数字):视频评论数
  • age_limit (数字):视频的年龄限制(年)
  • is_live (布尔值):此视频是实时流还是固定长度的视频
  • start_time (数字):开始播放的时间(以秒为单位),如URL中所指定
  • end_time (数字):复制应结束的时间(以秒为单位),如URL中所指定
  • format (字符串):格式的易于理解的描述
  • format_id (字符串):指定的格式代码 --format
  • format_note (字符串):有关格式的其他信息
  • width (数字):视频的宽度
  • height (数字):视频的高度
  • resolution (字符串):宽度和高度的文字描述
  • tbr (数字):音频和视频的平均比特率,单位为KBit / s
  • abr (数字):平均音频比特率,单位为KBit / s
  • acodec (字符串):使用中的音频编解码器的名称
  • asr (数字):音频采样率,以赫兹为单位
  • vbr (数字):平均视频比特率,单位为KBit / s
  • fps (数字):帧频
  • vcodec (字符串):正在使用的视频编解码器的名称
  • container (字符串):容器格式的名称
  • filesize (数字):字节数(如果事先知道)
  • filesize_approx (数字):估计的字节数
  • protocol (字符串):将用于实际下载的协议
  • extractor (字符串):提取器的名称
  • extractor_key (字符串):提取器的键名
  • epoch (数字):创建文件时的Unix纪元
  • autonumber (数字):每次下载都会增加的数字,起始于 --autonumber-start
  • playlist (字符串):包含视频的播放列表的名称或ID
  • playlist_index (数字):播放列表中视频的索引,根据播放列表的总长度用前导零填充
  • playlist_id (字符串):播放列表标识符
  • playlist_title (字符串):播放列表标题
  • playlist_uploader (字符串):播放列表上传者的全名
  • playlist_uploader_id (字符串):播放列表上传者的昵称或ID

适用于属于某些逻辑章节的视频:

  • chapter (字符串):视频所属章节的名称或标题
  • chapter_number (数字):视频所属章节的编号
  • chapter_id (字符串):视频所属章节的ID

可用于某些系列或节目的一集的视频:

  • series (字符串):视频片段所属的系列或节目的标题
  • season (字符串):视频片段所属的季节的标题
  • season_number (数字):视频片段所属的季节数
  • season_id (字符串):视频片段所属的季节ID
  • episode (字符串):视频片段的标题
  • episode_number (数字):一个季节中的视频片段数
  • episode_id (字符串):视频片段的ID

可用于作为曲目或音乐专辑一部分的媒体:

  • track (字符串):曲目标题
  • track_number (数字):专辑或光盘中的曲目编号
  • track_id (字符串):曲目的ID
  • artist (字符串):曲目的艺术家
  • genre (字符串):曲目的流派
  • album (字符串):曲目所属专辑的标题
  • album_type (字符串):相册的类型
  • album_artist (字符串):专辑中出现的所有艺术家的列表
  • disc_number (数字):轨道所属的光盘或其他物理介质的编号
  • release_year (数字):专辑发行的年份(YYYY)

当在输出模板中引用每个上述序列时,将由对应于序列名称的实际值替换。注意,某些序列不保证存在,因为它们取决于特定提取器获得的元数据。此类序列将替换为NA

例如,对于-o %(title)s-%(id)s.%(ext)s带有标题youtube-dl test video和ID的mp4视频BaW_jenozKcj,这将导致在youtube-dl test video-BaW_jenozKcj.mp4当前目录中创建一个文件。

对于数字序列,您可以使用数字相关的格式,例如,%(view_count)05d将导致视图计数的字符串填充零(最多5个字符),例如中的00042

输出模板还可以包含任意分层路径,例如-o '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s',这将导致将每个视频下载到与此路径模板相对应的目录中。任何丢失的目录将自动为您创建。

要在输出模板中使用百分比文字,请使用%%。要输出到stdout,请使用-o -

当前的默认模板为%(title)s-%(id)s.%(ext)s

在某些情况下,例如在将下载的文件名传输到Windows系统或通过8bit-unsafe通道将文件名传输到Windows系统时,您不需要特殊字符(如中,空格或&)。在这些情况下,请添加--restrict-filenames标志以缩短标题:

输出模板和Windows批处理文件

如果您在Windows批处理文件中使用输出模板,则必须%通过加倍转义普通百分号(),因此-o "%(title)s-%(id)s.%(ext)s"应变为-o "%%(title)s-%%(id)s.%%(ext)s"。但是,您请勿触摸%非普通字符的,例如,用于扩展的环境变量应保持原样:-o "C:\%HOMEPATH%\Desktop\%%(title)s.%%(ext)s"

输出模板示例

请注意,在Windows上,您可能需要使用双引号而不是单引号。

$ youtube-dl --get-filename -o '%(title)s.%(ext)s' BaW_jenozKc
youtube-dl test video ''_ä↭𝕐.mp4    # All kinds of weird characters

$ youtube-dl --get-filename -o '%(title)s.%(ext)s' BaW_jenozKc --restrict-filenames
youtube-dl_test_video_.mp4          # A simple file name

# Download YouTube playlist videos in separate directory indexed by video order in a playlist
$ youtube-dl -o '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s' https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re

# Download all playlists of YouTube channel/user keeping each playlist in separate directory:
$ youtube-dl -o '%(uploader)s/%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s' https://www.youtube.com/user/TheLinuxFoundation/playlists

# Download Udemy course keeping each chapter in separate directory under MyVideos directory in your home
$ youtube-dl -u user -p password -o '~/MyVideos/%(playlist)s/%(chapter_number)s - %(chapter)s/%(title)s.%(ext)s' https://www.udemy.com/java-tutorial/

# Download entire series season keeping each series and each season in separate directory under C:/MyVideos
$ youtube-dl -o "C:/MyVideos/%(series)s/%(season_number)s - %(season)s/%(episode_number)s - %(episode)s.%(ext)s" https://videomore.ru/kino_v_detalayah/5_sezon/367617

# Stream the video being downloaded to stdout
$ youtube-dl -o - BaW_jenozKc

格式选择

默认情况下,youtube-dl尝试下载最佳质量,即,如果您希望获得最佳质量,则不需要通过任何特殊选项,那么youtube-dl将默认为您猜测。

但有时您可能想以其他格式下载,例如,在连接速度较慢或断断续续时。实现此目的的关键机制是所谓的格式选择,您可以基于该机制显式指定所需的格式,基于某个或多个条件选择格式,设置优先级等。

为格式选择的一般语法--format FORMAT或短-f FORMAT,其中FORMAT的一个选择表达式,即描述了一种或多种格式,你想下载的表达式。

tl; dr: 导航至示例

最简单的情况是请求特定格式,例如,-f 22您可以下载格式代码等于22的格式。您可以使用--list-formats或来获取特定视频的可用格式代码列表-F。请注意,这些格式代码是提取器特定的。

你也可以使用一个文件扩展名(目前3gpaacflvm4amp3mp4oggwavwebm都支持),下载服务作为一个单一的文件中的特定文件扩展名,例如质量最好的格式,-f webm将下载最优质的格式与webm充当扩展单个文件。

您还可以使用特殊名称来选择特殊的边缘情况格式:

  • best:选择带有视频和音频的单个文件代表的最佳质量格式。
  • worst:选择带有视频和音频的单个文件代表的质量最差的格式。
  • bestvideo:选择最佳质量的纯视频格式(例如DASH视频)。可能不可用。
  • worstvideo:选择质量最差的纯视频格式。可能不可用。
  • bestaudio:选择最佳质量的纯音频格式。可能不可用。
  • worstaudio:选择质量最差的纯音频格式。可能不可用。

例如,要下载质量最差的纯视频格式,可以使用-f worstvideo

如果要下载多个视频,而它们没有可用的相同格式,则可以使用斜杠指定首选项的顺序。请注意,斜杠是左关联的,即首选左侧的格式,例如,-f 22/17/18如果可用,将下载格式22,否则,将下载格式17,如果可用,则将下载格式18,否则,将下载格式18。会抱怨没有合适的格式可供下载。

如果要下载同一视频的几种格式,请使用逗号作为分隔符,例如,-f 22,17,18将下载所有这三种格式(当然,如果有的话)。或更高级的示例结合了优先功能:-f 136/137/mp4/bestvideo,140/m4a/bestaudio

您也可以通过将条件放在方括号中来过滤视频格式,如-f "best[height=720]"(或-f "[filesize>10M]")。

下面的数值元字段可以用比较使用<<=>>==(等于), !=(未等于):

  • filesize:字节数(如果事先知道)
  • width:视频的宽度(如果知道)
  • height:视频的高度(如果知道)
  • tbr:音频和视频的平均比特率,单位为KBit / s
  • abr:平均音频比特率,单位为KBit / s
  • vbr:平均视频比特率(千比特/秒)
  • asr:赫兹音频采样率
  • fps:帧频

还为比较=(等于),^=(以)开始,$=(以)结束,*=(包含)以及以下字符串元字段进行过滤工作:

  • ext: 文件扩展名
  • acodec:正在使用的音频编解码器的名称
  • vcodec:正在使用的视频编解码器的名称
  • container:容器格式名称
  • protocol:将被用于实际下载协议,小写(httphttpsrtsprtmprtmpemmsf4mismhttp_dash_segmentsm3u8,或m3u8_native
  • format_id:格式的简短说明

任何字符串比较都可以加上否定前缀,!以便产生相反的比较,例如!*=(不包含)。

注意,上述元字段都不保证存在,因为这仅取决于特定提取器获得的元数据,即视频托管者提供的元数据。

除非您?在运算符后面加上问号(),否则将排除不知道其值的格式。您可以组合使用格式过滤器,因此-f "[height <=? 720][tbr>500]"最多可以选择比特率至少为500 KBit / s的720p视频(或高度未知的视频)。

您可以使用-f <video-format>+<audio-format>(将ffmpeg或avconv安装)-f bestvideo+bestaudio将两种格式的视频和音频合并到一个文件中,例如,将下载最佳视频格式,最佳音频格式并将其与ffmpeg / avconv混合在一起。

格式选择器也可以使用括号进行分组,例如,如果您要下载高度低于480的最佳mp4和webm格式,则可以使用-f '(mp4,webm)[height<480]'

自2015年4月底和版本2015.04.26起,youtube-dl使用-f bestvideo+bestaudio/best默认格式选择(请参阅#5447#5456)。如果安装了ffmpeg或avconv,则将导致分别下载bestvideo和混合bestaudio并将它们混合到一个文件中,从而提供最佳的整体质量。否则,它会退回best并导致以单个文件的形式下载最佳质量的文件。best非YouTube的视频也需要它,因为它们没有以两个不同的文件提供音频和视频。如果您只想下载某些DASH格式(例如,如果您不希望获得分辨率高于1080p的视频),则可以添加-f bestvideo[height<=?1080]+bestaudio/best到您的配置文件。请注意,如果您使用youtube-dl进行流式传输stdout(并且很可能会将其通过管道传输到媒体播放器),即您将输出模板明确指定为-o -,那么youtube-dl仍会使用-f best格式选择以便立即开始向播放器传输内容而不是等到bestvideobestaudio下载和多路复用。

如果您要保留旧的格式选择行为(在youtube-dl 2015.04.26之前),即要下载质量最佳的媒体作为单个文件,则应使用明确指定选择-f best。您可能需要将其添加到配置文件中,以免每次运行youtube-dl时都将其键入。

格式选择示例

请注意,在Windows上,您可能需要使用双引号而不是单引号。

# Download best mp4 format available or any other best if no mp4 available
$ youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best'

# Download best format available but no better than 480p
$ youtube-dl -f 'bestvideo[height<=480]+bestaudio/best[height<=480]'

# Download best video only format but no bigger than 50 MB
$ youtube-dl -f 'best[filesize<50M]'

# Download best format available via direct link over HTTP/HTTPS protocol
$ youtube-dl -f '(bestvideo+bestaudio/best)[protocol^=http]'

# Download the best video format and the best audio format without merging them
$ youtube-dl -f 'bestvideo,bestaudio' -o '%(title)s.f%(format_id)s.%(ext)s'

请注意,在最后一个示例中,建议使用输出模板,因为bestvideo和bestaudio可能具有相同的文件名。

视频选择

影片可以通过其上传日期使用选项进行过滤--date--datebefore--dateafter。它们接受两种格式的日期:

  • 绝对日期:日期格式YYYYMMDD
  • 相对日期:日期格式 (now|today)[+-][0-9](day|week|month|year)(s)?

例子:

# Download only the videos uploaded in the last 6 months
$ youtube-dl --dateafter now-6months

# Download only the videos uploaded on January 1, 1970
$ youtube-dl --date 19700101

$ # Download only the videos uploaded in the 200x decade
$ youtube-dl --dateafter 20000101 --datebefore 20091231

常问问题

如何更新youtube-dl?

如果您按照我们的手动安装说明进行操作,则可以简单地运行youtube-dl -U(或在Linux上sudo youtube-dl -U)。

如果您使用过pip,则只需进行简单sudo pip install -U youtube-dl更新即可。

如果您已使用apt-getyum等软件包管理器安装了youtube-dl ,请使用标准系统更新机制进行更新。请注意,分发软件包通常已过时。根据经验,youtube-dl每月至少发布一次,并且通常每周发布一次,甚至每天发布一次。只需访问https://yt-dl.org即可找到当前版本。不幸的是,如果您的发行版提供的版本确实过时,那么youtube-dl开发人员将无能为力。您可以(并且应该)在他们的Bugtracker或支持论坛中投诉您的发行版。

作为最后的选择,您还可以卸载软件包管理器安装的版本,并按照我们的手动安装说明进行操作。为此,请删除发行版的程序包,并使用以下行

sudo apt-get remove -y youtube-dl

之后,只需遵循我们的手动安装说明

sudo wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl
hash -r

同样,从那时起,您将能够使用进行更新sudo youtube-dl -U

youtube-dl在Windows上启动非常慢

youtube-dl.exe在Windows Defender设置中添加文件排除项。

Unable to extract OpenGraph title在YouTube播放列表上遇到错误

YouTube在2014年3月及以后更改了播放列表格式,因此您至少需要youtube-dl 2014.07.25才能下载所有YouTube视频。

如果您使用包管理器,pip,setup.py或tarball安装了youtube-dl,请使用该包进行更新。请注意,Ubuntu软件包似乎不再更新。由于我们不隶属于Ubuntu,因此我们几乎无能为力。随意报告错误Ubuntu的包装的人-他们所要做的就是更新包有点最新版本。请参阅上面的更新方法。

尝试使用输出模板时出现错误: error: using output template conflicts with using title, video ID or auto number

请确保您没有使用-o任何的这些选项-t--title--id-A或者--auto-number在命令行或配置文件集。删除后者(如果有)。

我是否总是必须通过-citw

默认情况下,youtube-dl会提供最佳选择(顺便说一句,如果您有令人信服的理由认为它们应该有所不同,请提出问题并在其中说明)。因此,从网页复制长选项字符串是不必要的,有时是有害的。特别是,其中唯一-citw经常有用的选项是-i

你能把-b选项放回去吗?

大多数询问此问题的人都不知道youtube-dl现在默认情况下会下载YouTube报告的最高可用质量,在某些情况下为1080p或720p,因此您不再需要该-b选项。对于某些特定的视频,也许YouTube不会报告您感兴趣的特定高质量格式的视频。在这种情况下,只需使用-f选项进行请求,youtube-dl就会尝试下载。

尝试下载视频时出现HTTP错误402。这是什么?

如果下载过多,显然YouTube要求您通过CAPTCHA测试。我们正在考虑提供一种让您解决CAPTCHA的方法,但是目前,您的最佳做法是将网络浏览器指向youtube URL,解决CAPTCHA,然后重新启动youtube-dl。

我还需要其他程序吗?

youtube-dl在大多数网站上都能正常运行。但是,如果要转换视频/音频,则需要avconvffmpeg。在某些网站(最著名的是YouTube)上,可以以没有声音的更高质量格式检索视频。youtube-dl将检测是否存在avconv / ffmpeg并自动选择最佳选项。

通过RTMP协议流式传输的视频或视频格式只能在安装rtmpdump时下载。下载MMS和RTSP视频需要安装mplayermpv

我已经下载了视频,但如何播放?

完全下载视频后,请使用任何视频播放器,例如mpvvlcmplayer

我使用提取了一个视频网址-g,但无法在其他计算机上/在我的网络浏览器中播放。

这很大程度上取决于服务。在许多情况下,对视频的请求(下载/播放)必须来自相同的IP地址,并具有相同的Cookie和/或HTTP标头。使用该--cookies选项将所需的cookie写入文件,并建议您的下载者从该文件读取cookie。有些网站还要求使用通用用户代理,--dump-user-agent以查看youtube-dl正在使用的代理。您还可以从通过获得的JSON输出中获取必要的Cookie和HTTP标头--dump-json

使用IPv6可能会有所帮助;在某些情况下,限制仅适用于IPv4。某些服务(有时仅针对视频的子集)并不通过IP地址,Cookie或用户代理来限制视频URL,但这是例外,而不是规则。

请记住,某些浏览器支持某些URL协议,包括RTMP。如果您使用-g,则您自己的下载器也必须支持它们。

如果要在未运行youtube-dl的计算机上播放视频,则可以中继来自运行youtube-dl的计算机的视频内容。您可以-o -用来让youtube-dl将视频流式传输到stdout,或者简单地允许播放器依次下载youtube-dl编写的文件。

错误:在视频信息中找不到fmt_url_map或conn信息

YouTube已于2011年7月切换为新的视频信息格式,但旧版本的youtube-dl不支持该格式。有关如何更新youtube-dl的信息请参见上文

错误:无法下载视频

自2012年9月起,YouTube需要附加签名,而youtube-dl的旧版本不支持该签名。有关如何更新youtube-dl的信息请参见上文

视频网址包含&符,我得到一些奇怪的输出[1] 2839'v' is not recognized as an internal or external command

这实际上是您的Shell的输出。由于&符是特殊的Shell字符之一,因此Shell会解释它,从而阻止您将整个URL传递给youtube-dl。要使外壳程序无法解释“与”号(或任何其他特殊字符),您必须将整个URL放在引号中,或者用反斜杠对其进行转义(哪种方法有效取决于您的外壳程序)。

例如,如果您的网址是https://www.youtube.com/watch?t=4&v=BaW_jenozKc,则应该以以下命令结尾:

youtube-dl 'https://www.youtube.com/watch?t=4&v=BaW_jenozKc'

要么

youtube-dl https://www.youtube.com/watch?t=4\&v=BaW_jenozKc

对于Windows,您必须使用双引号:

youtube-dl "https://www.youtube.com/watch?t=4&v=BaW_jenozKc"

ExtractorError:找不到JS函数u’OF’

2015年2月,新版YouTube播放器的字符串中包含一个字符序列,但该字符串被旧版youtube-dl误解了。有关如何更新youtube-dl的信息请参见上文

HTTP错误429:请求过多或402:需要付款

这两个错误代码表明该服务由于滥用而阻止了您的IP地址。通常这是一个软块,这意味着您可以在解决验证码后再次获得访问权限。只需打开浏览器并解决验证码,该服务就会提示您,然后将cookie传递给youtube-dl。请注意,如果您的计算机具有多个外部IP,则还应传递用于解决CAPTCHA的IP --source-address。另外,您可能需要通过传递User-Agent浏览器的HTTP标头--user-agent

如果不是这种情况(服务建议不要提供验证码),则可以联系服务并要求他们取消阻止您的IP地址,或者-如果您已经获取了列入白名单的IP地址,请使用--proxy--source-address选项来选择另一个IP地址。

语法错误:非ASCII字符

错误

File "youtube-dl", line 2
SyntaxError: Non-ASCII character '\x93' ...

表示您使用的是过时的Python版本。请更新至Python 2.6或2.7。

什么是二进制文件?代码哪里去了?

自2012年6月(#342)以来,youtube-dl被打包为可执行zip文件,只需将其解压缩(youtube-dl.zip在某些系统上可能首先需要重命名)或克隆git存储库即可,如上所述。如果修改代码,则可以通过执行__main__.py文件来运行它。要重新编译可执行文件,请运行make youtube-dl

exe由于丢失而引发错误 MSVCR100.dll

要运行exe,您需要先安装Microsoft Visual C ++ 2010可再发行组件包(x86)

在Windows上,我应该如何设置ffmpeg和youtube-dl?我应该把exe文件放在哪里?

如果您将youtube-dl和ffmpeg放在要运行命令的目录中,则可以使用该命令,但这非常麻烦。

要使不同的目录(对于ffmpeg或youtube-dl,或同时对这两种目录)起作用,只需创建目录(例如C:\bin,或C:\Users\<User name>\bin),直接将所有可执行文件放在其中,然后设置PATH环境变量以包含该目录即可目录。

从那时起,重新启动外壳程序后,无论您位于哪个目录,您都可以通过简单地键入youtube-dl或来访问youtube-dl和ffmpeg(并且youtube-dl可以找到ffmpeg)ffmpeg

如何将下载内容放入特定文件夹?

使用-o指定的输出模板,例如-o "/home/user/videos/%(title)s-%(id)s.%(ext)s"。如果您希望所有下载都使用此选项,请将选项放入配置文件中

如何下载以开头的视频-

可以https://www.youtube.com/watch?v=在ID前面加上ID或将ID与选项分开--

youtube-dl -- -wNyEUrxzFU
youtube-dl "https://www.youtube.com/watch?v=-wNyEUrxzFU"

如何将Cookie传递给youtube-dl?

使用--cookies选项,例如--cookies /path/to/cookies/file.txt

为了从浏览器中提取Cookie,请使用任何符合要求的浏览器扩展程序来导出Cookie。例如,cookies.txt(对于Chrome)或cookies.txt(对于Firefox)。

请注意,cookies文件必须为Mozilla / Netscape格式,并且cookie文件的第一行必须为# HTTP Cookie File# Netscape HTTP Cookie File。请确保您有正确的换行格式在饼干或转换新行,如果有必要,以对应你的操作系统,即CRLF\r\n)用于Windows和LF\n)为Unix和类Unix系统(Linux,MacOS的,等等)。HTTP Error 400: Bad Request使用时,--cookies表示换行格式无效。

当特定提取程序未明确实现Cookie时,将cookie传递给youtube-dl是解决登录问题的好方法。另一个用例正在解决CAPTCHA的问题,某些网站要求您在特定情况下进行解决才能获得访问权限(例如YouTube,CloudFlare)。

如何直接流媒体播放器?

您首先需要告诉youtube-dl使用来将媒体流式传输到stdout -o -,还需要告诉媒体播放器从stdin中读取(它必须能够进行流式传输),然后将前者传递到后者。例如,流向vlc可以通过以下方式实现:

youtube-dl -o - "https://www.youtube.com/watch?v=BaW_jenozKcj" | vlc -

如何仅从播放列表下载新视频?

使用下载存档功能。使用此功能,您应该首先下载完整的播放列表,--download-archive /path/to/download/archive/file.txt该列表会将所有视频的标识符记录在一个特殊文件中。随后的每次相同运行均--download-archive只会下载新视频,并跳过之前已下载的所有视频。请注意,只有成功的下载记录在文件中。

例如,首先

youtube-dl --download-archive archive.txt "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"

将下载完整的PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re播放列表并创建一个文件archive.txt。随后的每次运行将仅下载新视频(如果有):

youtube-dl --download-archive archive.txt "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"

我应该添加--hls-prefer-native到我的配置中吗?

youtube-dl检测到HLS视频时,可以使用内置下载器或ffmpeg下载。由于许多HLS流都略微无效,并且ffmpeg / youtube-dl分别处理某些无效情况要比其他情况更好,因此可以根据需要选择切换下载程序。

当youtube-dl知道某个特定的下载程序对于给定的网站效果更好时,就会选择该下载程序。否则,youtube-dl会选择最佳的下载器以实现一般兼容性,而目前恰好是ffmpeg。随着内置下载器和/或ffmpeg的改进,此选择可能会在youtube-dl的未来版本中更改。

特别是,通用提取器(当youtube-dl不在您的网站位于受支持的网站列表中时使用)无法强制使用一个特定的下载器。

如果您将其中一个--hls-prefer-native或一个--hls-prefer-ffmpeg放入配置中,则视频的其他子集将无法正确下载。相反,最好提出一个问题或拉取请求,其中详细说明了为什么本机或ffmpeg HLS下载程序是您使用案例的更好选择。

您可以添加对此动漫视频网站或免费显示当前电影的网站的支持吗?

就政策(以及合法性)而言,youtube-dl不包括对专门侵犯版权的服务的支持。根据经验,如果您无法轻易找到可以明显分发该服务的视频(即由创作者,创作者的发行人上传或以免费许可发布的视频),则该服务可能不适合包含在youtube-dl中。

在服务,他们不举办侵权内容,但只是链接到那些谁做的说明,证据表明,服务应该不会纳入YouTube的-DL。当服务的整个首页上都充斥着不允许分发的视频时,对于任何DMCA注释也是如此。如果该服务未经授权就完整显示受版权保护的视频,那么“合理使用”注释同样令人信服。

不过,对于确实购买了分发其内容的权利的服务的支持请求也可以。如有疑问,您可以仅添加提及合法购买内容的来源。

如何加快我的问题的处理速度?

(也称为:帮助,我的重要问题尚未解决!)youtube-dl核心开发人员团队非常小。尽管我们会尽力解决尽可能多的问题,但有时可能需要一段时间。要加快问题的处理速度,可以执行以下操作:

首先,请务必在我们的问题跟踪器中报告问题。这使我们能够协调用户和开发人员的所有努力,并成为一个统一的观点。不幸的是,youtube-dl项目规模太大,无法使用个人电子邮件作为有效的沟通渠道。

请阅读下面的错误报告说明。许多错误缺少所有必要的信息。如果可以,请向youtube-dl开发人员提供代理,VPN或Shell访问权限。如果可以,请在多个国家/地区的多台计算机上测试该问题,以排除本地检查或配置错误问题。

如果没有人对解决您的问题感兴趣,欢迎您自己解决问题并提交请求请求(或强制/支付其他人这样做)。

您随时可以通过写一条小评论(“问题仍然存在于youtube-dl版本中…来自法国,但来自比利时已解决”)来解决问题,但是每个月请不要超过一次。请不要将您的问题声明为importanturgent

如何检测youtube-dl是否支持给定的URL?

首先,查看支持的站点列表。请注意,有时网站可能会更改其网址方案(例如,从https://example.com/video/1234567更改为https://example.com/v/1234567),而youtube-dl报告的网址为该列表中的服务不受支持。在这种情况下,只需报告一个错误。

这是不是可以检测URL是否支持与否。这是因为youtube-dl包含与所有网址匹配的通用提取器。您可能会尝试禁用,排除或删除通用提取器,但是通用提取器不仅允许用户从许多嵌入了其他服务视频的网站中提取视频,而且还可以用于从具有以下功能的服务中提取视频:它托管自己。因此,我们既不建议也不支持禁用,排除或删除通用提取器。

如果要查找是否支持给定的URL,只需使用它调用youtube-dl。如果没有视频返回,则可能是URL未指向视频或不受支持。您可以通过检查输出(如果您在控制台上运行youtube-dl)来发现哪个内容,或者通过UnsupportedError从Python程序运行它来捕获异常。

为什么在提交错误时需要花那么多繁文red节?

在获得问题模板之前,尽管有大量的错误报告说明,但仍有大约80%的问题报告是无用的,例如,由于人们使用了数百个较旧版本的古老版本,原因是语法简单(不是youtube-dl,而是(通常在shell用法中),因为该问题之前已经多次报告过,因为人们实际上并没有阅读错误消息,即使它说“ please install ffmpeg”,因为人们没有提及他们试图下载的URL,并且许多更简单,易于避免的问题,其中许多问题与youtube-dl完全无关。

youtube-dl是一个开放源代码项目,由很少的志愿者参与,因此我们宁愿花一些时间来修正错误,以便确定那些简单的问题都不适用,并且可以有足够的信心重现该问题,而无需一再问记者。因此,youtube-dl -v YOUR_URL_HERE提交问题实际上就是全部的输出。问题模板还指导您完成一些基本步骤,例如检查youtube-dl版本是否为最新。

开发人员说明

大多数用户不需要构建youtube-dl,就可以下载构建版本或从发行版本中获取它们。

要将youtube-dl作为开发人员运行,您也无需构建任何内容。只需执行

python -m youtube_dl

要运行测试,只需调用您喜欢的测试运行程序,或直接执行测试文件即可;以下任何一项工作:

python -m unittest discover
python test/test_download.py
nosetests

有关如何运行提取器特定测试用例的信息,请参见新的提取器教程的项目6 。

如果您想自己创建youtube-dl版本,则需要

  • python
  • make (only GNU make is supported)
  • pandoc
  • zip
  • nosetests

添加对新站点的支持

如果要添加对新站点的支持,请首先确保该站点不是专门针对版权侵权的。youtube-dl不支持此类网站,因此添加对它们的支持的拉取请求将被拒绝

确保此网站合法分发其内容后,您可以按照以下快速列表进行操作(假设您的服务称为yourextractor):

  1. 分叉此存储库
  2. 使用以下代码检查源代码:
     git clone git@github.com:YOUR_GITHUB_USERNAME/youtube-dl.git
    
  3. 使用以下命令启动一个新的git分支
     cd youtube-dl
     git checkout -b yourextractor
    
  4. 从这个简单的模板开始,并将其保存到youtube_dl/extractor/yourextractor.py
    # coding: utf-8
    from __future__ import unicode_literals
    
    from .common import InfoExtractor
    
    
    class YourExtractorIE(InfoExtractor):
        _VALID_URL = r'https?://(?:www\.)?yourextractor\.com/watch/(?P<id>[0-9]+)'
        _TEST = {
            'url': 'https://yourextractor.com/watch/42',
            'md5': 'TODO: md5 sum of the first 10241 bytes of the video file (use --test)',
            'info_dict': {
                'id': '42',
                'ext': 'mp4',
                'title': 'Video title goes here',
                'thumbnail': r're:^https?://.*\.jpg$',
                # TODO more properties, either as:
                # * A value
                # * MD5 checksum; start the string with md5:
                # * A regular expression; start the string with re:
                # * Any Python type (for example int or float)
            }
        }
    
        def _real_extract(self, url):
            video_id = self._match_id(url)
            webpage = self._download_webpage(url, video_id)
    
            # TODO more code goes here, for example ...
            title = self._html_search_regex(r'<h1>(.+?)</h1>', webpage, 'title')
    
            return {
                'id': video_id,
                'title': title,
                'description': self._og_search_description(webpage),
                'uploader': self._search_regex(r'<div[^>]+id="uploader"[^>]*>([^<]+)<', webpage, 'uploader', fatal=False),
                # TODO more properties (see youtube_dl/extractor/common.py)
            }
  5. 在中添加导入youtube_dl/extractor/extractors.py
  6. 运行python test/test_download.py TestDownload.test_YourExtractor。起初这应该失败,但是您可以继续重新运行它直到完成。如果您决定添加多个测试,则将其重命名_TEST_TESTS字典列表。然后,测试将被命名为TestDownload.test_YourExtractorTestDownload.test_YourExtractor_1TestDownload.test_YourExtractor_2,等注意与测试only_matching关键测试的字典中没有计算在内。
  7. 看看youtube_dl/extractor/common.py可能的辅助方法,以及提取器应该返回详细说明。添加任意数量的测试和代码。
  8. 确保您的代码遵循youtube-dl编码约定,并使用flake8检查代码:
     $ flake8 youtube_dl/extractor/yourextractor.py
    
  9. 确保您的代码在youtube-dl支持的所有Python版本(即2.6、2.7和3.2+)下都能正常工作。
  10. 测试通过后,添加新文件并提交它们,并推送结果,如下所示:
    $ git add youtube_dl/extractor/extractors.py
    $ git add youtube_dl/extractor/yourextractor.py
    $ git commit -m '[yourextractor] Add new extractor'
    $ git push origin yourextractor
    
  11. 最后,创建拉取请求。然后,我们将对其进行审核和合并。

无论如何,非常感谢您的贡献!

youtube-dl编码约定

本节介绍了用于编写惯用的,健壮的和面向未来的提取器代码的指南。

提取程序本质上非常脆弱,因为它们依赖于第三方媒体托管者提供的源数据的布局,而超出了您的控制范围,并且这种布局可能会发生变化。作为提取器实现者,您的任务不仅是编写可以正确提取媒体链接和元数据的代码,而且要最大程度地减少对源布局的依赖性,甚至使代码可以预见潜在的未来变化并为此做好准备。这很重要,因为它将允许提取程序在较小的布局更改时不会中断,从而保持旧的youtube-dl版本正常工作。即使通过发布包含修复程序的新版本youtube-dl可以轻松解决此破损问题,但所有存储库和发行版软件包中的所有先前版本都已损坏,可能无法及时从我们这里获取更新。不用说,

强制和可选元字段

为了使提取工作正常,youtube-dl依赖提取器提取的元数据,并提供给youtube-dl,该字典信息字典或简单的info dict表示。youtube-dl仅将info dict中的以下元字段视为成功提取过程所必需的:

  • id (媒体标识符)
  • title (媒体标题)
  • url (媒体下载网址)或 formats

实际上,从技术上讲,只有最后一个选项是强制性的(即,如果您无法确定媒体的下载位置,则提取没有任何意义)。但是按照惯例,YouTube的-DL也把idtitle强制性。因此,上述元字段是关键数据,如果没有,则提取将毫无意义,如果其中任何一个未能提取,则认为提取器已完全损坏。

除上述字段外,任何字段均视为可选字段。这意味着提取应该容忍这些字段的源可能不可用(即使目前始终可用)并且面向未来的情况,以免破坏通用必填字段的提取。

假设您有一些meta通过HTTP请求以JSON格式获取的源字典,并且它具有一个密钥summary

meta = self._download_json(url, video_id)

假设此时meta的布局为:

{
    ...
    "summary": "some fancy summary text",
    ...
}

假设您要提取summary并将其放入结果信息字典中description。由于description是可选的meta字段,因此您应该准备好该meta字典中可能缺少此键,以便您可以像以下方式提取它:

description = meta.get('summary')  # correct

而不像:

description = meta['summary']  # incorrect

KeyError如果稍后summary消失,则后者将中断提取过程,但如果meta采用前一种方法,则提取将继续进行,并description设置None为完全正确(记住None,等于没有数据)。

同样地,你应该通过fatal=False从网页提取可选的数据时_search_regex_html_search_regex或类似的方法,例如:

description = self._search_regex(
    r'<span[^>]+id="title"[^>]*>([^<]+)<',
    webpage, 'description', fatal=False)

随着fatal设置False,如果_search_regex没有提取description它会发出警告并继续提取。

您还可以通过default=<some fallback value>,例如:

description = self._search_regex(
    r'<span[^>]+id="title"[^>]*>([^<]+)<',
    webpage, 'description', default=None)

失败时,此代码将默默地继续description设置为的提取None。这对于可能存在或可能不存在的元字段很有用。

提供后备

提取元数据时,请尝试从多个来源进行。例如,如果title在多个地方都存在,请尝试从其中至少一些中提取。如果某些来源不可用,这将使它更具前瞻性。

meta从上一个示例中说有一个title,您将要提取它。由于title是强制性的meta字段,因此您应该以如下形式结束:

title = meta['title']

如果由于托管方方面的某些更改而在将来title消失,meta则提取将失败,因为这title是强制性的。那是意料之中的。

假设您还有其他来源可以提取title,例如的og:titleHTML元数据webpage。在这种情况下,您可以提供一个备用方案:

title = meta.get('title') or self._og_search_title(webpage)

此代码将首先尝试从中提取meta,如果失败,则将尝试og:title从中提取webpage

常用表达

不要捕获不使用的组

捕获组必须表明它已在代码中的某处使用。任何未使用的组都必须不可捕获。

不要在此处捕获id属性名称,因为无论如何您都不能使用它。

正确:

r'(?:id|ID)=(?P<id>\d+)'

不正确:

r'(id|ID)=(?P<id>\d+)'

使正则表达式轻松灵活

使用正则表达式时,请尝试将它们写成模糊,宽松和灵活的形式,并跳过那些更可能更改的无关紧要的部分,并允许在单引号和双引号中使用带引号的值,等等。

假设您需要title从以下HTML代码中提取内容:

<span style="position: absolute; left: 910px; width: 90px; float: right; z-index: 9999;" class="title">some fancy title</span>

该任务的代码应类似于:

title = self._search_regex(
    r'<span[^>]+class="title"[^>]*>([^<]+)', webpage, 'title')

甚至更好:

title = self._search_regex(
    r'<span[^>]+class=(["\'])title\1[^>]*>(?P<title>[^<]+)',
    webpage, 'title', group='title')

请注意您如何容忍style属性值的潜在变化,或者从属性的双引号切换为单引号class

该代码绝对不应如下所示:

title = self._search_regex(
    r'<span style="position: absolute; left: 910px; width: 90px; float: right; z-index: 9999;" class="title">(.*?)</span>',
    webpage, 'title', group='title')

长线政策

将代码行的长度限制在80个字符以下是一个软限制。这意味着如果可能并且不使可读性和代码维护性更差时,应予以尊重。

例如,您切勿将长字符串文字(如URL或其他一些经常复制的实体)分割成多行以适应此限制:

正确:

'https://www.youtube.com/watch?v=FqZTN594JQw&list=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4'

不正确:

'https://www.youtube.com/watch?v=FqZTN594JQw&list='
'PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4'

内联值

提取变量对于减少代码重复和提高复杂表达式的可读性是可以接受的。但是,应避免提取仅使用一次的变量并将其移至提取器文件的相对部分,这将导致读取线性流变得困难。

正确:

title = self._html_search_regex(r'<title>([^<]+)</title>', webpage, 'title')

不正确:

TITLE_RE = r'<title>([^<]+)</title>'
# ...some lines of code...
title = self._html_search_regex(TITLE_RE, webpage, 'title')

崩溃后备

多个后备值会很快变得难以处理。通过模式列表将多个后备值折叠为一个表达式。

好:

description = self._html_search_meta(
    ['og:description', 'description', 'twitter:description'],
    webpage, 'description', default=None)

笨重:

description = (
    self._og_search_description(webpage, default=None)
    or self._html_search_meta('description', webpage, default=None)
    or self._html_search_meta('twitter:description', webpage, default=None))

方法支持的模式列表是:_search_regex_html_search_regex_og_search_property_html_search_meta

尾括号

始终在最后一个参数后面加上括号。

正确:

    lambda x: x['ResultSet']['Result'][0]['VideoUrlSet']['VideoUrl'],
    list)

不正确:

    lambda x: x['ResultSet']['Result'][0]['VideoUrlSet']['VideoUrl'],
    list,
)

使用便捷转换和解析功能

从包装所有抽取的数字数据转换成安全功能youtube_dl/utils.pyint_or_nonefloat_or_none。也可以将它们用于字符串到数字的转换。

使用url_or_none安全URL处理。

使用try_get从解析的JSON安全的元数据提取。

使用unified_strdate均匀upload_date或任何YYYYMMDD元现场提取,unified_timestamp用于统一timestamp提取,parse_filesize用于filesize提取,parse_count用于计数元字段提取parse_resolutionparse_duration用于duration提取,parse_age_limit用于age_limit提取。

探索youtube_dl/utils.py更多有用的便利功能。

更多例子

从解析的JSON安全地提取可选描述
description = try_get(response, lambda x: x['result']['video'][0]['summary'], compat_str)
安全地提取更多可选的元数据
video = try_get(response, lambda x: x['result']['video'][0], dict) or {}
description = video.get('summary')
duration = float_or_none(video.get('durationMs'), scale=1000)
view_count = int_or_none(video.get('views'))

嵌入YOUTUBE-DL

youtube-dl会尽最大努力成为一个好的命令行程序,因此应该可以从任何编程语言中调用。如果您在解析其输出时遇到任何问题,请随时创建报告

通过Python程序,您可以以更强大的方式嵌入youtube-dl,如下所示:

from __future__ import unicode_literals
import youtube_dl

ydl_opts = {}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['https://www.youtube.com/watch?v=BaW_jenozKc'])

您最有可能要使用各种选项。有关可用选项的列表,请参阅youtube_dl/YoutubeDL.py。首先,如果您想拦截youtube-dl的输出,请设置一个logger对象。

这是一个更完整的程序示例,该程序仅输出错误(下载完成后会显示一条短消息),并将视频下载/转换为mp3文件:

from __future__ import unicode_literals
import youtube_dl


class MyLogger(object):
    def debug(self, msg):
        pass

    def warning(self, msg):
        pass

    def error(self, msg):
        print(msg)


def my_hook(d):
    if d['status'] == 'finished':
        print('Done downloading, now converting ...')


ydl_opts = {
    'format': 'bestaudio/best',
    'postprocessors': [{
        'key': 'FFmpegExtractAudio',
        'preferredcodec': 'mp3',
        'preferredquality': '192',
    }],
    'logger': MyLogger(),
    'progress_hooks': [my_hook],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['https://www.youtube.com/watch?v=BaW_jenozKc'])

臭虫

错误和建议应在以下网址报告:https : //github.com/ytdl-org/youtube-dl/issues。除非系统提示您或有其他相关原因(例如GitHub无法接受错误报告),否则请勿通过个人电子邮件发送错误报告。如需讨论,请加入freenode(webchat)上的IRC频道#youtube-dl 。

使用时,请包括youtube-dl的完整输出-v,即在命令行中添加 -v标志,复制整个输出,并将其发布在用“`包裹的问题正文中,以获取更好的格式。它看起来应该类似于:

$ youtube-dl -v <your command line>
[debug] System config: []
[debug] User config: []
[debug] Command-line args: [u'-v', u'https://www.youtube.com/watch?v=BaW_jenozKcj']
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
[debug] youtube-dl version 2015.12.06
[debug] Git HEAD: 135392e
[debug] Python version 2.6.6 - Windows-2003Server-5.2.3790-SP2
[debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
[debug] Proxy map: {}
...

不要发布详细日志的屏幕截图;只接受纯文本。

输出(包括第一行)包含重要的调试信息。没有完整输出的问题通常无法重现,因此即使有可能也无法在短期内得到解决。

请再次重新阅读您的问题,以避免几个常见的错误(您可以并且应该将其用作检查清单):

问题本身的描述是否足够?

我们经常收到我们无法真正破译的问题报告。虽然在大多数情况下,我们在多次询问后最终都能获得所需的信息,但这不必要地浪费了我们的资源。许多贡献者(包括我自己)也不是母语人士,因此我们可能会误读某些部分。

因此,请详细说明您要求的功能或要修复的错误。确保它是显而易见的

  • 问题是什么
  • 如何解决
  • 您提出的解决方案将是什么样子

如果您的报告短于两行,则几乎肯定会漏掉其中的一些行,这使我们很难对此做出回应。我们通常太客气,无法彻底解决问题,但缺少的信息可能会造成误解。作为我自己的提交者,我经常对这些问题感到沮丧,因为我要在这些问题上前进的唯一可能方法就是一遍又一遍地要求澄清。

对于错误报告,这意味着您的报告在带有标记时应包含youtube-dl的完整输出-v。您收到的(大多数)错误的错误消息甚至是这样,但您不相信我们有多少错误报告不包含此信息。

如果您的服务器具有多个IP,或者您怀疑存在审查制度,那么添加--call-home诊断可能会是一个好主意。如果错误是ERROR: Unable to extract ...并且您不能从多个国家/地区复制它,请添加--dump-pages(警告:这将产生相当大的输出,log.txt通过添加>log.txt 2>&1到命令行将其重定向到文件)或在某处.dump添加时上传得到的文件。--write-pages

网站支持请求必须包含示例URL。网址示例是您可能要下载的网址,例如https://www.youtube.com/watch?v=BaW_jenozKc。应该有一个明显的视频。除非在非常特殊的情况下,否则视频服务的首页(例如https://www.youtube.com/不是示例URL。

您使用的是最新版本吗?

报告任何问题之前,请键入youtube-dl -U。这应该报告您是最新的。我们收到的报告中约有20%已修复,但是人们使用的是过时的版本。这也适用于功能请求。

该问题是否已记录?

确保没有人打开您要打开的问题。在窗口顶部搜索或浏览此存储库的GitHub Issues。如果存在问题,请随时按照“这也会影响我,2015.01.01版。这里是有关此问题的更多信息:…”的方式编写内容。尽管某些问题可能已经过时,但新的问题通常会刺激快速的活动。

为什么现有的选择还不够?

在请求新功能之前,请快速浏览一下支持的选项列表。许多功能要求是针对实际上已经存在的功能!请,绝对炫耀你的问题报告,并详细已有类似的选项就如何工作解决您的问题。

您的错误报告中是否有足够的上下文?

人们想解决问题,并常常认为他们通过将较大的问题(例如,希望跳过已下载的文件)分解为特定的请求(例如,要求我们在下载信息页面之前先查看文件是否存在),从而对我们有所帮助。但是,经常发生的情况是,他们将问题分解为两个步骤:一个简单,一个不可能(或极其复杂的一个)。

当原始问题可以更容易解决时,例如通过将下载的视频ID记录在一个单独的文件中,我们将面临一个非常复杂的请求。为避免这种情况,您必须在不明显的地方包含更大的上下文。特别是,每个不包含增加对新站点的支持的功能请求都应包含一个用例场景,该场景说明了在什么情况下缺少的功能将很有用。

问题只涉及一个问题,而仅涉及一个问题吗?

我们的一些用户似乎认为可以或应该解决的问题是有限的。他们可以或应该解决的问题没有限制。能够将您的所有问题转成一张票看起来很吸引人,但这意味着解决您的一个问题的人无法将问题标记为已结束。通常,报告一堆问题会导致故障单持续存在,因为没人想攻击该庞然大物,直到有人将问题分成多个问题为止。

特别是,每个站点支持请求问题仅应与一个站点上的服务有关(通常在一个公共域下,但始终使用相同的后端技术)。请勿在同一期中要求支持vimeo用户视频,白宫播客和Google Plus页面。另外,请确保不要在功能请求旁边发布错误报告。根据经验,功能请求不包括与当前功能不立即相关的youtube-dl输出。不要在请求新视频服务的同时发布网络错误报告。

有人需要此功能吗?

仅发布您(或您可以与自己丧失行为能力的朋友交谈)的功能。不要发布功能,因为它们似乎是个好主意。如果它们确实有用,则需要它们的人会要求它们。

您对youtube-dl有疑问吗?

听起来有些奇怪,但是我们收到的一些错误报告与youtube-dl完全无关,并且与其他甚至报告者自己的应用程序有关。请确保您实际上正在使用youtube-dl。如果您使用的是youtube-dl的用户界面,请将该错误报告给提供该用户界面的实际应用程序的维护者。另一方面,如果您认为youtube-dl的用户界面以某种方式失败,则您一定与youtube-dl有关,请继续并报告该错误。

版权

youtube-dl由版权所有者发布到公共领域。

该自述文件最初由Daniel Bolton编写,并且同样已发布到公共领域。

Sentry—跨平台的应用程序监视系统

[download_code]

什么是哨兵?

Sentry是一项服务,可帮助您实时监视和修复应用崩溃问题。该服务端使用Python编写,但是它包含用于在任何应用程序中从任何语言发送事件的完整API。

  

官方 Sentry SDKs

资源

鹡鸰(Wagtail)—专注于灵活性和用户体验的Django内容管理系统

[download_code]

Wagtail是基于Django构建的开源内容管理系统,具有强大的社区和商业支持。它着重于用户体验,并为设计人员和开发人员提供精确的控制方法。

特征

  • 快速,吸引人的作者界面
  • 完全控制前端设计和结构
  • 扩展到数百万个页面和数千个编辑器
  • 开箱即用,在需要时易于缓存
  • 带有去耦前端的“无头”网站的内容API
  • 在Raspberry Pi或多数据中心云平台上运行
  • StreamField鼓励在不影响结构的情况下提供灵活的内容
  • 使用Elasticsearch或PostgreSQL进行强大的集成搜索
  • 对图像和嵌入式内容的出色支持
  • 支持多站点和多语言
  • 拥抱并扩展Django

wagtail.io上找到更多信息

入门

Wagtail在任何平台上均可与Python 3配合使用。

要开始使用Wagtail,请在虚拟环境中运行以下命令:

pip install wagtail
wagtail start mysite
cd mysite
pip install -r requirements.txt
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver

有关详细的安装和设置文档,请参阅docs.wagtail.io

谁在使用它?

美国国家航空航天局,谷歌,乐施会,NHS,Mozilla,麻省理工学院,红十字会,Salesforce,NBC,宝马以及美国和英国政府都使用过g。将您自己的Wagtail网站添加到madewithwagtail.org中

文献资料

docs.wagtail.ioWagtail的完整参考,其中包括针对开发人员,设计人员和编辑人员的指南以及发行说明和路线图。

兼容性

(如果您在GitHub上阅读此内容,则此处的详细信息可能并不表示当前发布的版本-请参阅Wagtail文档中的兼容Django / Python版本。)

支持:

  • Django 2.2.x,3.0.x和3.1.x
  • Python 3.6、3.7、3.8和3.9
  • PostgreSQL,MySQL和SQLite作为数据库后端

Wagtail的早期版本还支持Python 2.7和Django1.x。

社区支持

Wagtail用户和开发人员活跃的社区正在回答有关Stack Overflow的问题。发布问题时,请阅读Stack Overflow有关如何提出问题的建议,并记住将问题标记为“ wa”。

对于不适合Stack Overflow问答格式的主题和讨论,我们有一个Slack工作区和一个Wagtail支持邮件列表。请不要在多个地方提出相同的问题,以尊重志愿者的时间和精力。

我们在Awesome Wagtail维护有精选的第三方软件包,文章和其他资源清单。

商业支持

g是由Torchbox赞助的。如果您需要有关实施或托管Wagtail的帮助,请与我们联系:hello@torchbox.com。另请参见madewithwagtail.org/developers/,以了解世界各地的Wagtail专业开发人员。

安全

我们会认真对待Wagtail和我们维护的相关软件包的安全性。如果您发现我们的任何项目存在安全问题,请给我们发送电子邮件至security@wagtail.io,以便我们共同努力查找并修补该问题。我们感谢负责任的披露以及与安全相关的任何问题,因此在创建Github问题之前,请先与我们联系。

如果要发送加密的电子邮件(可选),那么security@wagtail.io的公钥ID为0x6ba1e1a86e0f8ce8,并且大多数常用的密钥服务器都可以使用此公钥。

发布时间表

Wagtail的功能版本每三个月发布一次。选定的版本被指定为长期支持(LTS)版本,并且将长期接收维护更新,以解决任何与安全性和数据丢失相关的问题。有关过去和即将发布的版本以及支持期的日期,请参阅发布时间表

每晚发布

为了在发布前试用最新功能,我们还每晚从master创建版本。您可以在https://releases.wagtail.io/nightly/index.html上找到有关如何安装最新夜间版本的说明。

贡献

如果您是Python或Django开发人员,请分叉存储库并陷入困境!在Slack工作区中,我们有几个针对开发人员的渠道。

您可能希望先查看贡献准则并检查具有良好第一问题标签的问题

我们也欢迎Wagtail界面的翻译。翻译工作应通过Transifex提交。

执照

BSD

谢谢

我们感谢以下组织为Wagtail的开发提供的服务:


BrowserStack为该项目提供了免费访问其基于Web的实时浏览器测试工具和自动进行Selenium云测试的权限。


Squash为项目提供了免费的测试环境,用于审查请求请求。

      

有趣好用的Python教程

退出移动版
微信支付
请使用 微信 扫码支付