使用Selenium Python检索Google趋势数据中的所有元素

时间:2019-07-25 15:08:02

标签: python selenium selenium-webdriver google-trends

我正在尝试编写一个Python程序以从Google趋势(GT)收集数据-具体来说,我想自动打开URL并访问标题中显示的特定值。 我已经编写了代码,并且能够成功抓取数据。但是我将代码返回的数据与url中存在的数据进行比较,结果仅部分返回。 例如在下图中,代码返回了第一个标题“曼彻斯特联合足球俱乐部•托特纳姆热刺足球俱乐部”。但实际网站有4个结果:“曼彻斯特联队•托特纳姆热刺队,曼彻斯特国际冠军杯      ”。 google trends image

screenshot output of code

我们目前已经尝试了页面中所有可能的定位元素,但仍无法为此提供资金。我们不想为此使用粗糙或美丽的汤

    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
        })

3 个答案:

答案 0 :(得分:0)

这是打印所有信息的代码。

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()

这是输出。

  

['Hertha BSC•FenerbahçeS.K. •德甲•安特·科维奇•柏林”,“法兰克福法兰克福”•欧洲足联欧洲联赛•塔林•爱沙尼亚•法兰克福,“奥格斯堡足球俱乐部•加拉塔萨雷S.K. •马丁•施密特•德甲•斯特凡•罗伊特”,“奥地利国家足球队•国际足联•奥地利•国际足联世界排名”,“列奇亚•格但斯克•布伦比IF•2019-20欧足联欧洲联赛•格但斯克”,“亚历山大·兹维列夫•汉堡”,“朱利安·伦茨(Julian Lenz)•网球专业人士协会•亚历山大·兹维列夫(Alexander Zverev),“欧洲足联欧洲联赛•迭戈•内罗·昆塔纳(Nairo Quintana)•环法自行车赛”]

屏幕截图:

enter image description here

答案 1 :(得分:0)

我们能够找到解决办法。我们必须从内部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)

答案 2 :(得分:0)

据我所知,数据是从可以直接调用的API端点检索的。我展示了如何调用,然后仅提取标题(注意,返回的信息不只是API调用中的标题)。您可以探索返回内容的广度(包括文章摘要,URL,图像链接等)here

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)