Посмотрите на исходный код youtube-dl, например, для загрузки веб-страницы.

Python

1, беги

Загрузите youtube-dl с помощью launch.json,

# 本文中 himala 是代指,具体见文末的 github repo
"configurations": [
        {
            "name": "audio",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}/youtube_dl",
            "console": "integratedTerminal",
            "args": ["-F",  "http://www.himala.com/61425525/sound/47740352/"]
        }
    ]

Затем позвоните напрямуюmain.py

пройти черезmain.py файл, положить

if __package__ is None and not hasattr(sys, 'frozen'):
   import os.path
   path = os.path.realpath(os.path.abspath(__file__))
   sys.path.insert(0, os.path.dirname(os.path.dirname(path)))



заменить

import os.path
path = os.path.realpath(os.path.abspath(__file__))
sys.path.insert(0, os.path.dirname(os.path.dirname(path)))

2, план операции

2.1, вход в программу, получение параметров командной строки, действия

__main__.pyфайл,

if __name__ == '__main__':
   youtube_dl.main()

__init__.pyфайл, иди

def main(argv=None):
    try:
        _real_main(argv)
    except DownloadError:
        sys.exit(1)
    # ...

__init__.pyфайл, затем перейдите

def _real_main(argv=None):
    # 里面做了一个参数配置
    #...
          try:
            if opts.load_info_filename is not None:
                retcode = ydl.download_with_info_file(expand_path(opts.load_info_filename))
            else:
                retcode = ydl.download(all_urls)
        except MaxDownloadsReached:
   #...

2.2, в файле YoutubeDL.py возьмите URL-адрес для загрузки аудио и видео.

class YoutubeDL(object):


   def download(self, url_list):
        # ...
        for url in url_list:
             try:
                # It also downloads the videos
                res = self.extract_info(
                    url, force_generic_extractor=self.params.get('force_generic_extractor', False))
              except UnavailableVideoError:
       # ...
            

В этой функции не только извлекается актуальная информация, но и загружаются веб-страницы, аудио и видео.

все решено

def extract_info(self, url, download=True, ie_key=None, extra_info={},
                     process=True, force_generic_extractor=False):

        if not ie_key and force_generic_extractor:
            ie_key = 'Generic'

        if ie_key:
            ies = [self.get_info_extractor(ie_key)]
        else:
            ies = self._ies

        for ie in ies:
            if not ie.suitable(url):
                continue
            ie = self.get_info_extractor(ie.ie_key())
        # ...
        try:
            ie_result = ie.extract(url)
        # ...

т.е. Info Extract в приведенном выше коде

youtube-dl может обрабатывать информацию со многих веб-сайтов, каждый веб-сайт имеет соответствующий файл Info Extract.

youtube-dl, аудио и видео, все относятся к видео

3. Узнайте т.е.

Как youtube-dl, учитывая url, узнать соответствующий IE

По регулярным, сделать сопоставление

youtube-dl реализует расширяемость поддержки сайта с помощью регулярных выражений

3.1, в коде вышеself._ies, инициализация

3.1.1 self._iesДобавить к

В файле YoutubeDL.py

self._ies, инициализированная запись

class YoutubeDL(object):
	def __init__(self, params=None, auto_init=True):
    	# ...
    	if auto_init:
            self.print_debug_header()
            self.add_default_info_extractors()
		# ...

Пучокgen_extractor_classesинформация внутри,

добавить вself._ies

    def add_default_info_extractors(self):
        """
        Add the InfoExtractors returned by gen_extractors to the end of the list
        """
        for ie in gen_extractor_classes():
            self.add_info_extractor(ie)
            
            
            
    def add_info_extractor(self, ie):
        """Add an InfoExtractor object to the end of the list."""
        self._ies.append(ie)
        # ...
3.1.2 self._iesДобавленный контент

__init__.pyфайл,

_ALL_CLASSESДобавлена ​​папка экстрактораextractors.pyдокументы, на которые имеются ссылки, все начинающиеся сIEконец урока


