Zvt 集成A股数据下载及策略开发的好工具

Zvt 既提供了可视化的历史数据浏览方式(web),又提供了A股历史数据的获取接口,是一个好用的股票数据下载工具。

它的使用方式非常简单,下面就教大家如何安装使用这个模块。

1.准备

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

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

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

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

pip install -U zvt

注意,Python版本最好大于等于Python3.6.

2.Zvt Web 界面

如果你想要进入web界面,在安装完成模块后,重启终端,进入你的zvt所属Python环境,执行下面这行命令:

zvt

然后打开  http://127.0.0.1:8050/ 就能看到相关的图表:

3.Zvt 获取数据

想要通过Zvt获取A股股票的基本数据,你只需要这样:

from zvt.domain import *
Stock.record_data(provider="em")
df = Stock.query_data(provider="em", index='code')
print(df)
"""
                     id        entity_id  timestamp entity_type exchange    code   name  list_date end_date
code
000001  stock_sz_000001  stock_sz_000001 1991-04-03       stock       sz  000001   平安银行 1991-04-03     None
000002  stock_sz_000002  stock_sz_000002 1991-01-29       stock       sz  000002  万  科A 1991-01-29     None
000004  stock_sz_000004  stock_sz_000004 1990-12-01       stock       sz  000004   国华网安 1990-12-01     None
000005  stock_sz_000005  stock_sz_000005 1990-12-10       stock       sz  000005   世纪星源 1990-12-10     None
000006  stock_sz_000006  stock_sz_000006 1992-04-27       stock       sz  000006   深振业A 1992-04-27     None
...                 ...              ...        ...         ...      ...     ...    ...        ...      ...
605507  stock_sh_605507  stock_sh_605507 2021-08-02       stock       sh  605507   国邦医药 2021-08-02     None
605577  stock_sh_605577  stock_sh_605577 2021-08-24       stock       sh  605577   龙版传媒 2021-08-24     None
605580  stock_sh_605580  stock_sh_605580 2021-08-19       stock       sh  605580   恒盛能源 2021-08-19     None
605588  stock_sh_605588  stock_sh_605588 2021-08-12       stock       sh  605588   冠石科技 2021-08-12     None
605589  stock_sh_605589  stock_sh_605589 2021-08-10       stock       sh  605589   圣泉集团 2021-08-10     None

[4136 rows x 9 columns]
"""

注意, provider = “em” 指的是 东方财富(eastmoney).

历史数据获取:

from zvt.domain import *
Stock1dHfqKdata.record_data(code='000338', provider='em')
df = Stock1dHfqKdata.query_data(code='000338', provider='em')
print(df)
"""
                              id        entity_id  timestamp provider    code  name level    open   close    high     low     volume      turnover  change_pct  turnover_rate
0     stock_sz_000338_2007-04-30  stock_sz_000338 2007-04-30     None  000338  潍柴动力    1d   70.00   64.93   71.00   62.88   207375.0  1.365189e+09      2.1720         0.1182
1     stock_sz_000338_2007-05-08  stock_sz_000338 2007-05-08     None  000338  潍柴动力    1d   66.60   64.00   68.00   62.88    86299.0  5.563198e+08     -0.0143         0.0492
2     stock_sz_000338_2007-05-09  stock_sz_000338 2007-05-09     None  000338  潍柴动力    1d   63.32   62.00   63.88   59.60    93823.0  5.782065e+08     -0.0313         0.0535
3     stock_sz_000338_2007-05-10  stock_sz_000338 2007-05-10     None  000338  潍柴动力    1d   61.50   62.49   64.48   61.01    47720.0  2.999226e+08      0.0079         0.0272
4     stock_sz_000338_2007-05-11  stock_sz_000338 2007-05-11     None  000338  潍柴动力    1d   61.90   60.65   61.90   59.70    39273.0  2.373126e+08     -0.0294         0.0224
...                          ...              ...        ...      ...     ...   ...   ...     ...     ...     ...     ...        ...           ...         ...            ...
3426  stock_sz_000338_2021-08-27  stock_sz_000338 2021-08-27     None  000338  潍柴动力    1d  331.97  345.95  345.95  329.82  1688497.0  3.370241e+09      0.0540         0.0398
3427  stock_sz_000338_2021-08-30  stock_sz_000338 2021-08-30     None  000338  潍柴动力    1d  345.95  342.72  346.10  337.96  1187601.0  2.377957e+09     -0.0093         0.0280
3428  stock_sz_000338_2021-08-31  stock_sz_000338 2021-08-31     None  000338  潍柴动力    1d  344.41  342.41  351.02  336.73  1143985.0  2.295195e+09     -0.0009         0.0270
3429  stock_sz_000338_2021-09-01  stock_sz_000338 2021-09-01     None  000338  潍柴动力    1d  341.03  336.42  341.03  328.28  1218697.0  2.383841e+09     -0.0175         0.0287
3430  stock_sz_000338_2021-09-02  stock_sz_000338 2021-09-02     None  000338  潍柴动力    1d  336.88  339.03  340.88  329.67  1023545.0  2.012006e+09      0.0078         0.0241

[3431 rows x 15 columns]
"""

财务数据获取:

