BeautifulSoup脚本解析谷歌搜索结果停止工作
我想用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>
标签(大部分情况下),就可以从谷歌搜索中获取结果。你可以使用 beautifulsoup
、requests
和 lxml
这些库来实现。
下面是获取标题、链接和示例的代码,可以在这个 在线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']))