Получить все элементы в данных Google Trends с помощью селена Python

Я пытаюсь написать программу Python для сбора данных из Google Trends (GT), в частности, я хочу автоматически открывать URL-адреса и получать доступ к определенным значениям, отображаемым в заголовке. Я написал код, и я могу успешно очистить данные. Но я сравниваю данные, возвращаемые кодом, и данные, присутствующие в URL-адресе, результаты возвращаются лишь частично. Например, на изображении ниже код возвращает первое название «Манчестер Юнайтед ФК • Тоттенхэм Хотспур ФК». Но на самом сайте есть 4 результата «Манчестер Юнайтед ФК • Тоттенхэм Хотспур ФК, Международный кубок чемпионов, Манчестер». изображение тенденций Google

скриншот кода

В настоящее время мы перепробовали все возможные элементы поиска на странице, но по-прежнему не можем найти средства для исправления этой проблемы. Мы не хотели использовать для этого грязный или красивый суп.

    import pandas as pd
    import requests
    import re
    from bs4 import BeautifulSoup
    import time
    from selenium import webdriver

    links=["https://trends.google.com/trends/trendingsearches/realtime?geo=DE&category=s"] 

    for link in links:
        Title_temp=[]
        Titile=''
        seleniumDriver = r"C:/Users/Downloads/chromedriver_win32/chromedriver.exe" 
        chrome_options = Options()
        brow = webdriver.Chrome(executable_path=seleniumDriver, chrome_options=chrome_options)
        try:
            brow.get(link) ## getting the url
            try:
                content = brow.find_elements_by_class_name("details-top")
                for element in content:
                    Title_temp.append(element.text)    
                Title=' '.join(Title_temp)
            except:
                Title=''       
            brow.quit()

        except Exception as error:
            print error
            break

    Final_df = pd.DataFrame(
        {'Title': Title_temp
        })

person Vikram LV    schedule 25.07.2019    source источник
comment
Я могу получить полный текст ['Emanuel Buchmann • Tour de France • Enrico Poitschke', 'Alexander Zverev • Hamburg', 'Nairo Quintana • Tour de France • Col du Galibier • Race stage • France', 'Germany', 'Alexander Zverev • Jan-Lennard Struff • Nicolás Jarry • Tennis • Rothenbaum tournament', 'Hertha BSC • Bundesliga • Fenerbahçe S.K. • Berlin • Ante Čović', 'Tour de France • Tony Martin • Luke Rowe', 'Tottenham Hotspur F.C. • Manchester United F.C. • Manchester • International Champions Cup', 'Am Rothenbaum • Tennis • Hamburg • Association of Tennis Professionals']] с помощью вашего кода.   -  person supputuri    schedule 25.07.2019
comment
@supputuri: Спасибо за ответ. Вы запускали наш код без каких-либо изменений? Потому что когда мы запускаем, мы не получаем полный список   -  person Vikram LV    schedule 25.07.2019
comment
Позвольте мне опубликовать код, который я запустил.   -  person supputuri    schedule 25.07.2019


Ответы (3)


Из того, что я вижу, данные извлекаются из конечной точки API, которую вы можете вызывать напрямую. Я показываю, как вызывать, а затем извлекать только заголовок (обратите внимание, что из вызова API возвращается дополнительная информация, кроме заголовка). Вы можете изучить все, что возвращается (включая фрагменты статей, URL-адреса, ссылки на изображения и т. д.) здесь.

import requests
import json

r = requests.get('https://trends.google.com/trends/api/realtimetrends?hl=en-GB&tz=-60&cat=s&fi=0&fs=0&geo=DE&ri=300&rs=20&sort=0')
data = json.loads(r.text[5:])
titles = [story['title'] for story in data['storySummaries']['trendingStories']]
print(titles)
person QHarr    schedule 29.07.2019
comment
@Спасибо, QHarr. Это действительно круто. Это просто и легко реализовать. - person Vikram LV; 30.07.2019

Вот код, который напечатал всю информацию.

url = "https://trends.google.com/trends/trendingsearches/realtime?geo=DE&category=s"
driver.get(url)
WebDriverWait(driver,30).until(EC.presence_of_element_located((By.CLASS_NAME,'details-top')))
Title_temp = []
try:
    content = driver.find_elements_by_class_name("details-top")
    for element in content:
        Title_temp.append(element.text)
    Title=' '.join(Title_temp)
except:
    Title=''