from zvt.domain import *
FinanceFactor.record_data(code='000338')
FinanceFactor.query_data(code='000338',columns=FinanceFactor.important_cols(),index='timestamp')
"""
            basic_eps  total_op_income    net_profit  op_income_growth_yoy  net_profit_growth_yoy     roe    rota  gross_profit_margin  net_margin  timestamp
timestamp
2002-12-31        NaN     1.962000e+07  2.471000e+06                   NaN                    NaN     NaN     NaN               0.2068      0.1259 2002-12-31
2003-12-31       1.27     3.574000e+09  2.739000e+08              181.2022               109.8778  0.7729  0.1783               0.2551      0.0766 2003-12-31
2004-12-31       1.75     6.188000e+09  5.369000e+08                0.7313                 0.9598  0.3245  0.1474               0.2489      0.0868 2004-12-31
2005-12-31       0.93     5.283000e+09  3.065000e+08               -0.1463                -0.4291  0.1327  0.0603               0.2252      0.0583 2005-12-31
2006-03-31       0.33     1.859000e+09  1.079000e+08                   NaN                    NaN     NaN     NaN                  NaN      0.0598 2006-03-31
...               ...              ...           ...                   ...                    ...     ...     ...                  ...         ...        ...
2020-08-28       0.59     9.449000e+10  4.680000e+09                0.0400                -0.1148  0.0983  0.0229               0.1958      0.0603 2020-08-28
2020-10-31       0.90     1.474000e+11  7.106000e+09                0.1632                 0.0067  0.1502  0.0347               0.1949      0.0590 2020-10-31
2021-03-31       1.16     1.975000e+11  9.207000e+09                0.1327                 0.0112  0.1919  0.0444               0.1931      0.0571 2021-03-31
2021-04-30       0.42     6.547000e+10  3.344000e+09                0.6788                 0.6197  0.0622  0.0158               0.1916      0.0667 2021-04-30
2021-08-31       0.80     1.264000e+11  6.432000e+09                0.3375                 0.3742  0.1125  0.0287               0.1884      0.0653 2021-08-31

[66 rows x 10 columns]
"""

资产负债表、利润表、现金流表:

from zvt.domain import *
BalanceSheet.record_data(code='000338')
IncomeStatement.record_data(code='000338')
CashFlowStatement.record_data(code='000338')

更多数据请看

from zvt.domain import *
print(zvt_context.schemas)
"""
[zvt.domain.dividend_financing.DividendFinancing,
 zvt.domain.dividend_financing.DividendDetail,
 zvt.domain.dividend_financing.SpoDetail...]
"""

4.Zvt 市场筛选

基于query_data的filters参数,你还能实现筛选,比如2018年年报中roe>8%、营收增速>8%的前20只股票:

from zvt.domain import *
df = FinanceFactor.query_data(filters=[FinanceFactor.roe>0.08,FinanceFactor.report_period=='year',FinanceFactor.op_income_growth_yoy>0.08],start_timestamp='2019-01-01',order=FinanceFactor.roe.desc(),limit=20,columns=["code"]+FinanceFactor.important_cols(),index='code')
print(df)
"""
          code  basic_eps  total_op_income    net_profit  op_income_growth_yoy  net_profit_growth_yoy     roe    rota  gross_profit_margin  net_margin  timestamp
code
000048  000048     2.7350     4.919000e+09  1.101000e+09                0.4311                 1.5168  0.7035  0.1988               0.5243      0.2355 2020-04-30
000912  000912     0.3500     4.405000e+09  3.516000e+08                0.1796                 1.2363  4.7847  0.0539               0.2175      0.0795 2019-03-20
002207  002207     0.2200     3.021000e+08  5.189000e+07                0.1600                 1.1526  1.1175  0.1182               0.1565      0.1718 2020-04-27
002234  002234     5.3300     3.276000e+09  1.610000e+09                0.8023                 3.2295  0.8361  0.5469               0.5968      0.4913 2020-04-21
002458  002458     3.7900     3.584000e+09  2.176000e+09                1.4326                 4.9973  0.8318  0.6754               0.6537      0.6080 2020-02-20
...        ...        ...              ...           ...                   ...                    ...     ...     ...                  ...         ...        ...
600701  600701    -3.6858     7.830000e+08 -3.814000e+09                1.3579                -0.0325  1.9498 -0.7012               0.4173     -4.9293 2020-04-29
600747  600747    -1.5600     3.467000e+08 -2.290000e+09                2.1489                -0.4633  3.1922 -1.5886               0.0378     -6.6093 2020-06-30
600793  600793     1.6568     1.293000e+09  1.745000e+08                0.1164                 0.8868  0.7490  0.0486               0.1622      0.1350 2019-04-30
600870  600870     0.0087     3.096000e+07  4.554000e+06                0.7773                 1.3702  0.7458  0.0724               0.2688      0.1675 2019-03-30
688169  688169    15.6600     4.205000e+09  7.829000e+08                0.3781                 1.5452  0.7172  0.4832               0.3612      0.1862 2020-04-28

[20 rows x 11 columns]
"""

5.Zvt 编写策略

Zvt还能编写策略,然后能在页面上查看你策略产生的买入信号和卖出信号:

# -*- coding: utf-8 -*-
import pandas as pd

from zvt.api import get_recent_report_date
from zvt.contract import ActorType, AdjustType
from zvt.domain import StockActorSummary, Stock1dKdata
from zvt.trader import StockTrader
from zvt.utils import pd_is_not_null, is_same_date, to_pd_timestamp


class FollowIITrader(StockTrader):
    finish_date = None

    def on_time(self, timestamp: pd.Timestamp):
        recent_report_date = to_pd_timestamp(get_recent_report_date(timestamp))
        if self.finish_date and is_same_date(recent_report_date, self.finish_date):
            return
        filters = [StockActorSummary.actor_type == ActorType.raised_fund.value,
                   StockActorSummary.report_date == recent_report_date]

        if self.entity_ids:
            filters = filters + [StockActorSummary.entity_id.in_(self.entity_ids)]

        df = StockActorSummary.query_data(filters=filters)

        if pd_is_not_null(df):
            self.logger.info(f'{df}')
            self.finish_date = recent_report_date

        long_df = df[df['change_ratio'] > 0.05]
        short_df = df[df['change_ratio'] < -0.5]
        try:
            self.trade_the_targets(due_timestamp=timestamp, happen_timestamp=timestamp,
                                   long_selected=set(long_df['entity_id'].to_list()),
                                   short_selected=set(short_df['entity_id'].to_list()))
        except Exception as e:
            self.logger.error(e)


