Я хочу просканировать домашнюю страницу YouTube, чтобы вытащить все ссылки на видео. Ниже приведен код
from bs4 import BeautifulSoup
import requests
s='https://www.youtube.com/'
html=requests.get(s)
html=html.text
s=BeautifulSoup(html,features = "html.parser")
for e in s.find_all('a',{'id':'video-title'}):
link=e.get('href')
text=e.string
print(text)
print(link)
print()
Когда я запускаю приведенный выше код, ничего не происходит. Похоже, что идентификатор не обнаруживается. Что я делаю неправильно






Это потому, что вы не получаете тот же HTML, что и ваш браузер.
import requests
from bs4 import BeautifulSoup
s = requests.get("https://youtube.com").text
soup = BeautifulSoup(s,'lxml')
print(soup)
Сохраните вывод этого кода в файл с именем test.html и запустите. Вы увидите, что он не совпадает с браузером, так как выглядит поврежденным.
См. Эти вопросы ниже.
HTML в браузере не соответствует очищенным данным в Python
Запросы Python не дают мне тот же HTML, что и в моем браузере
В принципе, я рекомендую вам использовать Selenium Webdriver, поскольку он работает как браузер.
Да, это странный очиститель, но если вы очистите его на уровне 'div id = "content"', вы сможете получить запрашиваемые данные. Мне удалось получить заголовки каждого видео, но похоже, что на YouTube есть ограничение по скорости или дросселирование, поэтому я не думаю, что вы сможете получить ВСЕ заголовки и ссылки. Во всяком случае, вот что я получил, работая над названиями:
import requests
from bs4 import BeautifulSoup
url = 'https://www.youtube.com/'
response = requests.get(url)
page = response.text
soup = BeautifulSoup(page, 'html.parser')
links = soup.find_all('div', id='content')
for each in links:
print(each.text)
Может быть, это поможет очистить все видео с домашней страницы YouTube,
from bs4 import BeautifulSoup
import requests
r = 'https://www.youtube.com/'
html = requests.get(r)
all_videos = []
soup = BeautifulSoup(html.text, 'html.parser')
for i in soup.find_all('a'):
if i.has_attr('href'):
text = i.attrs.get('href')
if text.startswith('/watch?'):
urls = r+text
all_videos.append(urls)
print('Total Videos', len(all_videos))
print('LIST OF VIDEOS', all_videos)
Этот фрагмент кода выберет все ссылки с домашней страницы youtube.com, которые содержат /watch? в своем атрибуте href (ссылки на видео):
from bs4 import BeautifulSoup
import requests
soup = BeautifulSoup(requests.get('https://www.youtube.com/').text, 'lxml')
for a in soup.select('a[href* = "/watch?"]'):
print('https://www.youtube.com{}'.format(a['href']))
Печать:
https://thewikihow.com/video_pBhkG2Zwf-c
https://thewikihow.com/video_pBhkG2Zwf-c
https://thewikihow.com/video_gnn7GwqXek4
https://thewikihow.com/video_gnn7GwqXek4
https://thewikihow.com/video_AMKDVfucPfA
https://thewikihow.com/video_AMKDVfucPfA
https://thewikihow.com/video_daQcqPHx9uw
https://thewikihow.com/video_daQcqPHx9uw
https://thewikihow.com/video_V_MXGdSBbAI
https://thewikihow.com/video_V_MXGdSBbAI
https://thewikihow.com/video_KEW9U7s_zks
https://thewikihow.com/video_KEW9U7s_zks
https://thewikihow.com/video_EM7ZR5z3kCo
https://thewikihow.com/video_EM7ZR5z3kCo
https://thewikihow.com/video_6NPHk-Yd4VU
https://thewikihow.com/video_6NPHk-Yd4VU
https://thewikihow.com/video_dHiAls8loz4
https://thewikihow.com/video_dHiAls8loz4
https://thewikihow.com/video_2_mDOWLhkVU
https://thewikihow.com/video_2_mDOWLhkVU
...and so on
Разве нам не нужно указывать идентификатор в виде словаря, например {'id': 'content'}