#...
except ImportError:
    _LAZY_LOADER = False
    from .extractors import *
    _ALL_CLASSES = [
        klass
        for name, klass in globals().items()
        if name.endswith('IE') and name != 'GenericIE'
    ]
    _ALL_CLASSES.append(GenericIE)


def gen_extractor_classes():
    return _ALL_CLASSES

_ALL_CLASSES, порядок этого списка очень важен, сначала сопоставьте его через обычный,

использует IE

3.1.3, Добавить веб-сайт

Поддерживается новый веб-сайт и создается соответствующий файл IE.

extractors.pyВ файле добавьте ссылку следующим образом

from .youtube import (
    YoutubeIE,
    YoutubeChannelIE,
    # ...
}

3.2, узнать соответствующий IE

Улучшено выше, в файле YoutubeDL.py,

def extract_info(self, url, download=True, ie_key=None, extra_info={},
                     process=True, force_generic_extractor=False):

        # ... 
        for ie in ies:
            if not ie.suitable(url):
                continue
            ie = self.get_info_extractor(ie.ie_key())
        # ...

Каждый ie имеет метод классаdef suitable(cls, url):

IE каждого сайта наследуется от

в файле common.pyclass InfoExtractor(object)

class InfoExtractor(object):

    @classmethod
    def suitable(cls, url):
   
        if '_VALID_URL_RE' not in cls.__dict__:
            cls._VALID_URL_RE = re.compile(cls._VALID_URL)
        return cls._VALID_URL_RE.match(url) is not None

Если ie веб-сайта не реализует свой собственныйsuitable,

затем подать заявкуInfoExtractorКатегорияsuitable

IE на веб-сайт

class XimalayaIE(XimalayaBaseIE):
    # 本文中 himala 是代指,具体见文末的 github repo
    IE_NAME = 'himala'
    IE_DESC = 'himala 网站'
    _VALID_URL = r'https?://(?:www\.|m\.)?himala\.com/(?P<uid>[0-9]+)/sound/(?P<id>[0-9]+)'

InfoExtractorкласс, через__dict__Получить, мы настроили_VALID_URLАтрибуты,

Регулярно определяйте его

4. Узнайте информацию о веб-странице

В приведенном выше коде в файле YoutubeDL.py введите ie и выполните следующие действия.

def extract_info(self, url, download=True, ie_key=None, extra_info={},
                     process=True, force_generic_extractor=False):

        # ...
        try:
            ie_result = ie.extract(url)
        # ...

войти первымcommon.pyфайл,InfoExtractorДобрый

    def extract(self, url):
        """Extracts URL information and returns it in list of dicts."""
        try:
            for _ in range(2):
                try:
                    self.initialize()
                    ie_result = self._real_extract(url)
        # ...

Затем введите класс, который действительно делает вещи,himala.pyв файле

Загружайте веб-страницы и регулярно извлекайте информацию

# 本文中 himala 是代指,具体见文末的 github repo
class HimalaIE(InfoExtractor):
    def _real_extract(self, url):
		#...
        webpage = self._download_webpage(url, audio_id,
                                         note='Download sound page for %s' % audio_id,
                                         errnote='Unable to get sound page')
       #  ...
       if is_m:
            audio_description = self._html_search_regex(r'(?s)<section\s+class=["\']content[^>]+>(.+?)</section>',
                                                        webpage, 'audio_description', fatal=False)
        else:
            audio_description = self._html_search_regex(r'(?s)<div\s+class=["\']rich_intro[^>]*>(.+?</article>)',
                                                        webpage, 'audio_description', fatal=False)
       #  ...
                                                        

5. Применение

На сайте Himala у хоста много работ.

В якоре нет функции поиска работы

Просто расширив youtube-dl , можно узнать

Сколько серий Fallout у ведущего и какая страница соответствует

Код простой, см.

github repo

Связанный

launch.json в отладке python, пример youtube-dl

python: сделать, например youtube-dl

Дополнительные блоги об операциях начального уровня см. в их блоге.