有没有现成的Python轮子可以抓取指定数量的Google或百度搜索结果?

需要用到抓取 google 或者百度 搜索结果的前 900 个标题+简介,有没有现成的轮子?爬虫的话应该会被封吧?


有没有现成的Python轮子可以抓取指定数量的Google或百度搜索结果?
4 回复

爬虫 + 代理


有,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这样现成的轮子。通常得用requestsselenium配合IP轮换等手段,代码更复杂。

总结googlesearch-python最省事但易被屏蔽,requests-html更灵活但需要维护选择器。

建议:小规模、低频用googlesearch-python加代理;需要稳定或大量抓取,建议研究Google的Custom Search JSON API(有免费额度)。

直接用别人的接口吧,比如 http://www.idataapi.cn/

回到顶部