if __name__ == '__main__':
    entity_id = 'stock_sh_600519'
    Stock1dKdata.record_data(entity_id=entity_id, provider='em')
    StockActorSummary.record_data(entity_id=entity_id, provider='em')
    FollowIITrader(start_timestamp='2002-01-01', end_timestamp='2021-01-01', entity_ids=[entity_id],
                   provider='em', adjust_type=AdjustType.qfq, profit_threshold=None).run()

它将能输出如下所示的信号图:

更多的功能请见 Zvt 官方文档:zvt.readthedocs.io/en/latest/

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

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

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

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

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

Zulip-Zulip服务器和web应用-功能强大的开源团队聊天

Zulip概述

Zulip是一款功能强大的开源群聊应用程序,它结合了实时聊天的即时性和线程化对话的生产力优势。Zulip被开源项目、财富500强公司、大型标准机构和其他需要实时聊天系统的人使用,该系统允许用户每天轻松处理数百或数千条消息。每月有700多名贡献者合并500多条提交,Zulip也是规模最大、增长最快的开源群聊项目

快速入门

单击下面的相应链接。如果什么都不适用,请加入我们的Zulip community server告诉我们怎么回事!

您可能会对以下内容感兴趣:

您可能还会有兴趣阅读我们的blog或者跟着我们走TwitterZulip分布在Apache 2.0许可证

Zipline-Zipline,一个Python算法交易库

Zipline是一个Pythonic算法交易库。它是用于回溯测试的事件驱动系统。Zipline目前在生产中用作回测和现场交易引擎供电Quantopian–建立和执行交易策略的免费、以社区为中心的托管平台。Quantopian还提供fully managed service for professionals其中包括Zipline、Alphalens、Pyfolio、FactSet数据等

功能

  • 易用性:Zipline试图为您让路,这样您就可以专注于算法开发。有关代码示例,请参见下面的内容
  • “含电池”:许多常见的统计数据,如移动平均和线性回归,都可以很容易地从用户编写的算法中访问
  • PyData集成:历史数据的输入和性能统计数据的输出基于Pandas DataFrames,可以很好地集成到现有的PyData生态系统中
  • 统计和机器学习库:您可以使用matplotlib、scipy、statsmodel和skLearning等库来支持最先进的交易系统的开发、分析和可视化

安装

Zipline目前支持Python 2.7、3.5和3.6,可以通过pip或conda安装

注:安装Zipline比一般的Python包稍微复杂一些。查看完整内容Zipline Install Documentation有关详细说明,请参阅

对于开发安装(用于开发Zipline本身),创建并激活一个viralenv,然后运行etc/dev-install脚本

快速入门

请参阅我们的getting started tutorial

以下代码实现了一个简单的双重移动平均算法

from zipline.api import order_target, record, symbol

def initialize(context):
    context.i = 0
    context.asset = symbol('AAPL')


def handle_data(context, data):
    # Skip first 300 days to get full windows
    context.i += 1
    if context.i < 300:
        return

    # Compute averages
    # data.history() has to be called with the same params
    # from above and returns a pandas dataframe.
    short_mavg = data.history(context.asset, 'price', bar_count=100, frequency="1d").mean()
    long_mavg = data.history(context.asset, 'price', bar_count=300, frequency="1d").mean()

    # Trading logic
    if short_mavg > long_mavg:
        # order_target orders as many shares as needed to
        # achieve the desired number of shares.
        order_target(context.asset, 100)
    elif short_mavg < long_mavg:
        order_target(context.asset, 0)

    # Save values for later inspection
    record(AAPL=data.current(context.asset, 'price'),
           short_mavg=short_mavg,
           long_mavg=long_mavg)

然后,您可以使用Zipline CLI运行此算法。首先,您必须下载一些定价和资产数据示例:

$ zipline ingest
$ zipline run -f dual_moving_average.py --start 2014-1-1 --end 2018-1-1 -o dma.pickle --no-benchmark

这将下载来自Quandl的资产定价数据,并在指定的时间范围内通过算法流式传输。然后,生成的Performance DataFrame保存在dma.pickle,您可以从Python中加载和分析

您可以在zipline/examples目录

有问题吗?

如果您发现了错误,请随时open an issue并填写问题模板

贡献

欢迎所有贡献、错误报告、错误修复、文档改进、增强和想法。有关如何设置开发环境的详细信息,请参阅我们的development guidelines

如果您希望开始使用Zipline代码库,请导航到GitHub问题选项卡,开始查看有趣的问题。有时会有一些问题被标记为Beginner FriendlyHelp Wanted

您可以随时在mailing list或打开Gitter

注意事项

请注意,Zipline不是一个由社区主导的项目。Zipline是由Quantopian工程团队维护的,我们很小,经常很忙

正因为如此,我们想警告您,我们可能在几个月甚至几年内不会处理您的拉请求、问题或直接提及。我们希望您能理解,我们希望这封信能帮助您减少任何挫败感或浪费时间。

zip(* [iter(s)] * n)在Python中如何工作?

问题:zip(* [iter(s)] * n)在Python中如何工作?

s = [1,2,3,4,5,6,7,8,9]
n = 3

zip(*[iter(s)]*n) # returns [(1,2,3),(4,5,6),(7,8,9)]

zip(*[iter(s)]*n)工作如何?如果用更冗长的代码编写,它将是什么样?

s = [1,2,3,4,5,6,7,8,9]
n = 3

zip(*[iter(s)]*n) # returns [(1,2,3),(4,5,6),(7,8,9)]

How does zip(*[iter(s)]*n) work? What would it look like if it was written with more verbose code?


回答 0

