Как мне почистить YouTube Channel Creator и дать ссылку на их канал? - PullRequest
1 голос
/ 06 февраля 2020

Я пытаюсь использовать beautifulsoup для извлечения имени создателя канала вместе со ссылкой на его канал со страницы видео.

Here I have the inspector showing the exact line I want to scrape

У меня есть попытался использовать аргумент ключевого слова class_. Я получаю [] в результате. Что мне делать? Нужно ли go через родительский тег div и затем "go down", как говорят в Beautifulsoup? Как / мог бы я go о soup.find для этого конкретного тега и класса?

soup = BeautifulSoup(response.text, "html.parser")

videotitle = soup.find("meta", {"property":"og:title"})["content"]

videochannel = soup.body.find_all("a", class_="yt-simple-endpoint style-scope yt-formatted-string")

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Хорошо, во-первых, вам не нужен Selenium. Селен очень редко бывает нужен. Даже с вызовами javascript / ajax. Если вам когда-либо понадобятся такие глубокие вызовы ajax, вам просто нужно будет получать ключи GET / POST XSFR-Token взад и вперед, пока вы не получите нужные данные. Selenium действительно тяжелый, раздутый и медленный по сравнению с простыми HTTP-вызовами через запросы. Избегайте этого, когда можете. Если вы полностью застряли и не знаете, как перемещаться по ajax -post / request токенам, то обязательно используйте его. Лучше что-то, чем ничего.

Теперь причина, по которой вы не получаете желаемого ответа, заключается в том, что ваш браузер и пакет python -запросов - это два совершенно разных ответа. Так что с самого начала вы даже не можете ориентироваться, куда идете, потому что смотрите не на ту карту. Браузер имеет свою собственную карту, а пакет запросов имеет совершенно другую карту. Вот где пакет PPRINT очень удобен (фото ниже). PPRINT помогает вам увидеть ответ, который вы получаете, более четким, отформатировав текст в более чистой структуре.

Наконец, я использую Jupyter Notebook от Anaconda, потому что он позволяет мне работать с фрагментами кода одновременно, без необходимости запустить всю программу Если вы еще не используете Jupyter Notebooks, я предлагаю вам дать ему go. Это поможет вам увидеть, как все работает с частями вашего вывода, «замороженными во времени».

Желаем удачи! Надеюсь, вы не слишком расстроились. Это все требует времени.

Вот рабочий процесс, который я использовал для решения вашей проблемы:

enter image description here

enter image description here

from bs4 import BeautifulSoup
import requests
import pprint as pp

url = "https://www.youtube.com/watch?v=hHW1oY26kxQ"

response = requests.get(url, headers={'User-Agent':USER_AGENT})
soup = BeautifulSoup(response.text, 'lxml')

for div in soup.find_all("div", {"id": "watch7-user-header"}):
    for a in div.find_all("a"):
        continue
    print(a["href"])
1 голос
/ 06 февраля 2020

Вы можете использовать Selenium, чтобы открыть браузер, затем дать ему URL и найти элементы, используя селекторы CSS. Вот некоторый стартовый код, который может найти искомый элемент:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# Opens a chrome browser window
browser = webdriver.Chrome(executable_path="/PATH/TO/CHROMEDRIVER")                            

# Navigates to a link
browser.get("https://www.youtube.com/watch?v=hHW1oY26kxQ")

time.sleep(5)

# Locate the element using a CSS selector
chilledCowElem = browser.find_element_by_css_selector("div.ytd-channel-name a")

# Access the name of the channel and gets its href value
print(chilledCowElem.text)
print(chilledCowElem.get_attribute("href"))

time.sleep(5)
browser.quit()

Вывод: output

Вы должны подключить путь к драйвер в строке 5. Я использую драйвер Chrome, который вы можете скачать здесь https://sites.google.com/a/chromium.org/chromedriver/downloads. Вот документы по селену, если вы хотите узнать больше о том, как настроить его для своего проекта и использовать его: https://selenium-python.readthedocs.io/installation.html#drivers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...