使用Python requests库进行谷歌搜索
(我试着找过,但其他的回答似乎都在用urllib2)
我刚开始尝试使用requests库,但对于如何从网页发送或请求额外的信息还不是很清楚。例如,我会有
import requests
r = requests.get('http://google.com')
但我现在不知道怎么做,比如说,如何使用提供的搜索框进行谷歌搜索。我看过快速入门指南,但对HTML的POST请求等不太熟悉,所以对我帮助不大。
有没有一种简单优雅的方法来实现我想要的?
6 个回答
在这段代码中,使用了 bs4
这个库,你可以获取所有的 h3
标签,并且打印出它们的文本内容。
# Import the beautifulsoup
# and request libraries of python.
import requests
import bs4
# Make two strings with default google search URL
# 'https://google.com/search?q=' and
# our customized search keyword.
# Concatenate them
text= "c++ linear search program"
url = 'https://google.com/search?q=' + text
# Fetch the URL data using requests.get(url),
# store it in a variable, request_result.
request_result=requests.get( url )
# Creating soup from the fetched request
soup = bs4.BeautifulSoup(request_result.text,"html.parser")
filter=soup.find_all("h3")
for i in range(0,len(filter)):
print(filter[i].get_text())
如果你想发送一个包含很多查询参数的请求,最简单的方法就是把这些参数作为字典形式放在URL里,具体可以参考这个链接。
params = {
'q': 'minecraft', # search query
'gl': 'us', # country where to search from
'hl': 'en', # language
}
requests.get('URL', params=params)
不过,要想获取你在浏览器中看到的实际响应(输出/文本/数据),你还需要发送一些额外的头信息,特别是用户代理。这个用户代理就像是一个“真实”用户的身份标识,当机器人或浏览器发送一个假的user-agent
字符串时,它们会假装成其他客户端。
你的请求可能会被阻止的原因是,默认的requests
用户代理是python-requests
,而网站能够识别这一点。你可以去这里查看你的用户代理是什么。
你可以在我写的博客中了解更多关于如何减少在网络爬虫时被封锁的几率的信息。
传递user-agent
:
headers = {
'User-agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
requests.get('URL', headers=headers)
在这个在线IDE中可以找到代码和示例:
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/107.0.0.0 Safari/537.36'
}
params = {
'q': 'minecraft',
'gl': 'us',
'hl': 'en',
}
html = requests.get('https://www.google.com/search', headers=headers, params=params)
soup = BeautifulSoup(html.text, 'lxml')
for result in soup.select('.tF2Cxc'):
title = result.select_one('.DKV0Md').text
link = result.select_one('.yuRUbf a')['href']
print(title, link, sep='\n')
另外,你也可以通过使用SerpApi的Google Organic API来实现同样的功能。这个API是收费的,但有免费的计划。
这样做的好处是,你不需要从头开始创建和维护它。
集成的代码:
import os
from serpapi import GoogleSearch
params = {
"engine": "google",
"q": "tesla",
"hl": "en",
"gl": "us",
"api_key": os.getenv("API_KEY"),
}
search = GoogleSearch(params)
results = search.get_dict()
for result in results["organic_results"]:
print(result['title'])
print(result['link'])
声明,我在SerpApi工作。
输入:
import requests
def googleSearch(query):
with requests.session() as c:
url = 'https://www.google.co.in'
query = {'q': query}
urllink = requests.get(url, params=query)
print urllink.url
googleSearch('Linkin Park')
输出:
https://www.google.co.in/?q=Linkin+Park
import requests
from bs4 import BeautifulSoup
headers_Get = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate',
'DNT': '1',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1'
}
def google(q):
s = requests.Session()
q = '+'.join(q.split())
url = 'https://www.google.com/search?q=' + q + '&ie=utf-8&oe=utf-8'
r = s.get(url, headers=headers_Get)
soup = BeautifulSoup(r.text, "html.parser")
output = []
for searchWrapper in soup.find_all('h3', {'class':'r'}): #this line may change in future based on google's web page structure
url = searchWrapper.find('a')["href"]
text = searchWrapper.find('a').text.strip()
result = {'text': text, 'url': url}
output.append(result)
return output
这个代码会返回一个包含谷歌搜索结果的数组,每个结果的格式是 {'text': 文本, 'url': 链接}。如果你想要获取最上面的搜索结果的链接,可以用 google('搜索关键词')[0]['url']
这个代码。
请求概述
谷歌搜索请求其实就是一个标准的HTTP GET命令。它包含了一些和你查询相关的参数。这些参数以名称=值的形式出现在请求的URL中,并用&符号分隔。参数里面有像搜索内容和一个独特的CSE ID(cx)这样的数据,这个ID用来识别发出HTTP请求的自定义搜索引擎。WebSearch或Image Search服务会根据你的HTTP请求返回XML格式的结果。
首先,你需要在自定义搜索引擎控制面板获取你的CSE ID(cx参数)。
这里有很多这样的例子:
http://www.google.com/search?
start=0
&num=10
&q=red+sox
&cr=countryCA
&lr=lang_fr
&client=google-csbe
&output=xml_no_dtd
&cx=00255077836266642015:u-scht7a-8i
文档中还解释了你可以使用的参数列表。