iter()是序列上的迭代器。[x] * n产生一个包含n数量的列表x,即一个长度的列表n,其中每个元素都是x*arg将序列解压缩为函数调用的参数。因此,您要向传递3次相同的迭代器zip(),并且每次都会从迭代器中提取一个项目。

x = iter([1,2,3,4,5,6,7,8,9])
print zip(x, x, x)

iter() is an iterator over a sequence. [x] * n produces a list containing n quantity of x, i.e. a list of length n, where each element is x. *arg unpacks a sequence into arguments for a function call. Therefore you’re passing the same iterator 3 times to zip(), and it pulls an item from the iterator each time.

x = iter([1,2,3,4,5,6,7,8,9])
print zip(x, x, x)

回答 1

其他出色的答案和注释很好地解释了参数解压缩zip()的作用

就像Ignacioujukatzel所说的那样,您传递了zip()对同一迭代器的三个引用,并zip()从每个引用到迭代器按顺序生成了三元组的整数:

1,2,3,4,5,6,7,8,9  1,2,3,4,5,6,7,8,9  1,2,3,4,5,6,7,8,9
^                    ^                    ^            
      ^                    ^                    ^
            ^                    ^                    ^

并且由于您要求更详细的代码示例:

chunk_size = 3
L = [1,2,3,4,5,6,7,8,9]

# iterate over L in steps of 3
for start in range(0,len(L),chunk_size): # xrange() in 2.x; range() in 3.x
    end = start + chunk_size
    print L[start:end] # three-item chunks

下面的值startend

[0:3) #[1,2,3]
[3:6) #[4,5,6]
[6:9) #[7,8,9]

FWIW,map()初始参数为,您可以获得相同的结果None

>>> map(None,*[iter(s)]*3)
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

有关更多信息zip(),请访问map()http : //muffinresearch.co.uk/archives/2007/10/16/python-transpose-lists-with-map-and-zip/

The other great answers and comments explain well the roles of argument unpacking and zip().

As Ignacio and ujukatzel say, you pass to zip() three references to the same iterator and zip() makes 3-tuples of the integers—in order—from each reference to the iterator:

1,2,3,4,5,6,7,8,9  1,2,3,4,5,6,7,8,9  1,2,3,4,5,6,7,8,9
^                    ^                    ^            
      ^                    ^                    ^
            ^                    ^                    ^

And since you ask for a more verbose code sample:

chunk_size = 3
L = [1,2,3,4,5,6,7,8,9]

# iterate over L in steps of 3
for start in range(0,len(L),chunk_size): # xrange() in 2.x; range() in 3.x
    end = start + chunk_size
    print L[start:end] # three-item chunks

Following the values of start and end:

[0:3) #[1,2,3]
[3:6) #[4,5,6]
[6:9) #[7,8,9]

FWIW, you can get the same result with map() with an initial argument of None:

>>> map(None,*[iter(s)]*3)
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

For more on zip() and map(): http://muffinresearch.co.uk/archives/2007/10/16/python-transposing-lists-with-map-and-zip/


回答 2

我认为所有答案中都漏掉了一件事(对熟悉迭代器的人来说可能很明显),而对其他人却不太明显:

由于我们具有相同的迭代器,因此它会被消耗,而其余元素将由zip使用。因此,如果我们仅使用列表而不是迭代器。

l = range(9)
zip(*([l]*3)) # note: not an iter here, the lists are not emptied as we iterate 
# output 
[(0, 0, 0), (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8)]

使用迭代器,弹出值并仅保持剩余可用,因此对于zip,一旦消耗了0,则1可用,然后2,依此类推。一件非常微妙的事情,但是非常聪明!!!

I think one thing that’s missed in all the answers (probably obvious to those familiar with iterators) but not so obvious to others is –

Since we have the same iterator, it gets consumed and the remaining elements are used by the zip. So if we simply used the list and not the iter eg.

l = range(9)
zip(*([l]*3)) # note: not an iter here, the lists are not emptied as we iterate 
# output 
[(0, 0, 0), (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8)]

Using iterator, pops the values and only keeps remaining available, so for zip once 0 is consumed 1 is available and then 2 and so on. A very subtle thing, but quite clever!!!


回答 3

iter(s) 返回s的迭代器。

[iter(s)]*n 使s的n次相同迭代器的列表。

因此,在执行时zip(*[iter(s)]*n),它将从列表中的所有三个迭代器中依次提取一个项目。由于所有迭代器都是同一个对象,因此只将列表分组为n

iter(s) returns an iterator for s.

[iter(s)]*n makes a list of n times the same iterator for s.

So, when doing zip(*[iter(s)]*n), it extracts an item from all the three iterators from the list in order. Since all the iterators are the same object, it just groups the list in chunks of n.


回答 4

关于以这种方式使用zip的一个建议。如果长度不能被整除,它将截断您的列表。要解决此问题,如果可以接受填充值,则可以使用itertools.izip_longest。或者,您可以使用如下所示的内容:

def n_split(iterable, n):
    num_extra = len(iterable) % n
    zipped = zip(*[iter(iterable)] * n)
    return zipped if not num_extra else zipped + [iterable[-num_extra:], ]

用法:

for ints in n_split(range(1,12), 3):
    print ', '.join([str(i) for i in ints])

印刷品:

1, 2, 3
4, 5, 6
7, 8, 9
10, 11

One word of advice for using zip this way. It will truncate your list if it’s length is not evenly divisible. To work around this you could either use itertools.izip_longest if you can accept fill values. Or you could use something like this:

def n_split(iterable, n):
    num_extra = len(iterable) % n
    zipped = zip(*[iter(iterable)] * n)
    return zipped if not num_extra else zipped + [iterable[-num_extra:], ]

Usage:

for ints in n_split(range(1,12), 3):
    print ', '.join([str(i) for i in ints])

Prints:

1, 2, 3
4, 5, 6
7, 8, 9
10, 11

