如何优雅的抓取 Google 搜索结果?

众所周知,通过 API 抓取搜索引擎结果是一件非常困难的事情,随着Web技术的发展,爬虫与反爬技术的对抗每时每刻都在进行。今天以 Python 抓取 Google 的搜索结果为例,分享一下自己的心得。

  1. 爬虫框架选择
  • requests: 笔者测试 requests 配合适合的 User-Agent + 代理池是可以成功
  • 如果策略升级还可以考虑 playwrightDrissionPageselenium (性能低,指纹容易被检测,快被时代淘汰了)
  1. 指定 Cookie
makefile 复制代码
cookies = {
    "CONSENT": "PENDING+987",
    "SOCS": "CAESHAgBEhIaAB",
}

这样设置的目的是跳过同意页面,避免抓取不到搜索结果页面。

  1. 指定 User-Agent

常见的 User-Agent 或者 fake-useragent 生成的 UA,效果都不是很好,或者返回失败,笔者找到了一个比较靠谱的 UA 方式,直接上代码:

python 复制代码
import random

def get_useragent():
    """
    用户代理字符串由以下部分组成:
    - Lynx 版本:Lynx/x.y.z,其中 x 为 2-3,y 为 8-9,z 为 0-2
    - libwww 版本:libwww-FM/x.y,其中 x 为 2-3,y 为 13-15
    - SSL-MM 版本:SSL-MM/x.y,其中 x 为 1-2,y 为 3-5
    - OpenSSL 版本:OpenSSL/x.y.z,其中 x 为 1-3,y 为 0-4,z 为 0-9
    """
    lynx_version = f"Lynx/{random.randint(2, 3)}.{random.randint(8, 9)}.{random.randint(0, 2)}"
    libwww_version = f"libwww-FM/{random.randint(2, 3)}.{random.randint(13, 15)}"
    ssl_mm_version = f"SSL-MM/{random.randint(1, 2)}.{random.randint(3, 5)}"
    openssl_version = f"OpenSSL/{random.randint(1, 3)}.{random.randint(0, 4)}.{random.randint(0, 9)}"
    return f"{lynx_version} {libwww_version} {ssl_mm_version} {openssl_version}"
  1. 海外代理池选择

代理池的使用也是重点,如果频繁请求的话,一个IP肯定是会被封禁的,就会出现429等错误,海外代理池大家可以自行去找,一般几美元/GB,一般都提供免费测试的。

  1. 设置语言环境和返回条数

可以通过 num 控制条数,指定语言环境为英文:&hl=en&gl=us,示例代码如下(笔者使用了 httpx 这个异步框架,requests 同步框架道理类似):

python 复制代码
from urllib.parse import quote
from httpx import AsyncClient

def get_useragent():
    """
    用户代理字符串由以下部分组成:
    - Lynx 版本:Lynx/x.y.z,其中 x 为 2-3,y 为 8-9,z 为 0-2
    - libwww 版本:libwww-FM/x.y,其中 x 为 2-3,y 为 13-15
    - SSL-MM 版本:SSL-MM/x.y,其中 x 为 1-2,y 为 3-5
    - OpenSSL 版本:OpenSSL/x.y.z,其中 x 为 1-3,y 为 0-4,z 为 0-9
    """
    lynx_version = f"Lynx/{random.randint(2, 3)}.{random.randint(8, 9)}.{random.randint(0, 2)}"
    libwww_version = f"libwww-FM/{random.randint(2, 3)}.{random.randint(13, 15)}"
    ssl_mm_version = f"SSL-MM/{random.randint(1, 2)}.{random.randint(3, 5)}"
    openssl_version = f"OpenSSL/{random.randint(1, 3)}.{random.randint(0, 4)}.{random.randint(0, 9)}"
    return f"{lynx_version} {libwww_version} {ssl_mm_version} {openssl_version}"
    
async def request_google(keyword, proxy, timeout=10):
    """
    请求 Google.com
    """
    encoded_keyword = quote(keyword)
    headers = {"User-Agent": get_useragent(), "Accept-Language": "en-US,en;q=0.9"}
    cookies = {
        "CONSENT": "PENDING+987",
        "SOCS": "CAESHAgBEhIaAB",
    }
    async with AsyncClient(proxy=proxy, timeout=timeout) as client:
        try:
            google_search_logger.info(f"Google search: {keyword}, proxy: {proxy}......")

            response = await client.get(
                f"https://www.google.com/search?q={encoded_keyword}&start=0&num=100&hl=en&gl=us",
                headers=headers,
                cookies=cookies,
            )
            google_search_logger.info(
                f"Google search: {keyword}, proxy: {proxy}, code: {response.status_code}"
            )
            if response.status_code != 200:
                return

            if "VIDEOS" not in response.text:
                with open("./error.html", "w") as f:
                    f.write(response.text)
                return

            return response.text
        except Exception as e:
            google_search_logger.error(f"Request google error: {e}")
相关推荐
源码之家2 小时前
计算机毕业设计:Python智慧交通大数据分析平台 Flask框架 requests爬虫 出行速度预测 拥堵预测(建议收藏)✅
大数据·hadoop·爬虫·python·数据分析·flask·课程设计
心疼你的一切2 小时前
【矛与盾的博弈:ZLibrary反爬机制实战分析与绕过技术全解析】
人工智能·爬虫·python·网络爬虫
axinawang3 小时前
XPath与lxml解析库
爬虫·python
亿牛云爬虫专家4 小时前
爬虫踩坑实录:OkHttp 接入爬虫代理报 Too many tunnel connections attempted 深度解析
爬虫·okhttp·https·爬虫代理·connect·隧道代理·ip 切换
源码之家6 小时前
计算机毕业设计:Python汽车销量数据采集分析可视化系统 Flask框架 requests爬虫 可视化 车辆 大数据 机器学习 hadoop(建议收藏)✅
大数据·爬虫·python·django·flask·课程设计·美食
遇事不決洛必達6 小时前
AST反混淆脚本
javascript·爬虫·nodejs·ast·ob混淆
Data 实验室6 小时前
TaskPyro “小龙虾版本”专业爬虫管理平台来了:AI+分布式+IM 机器人,一套搞定企业级爬虫调度
人工智能·分布式·爬虫
源码之家8 小时前
计算机毕业设计:Python二手车交易价格预测分析平台 Django框架 随机森林 可视化 数据分析 汽车 车辆 大数据 hadoop(建议收藏)✅
大数据·爬虫·python·机器学习·django·汽车·课程设计
小白学大数据8 小时前
高并发场景下:平衡搜索引擎收录与爬虫流量负载方案
爬虫·搜索引擎·pycharm
TU不秃头14 小时前
JS逆向实战五:某海关公示平台分析(瑞数加密)
javascript·爬虫