我想从谷歌获取关键字的估计结果数。我使用 Python3.3 并尝试使用 BeautifulSoup 和 urllib.request 完成此任务。到目前为止,这是我的简单代码
def numResults():
try:
page_google = '''http://www.google.de/#output=search&sclient=psy-ab&q=pokerbonus&oq=pokerbonus&gs_l=hp.3..0i10l2j0i10i30l2.16503.18949.0.20819.10.9.0.1.1.0.413.2110.2-6j1j1.8.0....0...1c.1.19.psy-ab.FEBvxrgi0KU&pbx=1&bav=on.2,or.r_qf.&bvm=bv.48705608,d.Yms&'''
req_google = Request(page_google)
req_google.add_header('User Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1')
html_google = urlopen(req_google).read()
soup = BeautifulSoup(html_google)
scounttext = soup.find('div', id='resultStats')
except URLError as e:
print(e)
return scounttext
我的问题是我的汤变量以某种方式进行了编码,并且我无法从中获取任何信息。所以我返回 None 因为 soup.find 不起作用。
我做错了什么以及如何提取想要的结果统计信息? 非常感谢!
由于 Google 搜索结果页面是动态生成的,因此无法使用
urllib
之类的库来抓取它,因为它不会执行返回的 JavaScript 代码。为了从 Google 搜索结果页面中检索结果数量,需要使用像
requests_html
这样的库,该库能够呈现 JavaScript 并模拟网页浏览器。
下面是如何使用
requests_html
抓取 Google 搜索结果计数的示例:
from requests_html import HTMLSession
def get_num_results(query):
"""获取 Google 搜索的结果数量。
Args:
query: 要搜索的查询。
Returns:
Google 搜索的结果数量,或者在发生错误时返回 None。
"""
url = f"https://www.google.com/search?q={query}"
session = HTMLSession()
try:
response = session.get(url)
response.html.render() # 渲染 JavaScript 内容
result_stats = response.html.find('#result-stats', first=True)
if result_stats:
return result_stats.text
else:
return None
except Exception as e:
print(f"发生错误: {e}")
return None
# 示例用法
query = "pokerbonus"
num_results = get_num_results(query)
if num_results:
print(f"查询“{query}”的搜索结果数量为:{num_results}")
else:
print(f"无法检索查询“{query}”的结果数量。")
此代码执行以下操作:
-
导入
HTMLSession
类: 这允许创建可以抓取网站的会话。 -
定义
get_num_results
函数: -
它使用
requests_html
库获取给定查询的 Google 搜索结果页面。 -
它使用
response.html.render()
方法呈现 JavaScript 内容。这对于获取动态生成的内容至关重要。 -
它使用
.find('#result-stats', first=True)
方法查找包含结果数量的 HTML 元素。 -
它从 HTML 元素中提取文本并返回。如果出现任何错误,它将返回
None
。 - 示例用法:
-
它定义了一个查询并调用
get_num_results
函数。 - 它打印结果数量或如果出现错误则打印一条消息。
请注意: 抓取网站(尤其是 Google)时,请务必遵循其服务条款。 Google 对抓取施加了限制,因此请务必适度使用此代码,并在每次请求之间添加延迟,以避免的 IP 地址被阻止。
标签:python,web-scraping,beautifulsoup,urllib2 From: 17496760