Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2020, 14:06   #1
satfan
Пользователь
 
Регистрация: 11.02.2019
Сообщений: 79
По умолчанию Как поправить скрипт-парсер для YouTube?

В файле output.txt после отработки скрипта-парсера YouTube:

Нет заголовков найденных видео перед каждой ссылкой.

Анализ кода страниц YouTube показывает: Вот пример: https://www.youtube.com/watch?v=6LiOBfEmRig&t=2s. В коде страницы значение 6LiOBfEmRig всегда меняется, не подходит. "videoId":"6LiOBfEmRig","title":"Те ория ловли плотвы на поплавок",\
"title":\Заголовок",\ Заголовок всегда между в этом интервале — "title":\ и ",\ Так на любой страница YouTube. Как этот интервал поиска добавить в скрипт?
Код:
# -*- coding: utf-8 -*-
import urllib
import re, os, sys
def findyoutube(x):
    mas=[]
    sq='http://www.youtube.com/results?search_query='+urllib.quote(x)
    doc = urllib.urlopen(sq).read().decode('cp1251',errors='ignore')
    match = re.findall("\?v\=(.+?)\"", doc)
    if not(match is None):
        for ii in match:
            if(len(ii)<25):
                mas.append(ii)
    mas=dict(zip(mas,mas)).values()
    mas2=[]
    for y in mas: mas2.append('http://www.youtube.com/watch?v='+y)
    return mas2
print(findyoutube('болонская+удочка°'))
with open('output.txt', 'w') as output:
    for i in findyoutube('болонская+удочка'):
        output.write(i+'\n')