print(Title_temp)
driver.close()

Вот результат.

['Герта БСК • Фенербахче С.К. • Бундеслига • Анте Чович • Берлин», «Айнтрахт Франкфурт» • Лига Европы УЕФА • Таллинн • Эстония • Франкфурт, «Аугсбург» • «Галатасарай» С.К. • Мартин Шмидт • Бундеслига • Штефан Ройтер», «Сборная Австрии по футболу • ФИФА • Австрия • Мировой рейтинг ФИФА», «Лехия Гданьск • Брондбю • Лига Европы УЕФА 2019–20 • Гданьск», «Александр Зверев • Гамбург», « Джулиан Ленц • Ассоциация теннисистов-профессионалов • Александр Зверев, «Лига Европы УЕФА» • Диего • Найро Кинтана • «Тур де Франс»]

Скриншот:

введите здесь описание изображения

person supputuri    schedule 25.07.2019
comment
Привет, спасибо, что поделились кодом. Но мы все еще не получаем результатов в полной мере. - person Vikram LV; 26.07.2019
comment
Мы также пробовали следующее: 1) использовали последний драйвер Chrome, 2) пробовали драйвер Firefox 3) пытались использовать прокси, но не повезло - person Vikram LV; 26.07.2019
comment
Не могли бы вы поделиться версиями селена, драйвера, браузера. - person supputuri; 26.07.2019
comment
Мы пробовали следующие комбинации: 1) Браузер: Chrome версии 76, драйвер: ChromeDriver 76.0.3809.68 2) Браузер: Chrome версии 75, драйвер: ChromeDriver 75.0.3770.140 3) Браузер: Firefox 68.0, драйвер: geckodriver-v0.24.0-win64. zip 4) версия селена: 2.53.6 - person Vikram LV; 29.07.2019
comment
а как насчет версии на питоне? - person supputuri; 29.07.2019
comment
Спасибо за вашу помощь. Мы смогли решить проблему. мы нашли альтернативу. Теперь мы анализируем весь внутренний html и очищаем его. Попробуйте: elements = brow.find_elements_by_class_name('details-top') для элемента в элементах: html_text = parse_html(element.get_attribute(innerHTML)) title_temp.append(html_text.replace(' поделиться','').стрип()) - person Vikram LV; 29.07.2019
comment
Рад, что вы можете ее решить. Но, все еще думая, в чем может быть причина такого странного поведения... хм - person supputuri; 29.07.2019

Мы смогли найти исправление для этого. Нам пришлось очистить данные из внутреннего html, а затем выполнить некоторую очистку данных, чтобы получить необходимые записи.

import pandas as pd
import requests
import re
from bs4 import BeautifulSoup
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

#html parser
def parse_html(content):    
    from bs4 import BeautifulSoup
    from bs4.element import Comment
    soup = BeautifulSoup(content, 'html.parser')
    text_elements = soup.findAll(text=True)
    tag_blacklist = ['style', 'script', 'head', 'title', 'meta', '[document]','img']
    clean_text = []
    for element in text_elements:
        if element.parent.name in tag_blacklist or isinstance(element, Comment):
            continue
        else:
            text_ = element.strip()
            clean_text.append(text_)
    result_text = " ".join(clean_text)
    result_text = result_text.replace(r'[\r\n]','')
    tag_remove_pattern = re.compile(r'<[^>]+>')
    result_text = tag_remove_pattern.sub('', result_text)
    result_text = re.sub(r'\\','',result_text)
    return result_text

seleniumDriver = r"./chromedriver.exe" 
chrome_options = Options()
brow = webdriver.Chrome(executable_path=seleniumDriver, chrome_options=chrome_options)
links=["https://trends.google.com/trends/trendingsearches/realtime?geo=DE&category=s"]
title_temp = []
for link in links:
    try:
        brow.get(link)
        try:
            elements = brow.find_elements_by_class_name('details-top')
            for element in elements:
                html_text = parse_html(element.get_attribute("innerHTML"))
                title_temp.append(html_text.replace('share','').strip())
        except Exception as error:
            print(error)
        time.sleep(1)
        brow.quit()
    except Exception as error:
        print(error)
        break
Final_df = pd.DataFrame(
    {'Title': title_temp
    })

print(Final_df)
person Vikram LV    schedule 29.07.2019
comment
Я получаю пустой фрейм данных при запуске. - person QHarr; 29.07.2019