有没有现成的Python轮子可以抓取指定数量的Google或百度搜索结果?
需要用到抓取 google 或者百度 搜索结果的前 900 个标题+简介,有没有现成的轮子?爬虫的话应该会被封吧?
有没有现成的Python轮子可以抓取指定数量的Google或百度搜索结果?
爬虫 + 代理
有,requests-html 和 googlesearch-python 都能干这事儿,但得注意点。
1. 用 googlesearch-python (最简单)
这个库专门搜Google,但最近官方API变严格了,直接跑可能被屏蔽。你得先装:pip install googlesearch-python。
from googlesearch import search
def get_google_results(query, num_results=10):
try:
# num_results参数控制数量
results = list(search(query, num_results=num_results, advanced=True))
for r in results:
print(f"标题: {r.title}")
print(f"链接: {r.url}")
print(f"描述: {r.description}\n")
return results
except Exception as e:
print(f"出错了: {e}")
return []
# 示例:抓取5个关于Python的结果
get_google_results("Python tutorial", num_results=5)
注意:现在直接运行很大概率会收到HTTP 429(请求太多)错误,因为Google反爬了。你可能需要配置代理,或者用更复杂的方法。
2. 用 requests-html 手动抓取 (更可控)
这个库能渲染JavaScript,适合应对一些基础的反爬。
from requests_html import HTMLSession
def scrape_google(query, num_results=10):
session = HTMLSession()
# 注意:实际URL可能需要根据Google的实时结构调整
url = f"https://www.google.com/search?q={query}&num={num_results}"
headers = {'User-Agent': 'Mozilla/5.0'} # 模拟浏览器
resp = session.get(url, headers=headers)
# 等待页面加载(如果需要渲染JS)
resp.html.render(sleep=1, timeout=20)
# 解析结果 - CSS选择器需要根据实际页面结构调整
# 这里的选择器是示例,可能已过时
links = resp.html.find('div.g') # 每个结果块的容器
for link in links[:num_results]:
title_elem = link.find('h3', first=True)
url_elem = link.find('a', first=True)
if title_elem and url_elem:
print(title_elem.text)
print(url_elem.attrs['href'])
print()
# 使用示例
scrape_google("Python requests", num_results=5)
关键点:Google的HTML结构经常变,所以div.g这类选择器可能失效,你得自己用浏览器开发者工具检查更新。
关于百度
百度反爬更严,而且结果页结构复杂,没有像googlesearch-python这样现成的轮子。通常得用requests或selenium配合IP轮换等手段,代码更复杂。
总结:googlesearch-python最省事但易被屏蔽,requests-html更灵活但需要维护选择器。
建议:小规模、低频用googlesearch-python加代理;需要稳定或大量抓取,建议研究Google的Custom Search JSON API(有免费额度)。
直接用别人的接口吧,比如 http://www.idataapi.cn/

