python - Python - 在 Google 中搜索并收集标题和描述
问题描述
我需要在 Google 中从 CSV 文件中搜索几个词,并从 google 搜索中收集 - URL、google 描述和标题。
我设法编写了一个脚本来搜索单词,只收集 URL 并将结果存储在 CSV 文件中。我不知道如何收集 - 标题和谷歌描述。另外,如果找不到我搜索的单词,我需要返回 - “缺失结果”。
from bs4 import BeautifulSoup
from googlesearch import search
import pandas as pd
keywords = pd.read_csv('keywords.csv', header=0, index_col=None)
#print(keywords['keyword'])
df = pd.DataFrame(columns=['keyword', 'url'])
for i in keywords['keyword']:
print('Search results for keyword: ', i)
count = 0
for j in search(i, tld="co.in", num=10, stop=3, pause=2, lang='en'):
count = count + 1
print('URL number ',count, ': ', j)
df = df.append({'keyword': i, 'url': j}, ignore_index=True)
df.to_csv(r'final_dataset.csv', index=False)
解决方案
- 指定
user-agent
以便在发出请求时不被 Google 阻止。我的用户代理是什么? - 尝试SelectorGadget Chrome 扩展程序,
CSS
通过单击所需元素来直观地抓取选择器。
在线 IDE 中的代码和完整示例(注意:以下代码未附加到.csv
,而是会覆盖现有文件):
import pandas as pd
from bs4 import BeautifulSoup
import requests, lxml
headers = {
'User-agent':
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
keywords = pd.read_csv('keywords.csv', header=0, index_col=None)
# collected data
data = []
for query in keywords['keywords']:
html = requests.get(f'https://www.google.com/search?q={query}', headers=headers)
soup = BeautifulSoup(html.text, 'lxml')
for result in soup.select('.tF2Cxc'):
title = result.select_one('.DKV0Md').text
link = result.select_one('.yuRUbf a')['href']
displayed_link = result.select_one('.TbwUpd.NJjxre').text
try:
snippet = result.select_one('#rso .lyLwlc').text
except: snippet = None
print(f'{title}\n{link}\n{displayed_link}\n{snippet}\n')
# appending all data to array as dict()
data.append({
'title': title,
'link': link,
'displayed link': displayed_link,
'snippet': snippet
})
# create dataframe and save it as .csv
df = pd.DataFrame(data)
df.to_csv('bs4_final.csv', index=False)
或者,您也可以使用来自 SerpAPI的Google Organic Results API作为评论中提到的αԋɱҽԃ αмєяιcαη来做到这一点。这是一个带有免费计划的付费 API。
主要区别在于您只需要迭代 JSON 字符串而不做任何额外的事情。
要集成的代码:
from serpapi import GoogleSearch
import os
import pandas as pd
keywords = pd.read_csv('keywords.csv', header=0, index_col=None)
for query in keywords['keywords']:
params = {
"api_key": os.getenv("API_KEY"),
"engine": "google",
"q": query,
"hl": "en",
}
search = GoogleSearch(params)
results = search.get_dict()
data = []
for result in results['organic_results']:
title = result['title']
link = result['link']
displayed_link = result['displayed_link']
snippet = result['snippet']
print(f"{title}\n{link}\n{displayed_link}\n{snippet}\n")
data.append({
'title': title,
'link': link,
'displayed link': displayed_link,
'snippet': snippet
})
df = pd.DataFrame(data)
df.to_csv('serpapi_final.csv', index=False)
PS - 我写了一篇关于如何抓取谷歌有机搜索结果的带有视觉效果 ( gif ) 的博客文章。
免责声明,我为 SerpApi 工作。
推荐阅读
- angular - Angular (7) 组件只接受 html 文件
- nginx - 通过 nginx 作为代理连接到 AWS Neptune 服务器
- java - 将查询结果映射到 REST API 的对象
- python - 根据列值快速删除行的更好方法是什么?
- python - 通过 Flask 将音频文件从 mp3 转换为 flac,并保存在 Google Cloud Storage
- php - 如何使用同步方法 laravel 添加额外数据
- android - 当我在 onResponse 中调用一个对象时,发布构建时出现 NullpointerException
- android - 如何在不打开本机电话拨号器或要求选择通话应用程序的情况下从本机拨打电话
- c# - Xamarin Forms:UI 未从事件更新
- reactjs - React.JS 中的 CSS 模块