回答 5

正是看到什么是在Python解释器发生或可能更容易ipython使用n = 2

In [35]: [iter("ABCDEFGH")]*2
Out[35]: [<iterator at 0x6be4128>, <iterator at 0x6be4128>]

因此,我们有两个指向相同迭代器对象的迭代器的列表。请记住,iter在一个对象上返回一个迭代器对象,在这种情况下,由于使用*2python语法糖,它是同一迭代器两次。迭代器也只能运行一次。

此外,zip采用任意数量的可迭代数(序列iterables),并从每个输入序列的第i个元素创建元组。由于在我们的例子中,两个迭代器是相同的,因此zip对于输出的每个2元素元组两次将相同的迭代器移动两次。

In [41]: help(zip)
Help on built-in function zip in module __builtin__:

zip(...)
    zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]

    Return a list of tuples, where each tuple contains the i-th element
    from each of the argument sequences.  The returned list is truncated
    in length to the length of the shortest argument sequence.

解包(*)操作者确保迭代器运行至耗尽在这种情况下是,直到没有足够的输入以创建一个2元素的元组。

可以将其扩展为的任何值,nzip(*[iter(s)]*n)按照说明进行操作。

It is probably easier to see what is happening in python interpreter or ipython with n = 2:

In [35]: [iter("ABCDEFGH")]*2
Out[35]: [<iterator at 0x6be4128>, <iterator at 0x6be4128>]

So, we have a list of two iterators which are pointing to the same iterator object. Remember that iter on a object returns an iterator object and in this scenario, it is the same iterator twice due to the *2 python syntactic sugar. Iterators also run only once.

Further, zip takes any number of iterables (sequences are iterables) and creates tuple from i’th element of each of the input sequences. Since both iterators are identical in our case, zip moves the same iterator twice for each 2-element tuple of output.

In [41]: help(zip)
Help on built-in function zip in module __builtin__:

zip(...)
    zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]

    Return a list of tuples, where each tuple contains the i-th element
    from each of the argument sequences.  The returned list is truncated
    in length to the length of the shortest argument sequence.

The unpacking (*) operator ensures that the iterators run to exhaustion which in this case is until there is not enough input to create a 2-element tuple.

This can be extended to any value of n and zip(*[iter(s)]*n) works as described.


知乎上这么多推崇学 Python的,如果学完这一套找不到工作怎么办?

Python 的岗位本来就比较少,而且大部分都对经验要求比较高,没有什么初级岗位啊。尤其是非北上广城市,职位数量少,要求反而比一线城市更高,我个人对这些人转行不看好,欢迎指正。

答案:

这个问题,确实很有价值。

毕竟,掌握一门技能,是需要花成本的。决策之前,做个前景判断,衡量投入产出比,是应该的。

然而,一旦深入思考,你可能自己就会对学 Python 的价值,颇为疑虑。

因为大部分人看待这个问题,是在判断 Python 学过后,能否提升自己的竞争力。

国人常说的俗谚,有一句“一招鲜,吃遍天”。也就是掌握了某种供不应求的技能,于是可以坐享这种技能带来的益处与红利。

你可以暂停阅读20秒钟,在头脑里,自行匹配满足上述条件的相应技能,或是代表该技能的证书。

想好后,咱们继续。

这样的技能,确实是存在。但是,要达到“吃遍天”的效果,需要你衡量市场上的供求关系。

我们都知道,近几年市场对 Python 的需求确实很高。许多岗位招聘条件里面,都有 Python 这一项。

然而,供求关系的另一方,也就是供给,情况如何呢?

很不容乐观。

我不是说供给太少,而是太多了些。

别忘了, Python 最大的特点,就是简单易学。

因此,没有门槛,没有护城河,连上小学的孩子,课本上都要教 Python 了

需求再大,如果供给是这样的,价格也很难上去。

所以,如果你的打算,是学好 Python 以后,直接用它变现,那你一定要三思而后行。

这是不是说,你不该学 Python 呢?

恰恰相反,你真的应该学 Python 。

你可能会疑惑:老师,你这不是前后矛盾吗?

不是。

Python 要学,但这项技能,真的不是这么应用的。

连接

Python 无门槛,这么简单,学会了也毫不稀奇,那学它还有什么用?

用处大了。

因为它可以让你和一张巨大的协作网络连接起来。这张网络的溢出效应,对你来说益处可谓巨大。

举个例子。

机器学习听说过吧?最近很火的。

从前人们做机器学习,用的工具叫做 Matlab 。

直到6、7年前,当 Andrew Ng 制作后来成为经典的《机器学习》课程时,用的工具还是 Matlab 。

当然,因为当时 Matlab 很贵,所以 Andrew Ng 鼓励大家用 Octave (一种 Matlab 的开源实现版本)替代。

我学这门课程的时候,很痛苦。其中最重要的原因,就是 Matlab / Octave 的使用。

这是当时做的第 8 次作业,你看看为了做个协同过滤(Collaborative Filtering),需要多少个文件。

随便打开一个代码文件,是这样的:

结果是,大部分学员,根本就不知道,该如何完整撰写一个协同过滤算法的程序。大家只能满足于课程的要求,即在每个文件指定的位置上,做完形填空。

因此,那时候你要是打算使用机器学习,就必须要抱着一本 Matlab 的书啃下来。因为只有明白了它怎么用,你才真正能壮起胆子,尝试从头到尾,去实践自己从 MOOC 学来的机器学习技能。

然而,短短几年之后,事情就完全变了。

2017年,Andrew Ng 的 Coursera 课程《深度学习》推出,这次,他再也不提什么 Matlab 了,从头到尾都是 Python 。

Andrew 教起来轻松,大家学习起来开心。而且更妙的是,因为 Python 简单易懂,因此全部示例代码,你可以很容易看明白,并且知道当应用于自己的实际项目时,修改哪些部分,就可以复用。