satfan вне форума Ответить с цитированием
Старый 28.01.2020, 15:32   #2
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Регулярка - (\?v\=(.+?)")+.*(title="(.+?)")

Вот пример - https://regex101.com/r/XprfjT/1

На Python 3.7 при запуске ошибка "attributeerror: module urllib has no attribute quote"

Немного поменял код для запуска на Python 3.7 и добавил выборку из регулярки. Так же поменл кодировки на utf8.

Код:
# -*- coding: utf-8 -*-
import urllib.parse
import urllib.request
import re, os, sys
def findyoutube(x):
    mas=[]
    sq='http://www.youtube.com/results?search_query='+urllib.parse.quote(x)
    doc = urllib.request.urlopen(sq).read().decode('utf8',errors='ignore')
    match = re.findall('(\?v\=(.+?)\")+.*(title="(.+?)\")', doc)
    if not(match is None):
        for ii in match:
            if(len(ii)<25):
                mas.append(ii[1] + ' - ' + ii[3])
    mas=dict(zip(mas,mas)).values()
    mas2=[]
    for y in mas: mas2.append('http://www.youtube.com/watch?v='+y)
    return mas2
print(findyoutube('болонская+удочка°'))
with open('output.txt', 'w', encoding='utf8') as output:
    for i in findyoutube('болонская+удочка'):
        output.write(i+'\n')
Результат в output.txt:
Код:
http://www.youtube.com/watch?v=cGNxRFe9sHs - Азбука поплавочной ловли. Болонская удочка
http://www.youtube.com/watch?v=siVtoTQGrK4 - Подтверждено
http://www.youtube.com/watch?v=QUQlAz3iP_o - Болонская удочка. Ловля на течении
http://www.youtube.com/watch?v=53Qn11CEoX0 - Как оснастить болонскую удочку
http://www.youtube.com/watch?v=ArWOt78L6Gg - ТЕСТ УДОЧКИ С АЛИЭКСПРЕСС | Бюджетная легкая телескопическая болонская поплавочная удочка из карбона
http://www.youtube.com/watch?v=umRh6gIEVcc - Болонская удочка от А до Я
http://www.youtube.com/watch?v=iEx4qPJHfZ8 - Профессиональная рыбалка. Сезон 2. Болонская ловля: выбор удилищ
http://www.youtube.com/watch?v=A6oIeUsshag - Оснащаем болонку правильно!  Осенью с поплавком на реке. На рыбалку с Нормундом #74
http://www.youtube.com/watch?v=S7kVMK9Ol70 - Подтверждено
http://www.youtube.com/watch?v=z19TPhOvLJI - http://1riba.com/
http://www.youtube.com/watch?v=l_4FT4Uvpmc - Тонкости болонской ловли : На рыбалку с Нормундом #48
...
Arkuz вне форума Ответить с цитированием
Старый 28.01.2020, 15:59   #3
satfan
Пользователь
 
Регистрация: 11.02.2019
Сообщений: 79
По умолчанию

Уважаемый Arkuz.
Большое спасибо. Сработал на на Python 3.8
--------------------
Немного неудобно на выходе.
Как поправить, чтобы заголовок стоял на строке выше его ссылки. Пример:
-------------------------------------------------------
Азбука поплавочной ловли. Болонская удочка
http://www.youtube.com/watch?v=cGNxRFe9sHs
Как оснастить болонскую удочку
http://www.youtube.com/watch?v=53Qn11CEoX0

и т.д
satfan вне форума Ответить с цитированием
Старый 28.01.2020, 16:08   #4
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Код:
# -*- coding: utf-8 -*-
import urllib.parse
import urllib.request
import re, os, sys
def findyoutube(x):
    mas=[]
    sq='http://www.youtube.com/results?search_query='+urllib.parse.quote(x)
    doc = urllib.request.urlopen(sq).read().decode('utf8',errors='ignore')
    match = re.findall('(\?v\=(.+?)\")+.*(title="(.+?)\")', doc)
    if not(match is None):
        for ii in match:
            if(len(ii)<25):
                mas.append(ii[3] + '\n*replace*' + ii[1] + '\n')
    mas=dict(zip(mas,mas)).values()
    mas2=[]
    for y in mas: mas2.append(f'{y}'.replace('*replace*', 'http://www.youtube.com/watch?v='))
    return mas2
print(findyoutube('болонская+удочка°'))
with open('output.txt', 'w', encoding='utf8') as output:
    for i in findyoutube('болонская+удочка'):
        output.write(i+'\n')

Последний раз редактировалось Arkuz; 28.01.2020 в 16:16.
Arkuz вне форума Ответить с цитированием
Старый 28.01.2020, 16:23   #5
satfan
Пользователь
 
Регистрация: 11.02.2019
Сообщений: 79
По умолчанию

Наверное у меня ошибка ?
Я вставил в код так:
Код:
# -*- coding: utf-8 -*-
import urllib.parse
import urllib.request
import re, os, sys
def findyoutube(x):
    mas=[]
    sq='http://www.youtube.com/results?search_query='+urllib.parse.quote(x)
    doc = urllib.request.urlopen(sq).read().decode('utf8',errors='ignore')
    match = re.findall('(\?v\=(.+?)\")+.*(title="(.+?)\")', doc)
    if not(match is None):
        for ii in match:
            if(len(ii)<25):
                mas.append(ii[3])
                mas.append(ii[1])
    mas=dict(zip(mas,mas)).values()
    mas2=[]
    for y in mas: mas2.append('http://www.youtube.com/watch?v='+y)
    return mas2
print(findyoutube('болонская+удочка°'))
with open('output.txt', 'w', encoding='utf8') as output:
    for i in findyoutube('болонская+удочка'):
        output.write(i+'\n')
----------------------------------------
Не сработало:
http://www.youtube.com/watch?v=Азбука поплавочной ловли. Болонская удочка
http://www.youtube.com/watch?v=cGNxRFe9sHs
http://www.youtube.com/watch?v=Подтверждено
http://www.youtube.com/watch?v=siVtoTQGrK4
http://www.youtube.com/watch?v=Как оснастить болонскую удочку
http://www.youtube.com/watch?v=53Qn11CEoX0
http://www.youtube.com/watch?v=Болонская удочка. Ловля на течении
satfan вне форума Ответить с цитированием
Старый 28.01.2020, 16:43   #6
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Я обновил свой пост. Вставьте полностью - https://www.programmersforum.ru/show...49&postcount=4
Arkuz вне форума Ответить с цитированием
Старый 28.01.2020, 16:49   #7
satfan
Пользователь
 
Регистрация: 11.02.2019
Сообщений: 79
По умолчанию

Уважаемый Arkuz.
Всё просто супер. Огромное спасибо Вам.
Удачи.
satfan вне форума Ответить с цитированием
Старый 05.09.2020, 08:00   #8
satfan
Пользователь
 
Регистрация: 11.02.2019
Сообщений: 79
По умолчанию

Уважаемый Arkuz.
Может что изменилось в ютубе ?
Скрипт выдаёт ошибку:
Код:
Python 3.8.0a1 (tags/v3.8.0a1:e75eeb00b5, Feb  3 2019, 19:46:54) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> 
Warning (from warnings module):
  File "C:\Users\Александр\Desktop\Парсер youtube\parsery_youtube.py", line 9
    match = re.findall('(\?v\=(.+?)\")+.*(title="(.+?)\")', doc)
SyntaxWarning: invalid escape sequence \?
>>> 
=== RESTART: C:\Users\Александр\Desktop\Парсер youtube\parsery_youtube.py ===
satfan вне форума Ответить с цитированием
Старый 22.09.2020, 00:04   #9
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

У меня скрипт крутится бесконечно. Зависает на строчке
Код:
match = re.findall('(\?v\=(.+?)\")+.*(title="(.+?)\")', doc)
Пока не понятно. Надо разбираться.
Arkuz вне форума Ответить с цитированием
Старый 30.10.2020, 12:58   #10
Noor
Участник клуба
 
Аватар для Noor
 
Регистрация: 01.11.2006
Сообщений: 1,082
По умолчанию

Я все понимаю, энтузиазм и желание творить, но почему бы не восопльзоваться опытом людей которые уже наступили на грабли ?
Есть замечательная программа youtube-dl, которая позволяет взаимодействовать с yt
тык
Noor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсер пожалуйста помогите поправить nikolokaputik80 PHP 3 18.04.2016 11:44
Скрипт для Youtube PowerPro Фриланс 0 18.01.2014 15:12
поправить короткий скрипт Mick_20 JavaScript, Ajax 1 17.08.2013 18:44
Сервер + youtube парсер leo150 Помощь студентам 0 09.06.2012 23:32
Необходимо дописать и поправить парсер!!! maks1985 Фриланс 4 31.05.2010 14:40