您可以通过传递additional URL parameters 获得更准确的结果,例如搜索的国家、语言等:
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('YOUR_URL', params=params)
# or in your case
params = {
"q": "samurai cop, what does katana mean", # query
"gl": "us", # country to search from
"hl": "en" # language
# additional parameters
}
要获取第一个链接,您正在寻找这个 (CSS selectors reference):
first_link = soup.select_one('.yuRUbf a')['href']
接下来会出现的问题是没有指定user-agent。默认的requestsuser-agent 是python-requests,因此Google 会阻止请求,因为它知道这是一个机器人而不是“真正的”用户访问。用户代理通过将此信息添加到 HTTP request headers 来伪造用户访问。
将user-agent 传递给请求headers:
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"
}
response = requests.get('YOUR_URL', headers=headers)
代码:
from bs4 import BeautifulSoup
import requests, json, 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"
}
params = {
"q": "Euler Baubetr. u. Bauleitungsges. mbH",
"gl": "us",
"hl": "en"
}
html = requests.get("https://www.google.com/search", headers=headers, params=params)
soup = BeautifulSoup(html.text, 'lxml')
first_link = soup.select_one('.yuRUbf a')['href']
print(first_link)
# https://www.titanwolf.org/Network/q/45d43c9f-f7d8-4f78-acde-14112341d038/y
或者,您可以使用来自 SerpApi 的 Google Organic Results API 来实现相同的目的。这是一个带有免费计划的付费 API。
您的情况的不同之处在于,您不必处理此类问题或随着时间的推移维护解析器,因为它已经为最终用户完成,唯一需要做的就是迭代结构化 JSON 并快速获取您想要的数据。
要集成的代码:
import os
from serpapi import GoogleSearch
params = {
"engine": "google", # search engine to search from
"q": "Euler Baubetr. u. Bauleitungsges. mbH", # query
"hl": "en", # language
"gl": "us", # country to search from
"api_key": os.getenv("API_KEY"), # API key environment
}
search = GoogleSearch(params)
results = search.get_dict()
# [0] first index result from organic results
first_link = results['organic_results'][0]['link']
print(first_link)
# https://www.titanwolf.org/Network/q/45d43c9f-f7d8-4f78-acde-14112341d038/y
免责声明,我为 SerpApi 工作。