【问题标题】:google search with python requests library使用 python 请求库进行谷歌搜索
【发布时间】:2023-12-15 15:41:01
【问题描述】:

(我试过寻找,但所有其他答案似乎都在使用 urllib2)

我刚刚开始尝试使用请求,但我仍然不太清楚如何从页面发送或请求其他内容。例如,我会有

import requests

r = requests.get('http://google.com')

但我现在不知道如何使用显示的搜索栏进行谷歌搜索。我已经阅读了快速入门指南,但我对 HTML POST 等不是很熟悉,所以它不是很有帮助。

有没有一种简洁优雅的方式来完成我的要求?

【问题讨论】:

  • 您可以在没有客户端库的情况下使用 Google API。我在 Python 3 中使用带有 urllib.request 模块的 Google Drive。
  • 好吧,我的意思并不是仅仅针对 Google,还有其他网站/数据库我也希望能够搜索。另外,我认为现在的标准是 requests 模块,因为 urllib/urllib2 已经变得笨重/过时了?
  • 一些方法 (GET) 通过 url 传递参数,其他方法 (POST) 通过数据传递。两者都承认标题(对或关键字和值)

标签: python python-requests google-search google-search-api


【解决方案1】:

发送带有许多查询参数的请求的可读方式是将pass URL parameters作为字典:

params = {
  'q': 'minecraft', # search query
  'gl': 'us',       # country where to search from   
  'hl': 'en',       # language 
}

requests.get('URL', params=params)

但是,为了获得您在浏览器中看到的实际响应(输出/文本/数据),您需要发送额外的 headers,更具体地说:user-agent 需要充当“真实”当机器人或浏览器发送虚假的user-agent 字符串以宣布自己为不同的客户端时,用户访问。

您可以在我写的关于 how to reduce the chance of being blocked while web scraping 的博文中了解更多信息。

通过user-agent:

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'
}

requests.get('URL', headers=headers)

online 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/70.0.3538.102 Safari/537.36 Edge/18.19582'
}

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 工作。

【讨论】:

    【解决方案2】:

    在这段代码中,通过使用bs4,您可以获得所有h3print 的文本

    # 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())
    

    【讨论】:

      【解决方案3】:
      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': text, 'url': url} 格式返回一组 google 结果。最高结果 url 将是 google('search query')[0]['url']

      【讨论】:

      【解决方案4】:

      输入:

      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
      

      【讨论】:

      【解决方案5】:

      请求概览

      Google 搜索请求是一个标准 HTTP GET 命令。它包括与您的查询相关的参数集合。这些参数以名称=值对的形式包含在请求 URL 中,由 & 字符分隔。参数包括搜索查询等数据和用于标识发出 HTTP 请求的 CSE 的唯一 CSE ID (cx)。 WebSearch 或图像搜索服务返回 XML 结果以响应您的 HTTP 请求。

      首先,您必须在Control Panel of Custom Search Engine 获取您的 CSE ID(cx 参数)

      那么,See the official Google Developers site for Custom Search.

      这样的例子很多:

      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
      

      并且解释了您可以使用的参数列表。

      【讨论】: