如何用漂亮的汤刮掉谷歌搜索的第一个链接
Posted
技术标签:
【中文标题】如何用漂亮的汤刮掉谷歌搜索的第一个链接【英文标题】:How can I scrape the first link of a google search with beautiful soup 【发布时间】:2016-01-30 09:04:38 【问题描述】:我正在尝试制作一个脚本,该脚本将抓取 google 搜索的第一个链接,以便它只返回第一个链接,以便我可以在终端中运行搜索并稍后查看链接搜索词。我正在努力只得到第一个结果。这是迄今为止我得到的最接近的东西。
import requests
from bs4 import BeautifulSoup
research_later = "hiya"
goog_search = "https://www.google.co.uk/search?sclient=psy-ab&client=ubuntu&hs=k5b&channel=fs&biw=1366&bih=648&noj=1&q=" + research_later
r = requests.get(goog_search)
soup = BeautifulSoup(r.text)
for link in soup.find_all('a'):
print research_later + " :"+link.get('href')
【问题讨论】:
为什么 google 搜索 URL 这么长,有这么多不同的参数? (我只是好奇) 【参考方案1】:好像谷歌使用cite
标签来保存链接,所以我们可以像这样使用soup.find('cite').text
:
import requests
from bs4 import BeautifulSoup
research_later = "hiya"
goog_search = "https://www.google.co.uk/search?sclient=psy-ab&client=ubuntu&hs=k5b&channel=fs&biw=1366&bih=648&noj=1&q=" + research_later
r = requests.get(goog_search)
soup = BeautifulSoup(r.text, "html.parser")
print soup.find('cite').text
输出是:
www.urbandictionary.com/define.php?term=hiya
【讨论】:
现在不行了..为什么?它返回错误,例如'''print (soup.find('cite').text) AttributeError: 'NoneType' object has no attribute 'text''''【参考方案2】:您可以使用select_one()
选择CSS
选择器或find()
bs4
方法从页面中仅获取一个元素。要获取 CSS
选择器,您可以使用 SelectorGadget 扩展。
代码和example in the online IDE:
from bs4 import BeautifulSoup
import requests, json
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"
html = requests.get('https://www.google.com/search?q=ice cream', headers=headers).text
soup = BeautifulSoup(html, 'lxml')
# locating .tF2Cxc class
# calling for <a> tag and then calling for 'href' attribute
link = soup.select('.yuRUbf a')['href']
print(link)
# https://en.wikipedia.org/wiki/Ice_cream
或者,您可以使用来自 SerpApi 的 Google Search Engine Results API 来做同样的事情。这是一个带有免费计划的付费 API。
主要区别在于所有内容(选择、绕过块、代理轮换等)都已为最终用户完成并提供 JSON 输出。
要集成的代码:
params =
"engine": "google",
"q": "ice cream",
"api_key": os.getenv("API_KEY"),
search = GoogleSearch(params)
results = search.get_dict()
# [0] - first index from the search results
link = results['organic_results'][0]['link']
print(link)
# https://en.wikipedia.org/wiki/Ice_cream
免责声明,我为 SerpApi 工作。
【讨论】:
以上是关于如何用漂亮的汤刮掉谷歌搜索的第一个链接的主要内容,如果未能解决你的问题,请参考以下文章