Парсинг видео с канала Youtube (Python, BeautifulSoup, requests)
Есть вот такой код:
from bs4 import BeautifulSoup
import requests
ycid = input('Введите код-идентификатор канала: ') #получение идентификатор канала
url = f'https://www.youtube.com/channel/{ycid}' #создание ссылки на канал
HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 7.0; Win32; x32) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
print(f'Парсим с канала: {url}')
html = requests.get(url, headers = HEADERS )
html = html.text
soup = BeautifulSoup(html, 'lxml')
div_tags = soup.find_all('div', {'class': 'style-scope ytd-grid-video-renderer', 'id': 'dismissable'})
print(div_tags)
a_tags = [div.find('a') for div in div_tags]
print(a_tags)
url_img = [a['href'] for a in a_tags]
print(url_img)
Код должен парсить первое видео с указанного канала, но он выдаёт пустые списки.
Итог:
Введите код-индитификатор канала: UCviSYAcwdnDX1UoRzAHYgNg
Парсим с канала: https://www.youtube.com/channel/UCviSYAcwdnDX1UoRzAHYgNg
[]
[]
[]
Как можно исправить код?
Ответы (1 шт):
Рассмотри некоторый канал. Просмотрим код страницы при помощи Ctr + U
Если мы выполним поиск по названию какого то видео, то мы заметим что он присутствует в коде, но не в виде HTML.
Дело в том что BS видит код, таким как он был до выполнения всех скриптов и.т.п., что может отличаться от html кода в средстве отладки вашего браузера. Вы можете получать r.content а далее про помощи json парсера выуживать информацию. В принципе ссылки на видео получить и без использования этого метода:

Так как вы новичок то я бы порекомендовал использовать связку Selenium + geckodriver + BeautifulSoup. Selenium зайдёт на страницу, выполнить javascript-ы и выгрузит полученый html - код в BS. Каждое видео это отдельный ytd-grid-video-renderer c классом "style-scope ytd-grid-renderer"
Название видео содержится в атрибуте title тега с id = "video-title"
В href содержится ссылка без домена (/watch?v=HQxZaeGxwQs)
Пример кода:
from selenium import webdriver
from bs4 import BeautifulSoup as BS
URL = "" #Ваш урл
driver = webdriver.Chrome()
driver.get(URL)
time.sleep(10) #Можно ждать до загрузки страницы, но проще подождать 10 секунд, их хватит с запасом
html = driver.page_source
Теперь в переменной html код нашей страницы. Найдём в нем все видеоролики и названия к ним:
soup = BS(html, "html.parser")
videos = soup.find_all("ytd-grid-video-renderer",{"class":"style-scope ytd-grid-renderer"})
for video in videos:
a = video.find("a",{"id":"video-title"})
name = link.get_text()
link = "https://www.youtube.com/" + a.get("href")
print(name, link)
Аналогичный вопрос: тыk



