BeautifulSoup脚本解析谷歌搜索结果停止工作

1 投票
2 回答
2226 浏览
提问于 2025-04-16 11:09

我想用Python来解析谷歌搜索结果。之前一切都运行得很好,但现在我总是得到一个空列表。以下是之前运行得很好的代码:

query = urllib.urlencode({'q': self.Tagsinput.GetValue()+footprint,'ie': 'utf-8', 'num':searchresults, 'start': '100'})
result = url + query1
myopener = MyOpener()
page = myopener.open(result)
xss = page.read()
soup = BeautifulSoup.BeautifulSoup(xss)
contents = [x['href'] for x in soup.findAll('a', attrs={'class':'l'})]

这个脚本在去年十二月运行得非常顺利,现在却停止工作了。

根据我的理解,问题出在这一行:

contents = [x['href'] for x in soup.findAll('a', attrs={'class':'l'})]

当我打印内容时,程序返回的是一个空列表:[]

请大家帮帮我。

2 个回答

0

在写这个回答的时候,你不需要解析 <script> 标签(大部分情况下),就可以从谷歌搜索中获取结果。你可以使用 beautifulsouprequestslxml 这些库来实现。

下面是获取标题、链接和示例的代码,可以在这个 在线IDE 中运行:

import requests, lxml
from bs4 import BeautifulSoup

headers = {
    "User-Agent":
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3538.102 Safari/537.36 Edge/18.19582"
}

html = requests.get(f'https://www.google.com/search?q=minecraft', headers=headers).text
soup = BeautifulSoup(html, 'lxml')

for container in soup.findAll('div', class_='tF2Cxc'):
    title = container.select_one('.DKV0Md').text
    link = container.find('a')['href']
    print(f'{title}\n{link}')

# part of the output:
'''
Minecraft Official Site | Minecraft
https://www.minecraft.net/en-us/
Minecraft Classic
https://classic.minecraft.net/
'''

另外,你也可以使用 SerpApi 的谷歌搜索引擎结果 API 来实现。这是一个付费的 API,但提供 5000 次搜索的免费试用。你可以查看 Playground

下面是集成的代码:

from serpapi import GoogleSearch
import os

params = {
  "api_key": os.getenv("API_KEY"), # environment for API_KEY
  "engine": "google",
  "q": "minecraft",
}

search = GoogleSearch(params)
results = search.get_dict()

for result in results['organic_results']:
  title = result['title']
  link = result['link']
  print(f'{title}\n{link}')

# part of the output:
'''
Minecraft Official Site | Minecraft
https://www.minecraft.net/en-us/
Minecraft Classic
https://classic.minecraft.net/
'''

免责声明,我在 SerpApi 工作。

4

这个接口的效果也好很多。它使用简单的JSON格式,你可以很容易地解析和处理这些数据。

import urllib, json
BASE_URL = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&'
url = BASE_URL + urllib.urlencode({'q' : SearchTerm.encode('utf-8')})
raw_res = urllib.urlopen(url).read()
results = json.loads(raw_res)
hit1 = results['responseData']['results'][0]
prettyresult = ' - '.join((urllib.unquote(hit1['url']), hit1['titleNoFormatting']))

撰写回答