其他基于 Python 的机器学习课程,也像雨后春笋一般遍地开花。

例如在 fast.ai 的课程里,实现同样的协同过滤功能,你再也不用写那一堆 Matlab 文件和函数了。

你需要的,仅是以下这几行代码:

from fastai.collab import *
path = untar_data(URLs.ML_SAMPLE)
ratings = pd.read_csv(path/'ratings.csv')
ratings.head()
data = CollabDataBunch.from_df(ratings)
learn = collab_learner(data, n_factors=50, y_range=(0.,5.))
learn.fit_one_cycle(5, 5e-3, wd=0.1)

好了,搞定。

Python 没有门槛。但是通过掌握它,你可以用更短的时间,更高的效率学习和掌握机器学习,甚至是深度学习的技能。

注意,能以这么短短几行代码搞定问题,不是因为你学了 Python ,所以技能大涨。

那是因为这个巨大协作网络中开发框架的人,“刚巧”也是用 Python 来封装细节。你们在说同样的语言,因此你可以把他们的研究成果,“拿来”使用。

越来越多的高手都使用 Python 来编写框架、制作工具,因此会吸引更多人来用。

越来越多的人习惯用 Python 来完成某项功能,那么开发功能的人也被绑定在这个路径上,只能选择用 Python 来开发。

这样的一个正反馈循环,就像在滚雪球。

你可能很为那些好不容易掌握用 Matlab 做机器学习的人鸣不平,似乎他们才是会真功夫的人。而学了 Python 的人,都有作弊之嫌。

才不会。能掌握 Matlab 的人,都可以很容易学会 Python ,他们也可以立即加入这张协作网络,享受这种便利。

好玩儿的是,2017年, Matlab 开源了一本机器学习教材,供大家免费下载。

你猜群众的反馈是啥?

排在第一位的,是这样:

为什么?人家好心好意给你书,你为何不要?

看这个曲线。

这是 Google 趋势上面,用“matlab machine learning”和“python machine learning”分别检索,得来的结果。

可以看到,如果今天你选择用 Matlab 来做机器学习,你的协作网络,和 Python 比起来,小得可以忽略不计。

这网络里面,包括为你打造工具的高手们,为你提供教程的人,也包括你潜在的合作伙伴……

你是希望自己的网络大一些,还是小一些呢?

方法

了解了 Python 的特点,你也就大略知道,该怎么去学它了。

我见过不少初学者,深吸一口气,摆开阵仗,恨不得投入一年的时间,“系统”掌握它。

其实没必要这么如临大敌。

如果教材编写者假设,儿童都能在一个学期内学会 Python ,你一个受过高等教育的成人,学起来应该更轻松才对。

其实你看现在那些好的 MOOC 里面(主题包括但不限于数据分析、数据可视化、机器学习、深度学习……), Python 学习大概是怎么做的。

他们会说,这门课咱们要用到 Python ,所以,本课程的第3章,是 Python 的学习。

对,Python ,这门编程语言,只占了一章的篇幅。

学一章,就掌握 Python 了?

看你怎么定义“掌握”了。

要是说你对 Python 的知识全面系统获取到了,那简直是在骗人。

就像你学龄前的时候,基本上也算能用中文对话了,对吧?

但是,你知道“回”字有四种写法吗?

人家授课者的意思是,学了这些 Python 知识,在他这门课就算够用了。

后面如果出现没有涉及过的函数或者方法,给你简单说几句,就可以继续学习了。

你千万不要用背单词的方式来学 Python ,那效率会低得惨不忍睹。

说句题外话,即便你用背单词的方式来学英语,我也不推荐。

你学 Python ,就应该是快速掌握一个最小核心技能集,例如知道怎么赋值、怎么判断、怎么循环,然后会自定义一个函数,可以输入输出东西……好了,可以上路了。

因为大部分的工作中,主要就用上述这些功能。遇到不明白的,直接查文档。Python 的文档,只要你不嫌弃它太详细就好。

查文档搞不定的问题,也没关系,反正这门语言,世界上有数不清的人都会,论坛上发帖问呗。这是给别人提供实现自我价值的机会。说实话,这机会不好碰到,说不定有人甚至会感谢你的提问呢。

你看,这样一来,你的技能来自于对真实问题的挑战,这样学起来,你的动力更足,学会之后你的满足感更强。而且,你的记忆,会更加深刻。

资源

学习 Python 的资源,我在《如何高效学Python?》一文中已经为你详细做过介绍和推荐,这里就不再赘述了。

此处只介绍我最近发现的2个新资源,都是免费的。

一个是 IBM 提供的系列课程。其中的 Python 基础课,叫做 Python for Data Science ,编号 PY0101EN 。网址在这里

除了免费、自主决定学习进度外,这门课的好处在于提供在线的 Jupyter Lab 编程环境。初学者最容易遇到的环境配置陷阱,在这里统统不存在。

如果你更喜欢读书的方式来学习,这里有一张交互式的数据科学教材汇总图。

你可以着重看其中的 Python 部分。

注意这张学习路线交互图是免费的。里面介绍的书,有的免费,有的收费。你可以酌情选择。

小结

通过阅读本文,希望你能掌握以下知识点:

首先,Python 本身不是什么独门绝艺,不要被人忽悠,以为学了 Python 就能……;
其次,Python 是你连接到一个巨大协作网络的桥梁,网的正外部性会让你充分受益。偏偏这桥梁还没有守卫,因此你,即便是个听到技术就头痛的文科生,也可以轻松进入;
第三,学习 Python ,不要追求系统,更不要舍本逐末去死记硬背知识。采用“快速掌握核心知识+解决实际问题中练习补充”的方式,更为有效;
第四,推荐了一些优质免费资源给你,希望能有帮助。

综上,学 Python ,确实有助于提升你的竞争力。但是再强调一遍,那竞争力,并非来自 Python 本身。

祝学习愉快!

喜欢请点赞和打赏。还可以微信关注和置顶我的公众号“玉树芝兰”(nkwangshuyi)

如果你对 Python 与数据科学感兴趣,不妨阅读我的系列教程索引贴《如何高效入门数据科学?》,里面还有更多的有趣问题及解法。


作者:gashero
链接:https://www.zhihu.com/question/60787862/answer/329788391
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

举几个数字,略残酷,希望不要抹杀了大家的积极性。

中国现存程序员约185万人,2017年高等教育毕业人数795万人。截止2017年末,中国高等教育人口总数约1.85亿。

http://www.sohu.com/a/165615021_475887

http://study.ccln.gov.cn/fenke/shehuixue/shjpwz/shfcyld/381468.shtml

虽然程序员中有极少数没有接受过高等教育,但至少主流是受过高等教育的。这个数字至少意味着每年广义电子信息类毕业生总量是超过程序员历史存量的,或者说,即便是学了未来可能做程序员的专业,大部分人也没法做程序员。

好消息是相对其他专业,程序员的薪资较高,没有过多对历史身份的限制,即不管你之前学啥专业,在哪个学校毕业,只要能力符合要求,就可以成为程序员。

成为程序员的最大门槛,就是脑力,我没有用智力这个词,主要是因为希望脑力这个词也包含了长时间大强度用脑的意思,而不仅仅是灵光一现的智力。

很多人推荐大家从Python入门进入程序员,除了如上薪资高,没身份门槛外的优势外。也是希望能够帮助那些有编程天赋的人发现自己的天赋,并成为程序员。

但这种建议并不能确保你学了Python就能成为程序员,可以说绝大部分人学了以后肯定做不了程序员。

假设程序员的平均职业生命是10年,有些人会做的更长,也有很多人早早转行去创业,做销售,做产品、被辞退之类。那么每年会有18.5万职位空缺出来,加上新增职位,可以假设为每年新产生程序员职位约20万。那么新人就是要抢这大约20万个程序员职位。相对毕业人数,大约是2.5%的人可以成为程序员。

所以,做个比喻,不从悬崖上跳下去,你怎么知道你不是鹰呢?不试试Python,你怎么知道自己不适合编程呢?相对于以往死气沉沉熬资历的时代,有个机会能挑战一下自己已经很美好了。

ZeroNet 使用比特币加密和BitTorrent网络的去中心化网站

ZeroNet

使用比特币加密和BitTorrent网络的分散网站-https://zeronet.io/onion

为什么?

  • 我们相信开放、自由和不受审查的网络和通信
  • 没有单点故障:只要至少有一个对等点在为站点提供服务,站点就会保持在线
  • 无托管费用:网站由访问者提供服务
  • 无法关闭:它无处不在,因为它无处不在
  • 快速且离线工作:即使互联网不可用,您也可以访问网站

功能

  • 实时更新的站点
  • Namecoin.bit域支持
  • 易于设置:解包并运行
  • 只需单击一次即可克隆网站
  • 无密码BIP32基于授权:您的帐户受与您的比特币钱包相同的加密保护
  • 内置支持P2P数据同步的SQL Server:使站点开发更轻松,页面加载速度更快
  • 匿名性:完全支持ToR网络,支持.onion隐藏服务,而不是IPv4地址
  • TLS加密连接
  • 自动打开UPnP端口
  • 支持多用户(Openproxy)的插件
  • 可与任何浏览器/操作系统配合使用

它怎麽工作?

  • 启动后zeronet.py您将能够使用以下工具访问ZERONET站点http://127.0.0.1:43110/{zeronet_address}(例如http://127.0.0.1:43110/1HeLLo4uzjaLetFx6NH3PMwFP3qbRbTf3D)
  • 当您访问新的zeronet站点时,它会尝试使用BitTorrent网络查找对等点,以便可以下载站点文件(html、css、js)。从他们那里
  • 您还将为每个访问过的站点提供服务
  • 每个站点都包含一个content.json包含sha512散列中的所有其他文件和使用站点私钥生成的签名的文件
  • 如果站点所有者(拥有站点地址的私钥)修改站点,则他/她签署新的content.json并将其发布给同行。之后,对等体验证content.json完整性(使用签名),他们下载修改后的文件并将新内容发布给其他对等点

Slideshow about ZeroNet cryptography, site updates, multi-user sites »

Frequently asked questions »

ZeroNet Developer Documentation »

屏幕截图


More screenshots in ZeroNet docs »

如何加入

窗口

MacOS

Linux(x86-64位)

  • wget https://github.com/HelloZeroNet/ZeroNet-linux/archive/dist-linux64/ZeroNet-py3-linux64.tar.gz
  • tar xvpfz ZeroNet-py3-linux64.tar.gz
  • cd ZeroNet-linux-dist-linux64/
  • 从以下内容开始:./ZeroNet.sh
  • 导航到以下位置,在浏览器中打开ZeroHello登录页:http://127.0.0.1:43110/

提示:开始于./ZeroNet.sh --ui_ip '*' --ui_restrict your.ip.address要在Web界面上允许远程连接,请执行以下操作

Android(ARM、ARM 64、x86)

码头工人

有一个官方形象,从源头上构建,地址是:https://hub.docker.com/r/nofish/zeronet/

从源安装

  • wget https://github.com/HelloZeroNet/ZeroNet/archive/py3/ZeroNet-py3.tar.gz
  • tar xvpfz ZeroNet-py3.tar.gz
  • cd ZeroNet-py3
  • sudo apt-get update
  • sudo apt-get install python3-pip
  • sudo python3 -m pip install -r requirements.txt
  • 从以下内容开始:python3 zeronet.py
  • 导航到以下位置,在浏览器中打开ZeroHello登录页:http://127.0.0.1:43110/

