Каким должен быть селектор CSS, чтобы найти количество комментариев в видео на YouTube с помощью Selenium в Python? - PullRequest
2 голосов
/ 24 апреля 2020

Установите chromedriver на путь и вставьте URL поиска:

driver = webdriver.Chrome('**************') 
driver.get("https://www.youtube.com/results?search_query=youtube+keywords&sp=EgIQAQ%253D%253D")

Получить ссылки на видео:

user_data = driver.find_elements_by_xpath('//*[@id="video-title"]') <br>
links = []<br>
for i in user_data:<br>
            links.append(i.get_attribute('href'))

Создайте новый df с новой информацией, которую мы соберем:

df = pd.DataFrame(columns = ['v_search', 'v_id','v_comments'])

Найти оставшиеся данные с помощью Selenium:

wait = WebDriverWait(driver, 10)
v_search = "Youtube Keyword" 
for x in links[:1]:<br>
        driver.get(x)<br>
        v_id = x.strip('https://www.youtube.com/watch?v=') 

        ### HERE IS MY QUESTION.
        v_comments = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#count > yt-formatted-string"))).text

        # Throw information in the dataframe we defined before (fills row per row).
        df.loc[len(df)] = [v_search,v_id,v_comments]
        sleep(0.5)    #in seconds

Snapshot of the whole code

Ошибка трассировки

Ответы [ 3 ]

1 голос
/ 24 апреля 2020

С помощью Google Chrome вы можете использовать режим проверки, чтобы получить XPATH, см. Изображение ниже:

Chrome XPATH

Что дает мне XPATH:

//*[@id="count"]/yt-formatted-string

, поэтому:

lol = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="count"]/yt-formatted-string')))
print (lol.text)
1 голос
/ 24 апреля 2020

У меня работает CSS селектор:

#count>.count-text.style-scope.ytd-comments-header-renderer

Проверено как:

document.querySelector("#count>.count-text.style-scope.ytd-comments-header-renderer").innerHTML;

Результат будет похож на - x Комментарии .

PS: Лучше использовать ожидаемое условие visibility_of_element_located. Итак, в вашем случае это будет:

from selenium.webdriver.common.keys import Keys


...
driver.find_element_by_tag_name("body").send_keys(Keys.PAGE_DOWN)
v_comments = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#count>.count-text.style-scope.ytd-comments-header-renderer"))).text

Надеюсь, это вам поможет!

0 голосов
/ 28 апреля 2020

Хорошо, поэтому я выяснил, в чем может быть проблема, если кто-то столкнется с той же ошибкой исключения времени с селеном. Я считаю, что селен работает следующим образом. Драйвер открывает веб-сайт и ищет элемент, который вы ищете. В моем случае это количество комментариев к видео на YouTube. Если ваш элемент находится внизу страницы, где вы его не видите, селен может не поднять его. Итак, я сделал, чтобы драйвер прокрутил страницу вниз, подождите несколько секунд, чтобы она загрузилась. Хотя этого может быть достаточно для некоторых, у меня все еще были проблемы в некоторых случаях. Поэтому я также делаю это до go до 300 (я предполагаю размер экрана) и жду, пока он загрузится. Если это по-прежнему не работает для вас, подумайте о том, чтобы заставить селен перемещать мышь во время загрузки, что может привести к загрузке объекта.

# we will make it rest for 5 seconds
SCROLL_PAUSE_TIME = 0.5
# scroll to the bottom 
driver.execute_script("window.scrollTo(0, 1080)") 
# Wait to load page
time.sleep(SCROLL_PAUSE_TIME)
# scroll to the bottom 
driver.execute_script("window.scrollTo(300, 1080)") 
# Wait to load page
time.sleep(SCROLL_PAUSE_TIME)

ТАКЖЕ, откройте окно драйвера, чтобы вы могли видеть, что он вызывает волшебные движения. c. Это также может заставить его извлекать информацию. Надеюсь это поможет. Я так рад это понять.

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