我正在尝试编写一个Python程序以从Google趋势(GT)收集数据-具体来说,我想自动打开URL并访问标题中显示的特定值。 我已经编写了代码,并且能够成功抓取数据。但是我将代码返回的数据与url中存在的数据进行比较,结果仅部分返回。 例如在下图中,代码返回了第一个标题“曼彻斯特联合足球俱乐部•托特纳姆热刺足球俱乐部”。但实际网站有4个结果:“曼彻斯特联队•托特纳姆热刺队,曼彻斯特国际冠军杯 ”。 google trends image
我们目前已经尝试了页面中所有可能的定位元素,但仍无法为此提供资金。我们不想为此使用粗糙或美丽的汤
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
})
答案 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)•环法自行车赛”]
屏幕截图:
答案 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)