当前限制

  • 没有类似激流的文件拆分功能来支持大文件(添加了大文件支持)
  • 不比BitTorrent更匿名(添加了内置完全ToR支持)
  • 未压缩文件事务或尚未加密(添加了TLS加密)
  • 没有私人网站

我如何创建一个ZeroNet站点?

  • 单击>创建新的空站点网站上的菜单项ZeroHello
  • 你会成为重定向一个只能由您修改的全新站点!
  • 您可以在中查找和修改站点内容数据/[您的网站地址]目录
  • 修改打开站点后,向左拖动右上角的“0”按钮,然后按签名发布底部的按钮

下一步:ZeroNet Developer Documentation

帮助保持此项目的活力

赞助商

谢谢!

Zenbot 是一个使用Node.js和MongoDB的命令行加密货币交易机器人

“要走正道,要看师父,跟着师父走,跟师父走,看穿师父,成为师父。”–禅宗谚语

Zenbot

描述

Zenbot是一个使用Node.js和MongoDB的命令行加密货币交易机器人。它的特点是:

免责声明

  • Zenbot并不是一台万无一失的盈利机器。使用它的风险自负。
  • 加密货币仍处于实验阶段,因此Zenbot也是如此。这意味着,这两个都可能在任何时候失败
  • 运行机器人,以及一般的交易都需要仔细研究涉及的风险和参数。错误的设置可能会给您造成重大损失
  • 千万不要让机器人长时间处于无人监视的状态。Zenbot不知道什么时候停止,所以如果损失太大,要做好停止的准备
  • 通常情况下,默认交易参数与买入持有策略相比表现不佳,因此在“全盘押注”之前,运行一些模拟程序,为您选择的交易所/对找到最佳参数。

文档

详细的文档位于docs-folder

问题

首先来看一下docs还有还有FAQs可能会回答你的问题。如果没有,请在Reddit上询问与Zenbot相关的(编程)问题(subreddit zenbot)

社区

加入Zenbot community on Reddit好了!

捐赠

另外,一些人询问如何向Zenbot开发公司捐款。我们接受捐款的地点是比特币地址下图:

carlos8f的BTC(原Zenbot作者)

187rmNSkSvehgcKpBunre6a5wA5hQQop6W

DeviaVir的BTC(当前维护者)

3A5g4GQ2vmjNcnEschCweJJB4umzu66sdY

谢谢!

值得注意的叉子


许可证:麻省理工学院

特此免费授予任何获得本软件副本和相关文档文件(“本软件”)的人不受限制地处理本软件的权限,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售本软件副本的权利,以及允许获得本软件的人员这样做的权利,但受下列条件限制:(A)任何获得本软件副本和相关文档文件(“本软件”)的人均可不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售本软件副本的权利;

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中

软件按“原样”提供,没有任何明示或暗示的担保,包括但不限于适销性、特定用途适用性和不侵权的担保。在任何情况下,作者或版权所有者均不对因软件或在软件中的使用或其他交易而引起、产生或与之相关的任何索赔、损害赔偿或其他责任,无论是在合同诉讼、侵权诉讼或其他诉讼中承担责任

Youtube-dl-gui-用wxPython编写的流行的youtube-dl的跨平台前端GUI

一款流行的跨平台前端GUIyoutube-dl用wxPython编写的媒体下载器。Supported sites

屏幕截图

要求

下载次数

安装

从源安装

  1. 下载并解压缩源代码
  2. 将目录更改为youtube-dl-gui-0.4
  3. python setup.py install

安装PyPi

  1. pip install youtube-dlg

安装Windows Installer

  1. 下载并解压缩Windows Installer
  2. 运行setup.exe文件

贡献

作者

看见AUTHORS文件

许可证

这个Public Domain License

常见问题解答

看见FAQs文件

谢谢

感谢为这个项目做出贡献的每一个人,感谢@philipzae用于设计新的UI布局

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编写,并且同样已发布到公共领域。

Young – Python 开发的功能丰富的社区bbs类网站

[download_code]

Young是一个基于 Tornado 框架、MongoDB 数据库,用Python写的社区软件,功能丰富、界面小清新类似NodeBB的社区软件。

Features:

  • 话题按主题分类,你可以查看某一主题的话题
  • 支持匿名发帖,匿名评论
  • 社交功能(朋友圈,发状态)
  • 像QQ一样即时聊天
  • 实时提醒
  • 资源分享

安装

在Unbuntu 16.04上

git clone https://github.com/shiyanhui/Young.git
cd Young && ./scripts/install.sh

然后设置你的Mongodb环境

1. 修改/etc/mongod.conf,添加

    replication:
        replSetName: rs0

2. 重启Mongodb服务

    service mongod restart

3. 启动mongo,执行initiate

    mongo
    rs.initiate()

下一步需要做的是初始化Mongodb数据库

fab init

如果你想自己搭建Email服务器,运行setup_mail.sh脚本

./scripts/setup_mail.sh

注意:

scripts/install.sh 只在Ubuntu16.04上面测试过,如果你是Ubuntu其他版本或者其他 操作系统,你需要手动安装。scripts/install.sh 稍微修改一下,一步一步安装即可。

依赖

- Mongodb >= 2.6
- Ejabberd >= 16.08
- NSQ >= 0.3.8
- Elasticsearch >= 2.3.5
- NodeJS >= 4.0

Development 开发模式

  • 在运行之前必须启动所有依赖的服务
    fab start_service
  • 在非debug模式中,每次修改后,需要重建资源
    fab build
  • 本地运行
    # 默认为非debug模式,run之前会自动地build
    fab run

    # 启用debug模式
    fab run:debug=true

License

GNU Affero General Public License v3 (AGPL-3).

有趣好用的Python教程

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