Skip to content
Go back

爬虫学习笔记:序章

Published:  at  05:00 PM

问: 我现在想要学一-学如何对一个网页进行逆向 / 自动化 / 爬虫(比如 chat2api,网站注册机,小说爬取等)。我是一个网络方面的新手,懂一点网络请求的知识。我对法律风险已经很了解,你不用多说。

请从基础开始。

好的,没问题!从零开始学习网页逆向、自动化和爬虫是一个非常有趣的过程。既然你已经了解了网络请求的基础知识和法律风险,我们可以直接进入技术核心。

这个学习路径将分为三个阶段,由易到难,循序渐进:

  1. 静态内容抓取:这是最基础的爬虫,用于获取网页上直接显示出来的、固定的信息(比如小说章节、新闻文章)。
  2. 动态交互与自动化:这用于操作那些需要与用户交互才能显示内容的网页(比如点击“加载更多”),或者自动完成网页上的任务(比如自动登录、注册)。
  3. 接口逆向分析:这是最高级的技巧,通过分析网页的“后台通信”,直接模仿客户端与服务器进行数据交换,效率最高、最稳定(chat2api 就是这个原理)。

第一阶段:静态内容爬取 (Scraping Static Content) 入门 📝

这是你的起点。目标是抓取那些内容是固定的网页。

核心工具
学习流程
  1. 安装必备库:

    pip install requests beautifulsoup4
  2. 找到你的目标: 选择一个简单的、内容固定的网站作为练习对象。例如,一个展示古诗词的网站或者一个博客。

  3. 分析网页结构:

    • 在浏览器中打开目标网页。
    • 按下 F12 键打开 开发者工具 (Developer Tools)
    • 选择 “元素” (Elements) 标签页。
    • 点击左上角的箭头图标(检查元素),然后在网页上点击你想要抓取的内容(比如文章标题)。
    • 观察右侧 HTML 代码,看清楚你想要的内容被什么标签包裹着(比如 <h1> 标签),以及这个标签有什么独特的属性(比如 class="title"id="main-content")。
  4. 编写代码 (小说爬取示例):

    import requests
    from bs4 import BeautifulSoup
    
    # 1. 目标 URL
    url = '一个小说章节的网址'
    headers = {
        # 伪装成浏览器,避免被一些简单反爬机制拦截
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    
    # 2. 发送请求,获取 HTML
    response = requests.get(url, headers=headers)
    response.encoding = 'utf-8' # 确保正确解码中文
    
    # 3. 使用 BeautifulSoup 解析 HTML
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 4. 根据 F12 分析结果,定位元素
    # 假设小说标题在 <h1 class="title">...</h1> 中
    title = soup.find('h1', class_='title').text
    
    # 假设小说内容在 <div id="content">...</div> 中
    content = soup.find('div', id='content').text.strip()
    
    # 5. 打印或保存结果
    print("标题:", title)
    print("内容:", content)
    
    # 可以将内容保存到文件
    # with open(f'{title}.txt', 'w', encoding='utf-8') as f:
    #     f.write(content)

这个阶段的目标是让你熟练使用 requests + Beautiful Soup 的组合,并掌握用 F12 工具分析简单网页结构的能力。


第二阶段:动态交互与自动化 (Automation) 🤖

很多现代网站的内容是通过 JavaScript 动态加载的。你用 requests 只能拿到一个不包含数据的“空壳”。这时,你需要模拟一个真实的用户在真实的浏览器里进行操作。

核心工具
学习流程 (网站注册机示例)
  1. 安装库:

    pip install playwright
    python -m playwright install # 安装所需的浏览器驱动
  2. 分析操作流程: 手动在网站上操作一遍注册流程,记下你需要:

    • 打开哪个网址。
    • 点击哪个输入框,输入什么内容。
    • 点击哪个按钮来提交。
  3. 编写代码 (自动化注册):

    from playwright.sync_api import sync_playwright
    import time
    
    def run(pw):
        # 启动一个浏览器实例
        browser = pw.chromium.launch(headless=False) # headless=False 会显示浏览器界面,方便调试
        page = browser.new_page()
    
        # 1. 打开注册页面
        page.goto("https://example.com/signup")
    
        # 2. 定位元素并填写表单 (selector 可以用 F12 工具获取)
        page.fill('input[name="username"]', 'my_test_user')
        page.fill('input[name="password"]', 'a_strong_password_123')
        page.fill('input[name="email"]', 'test@example.com')
        time.sleep(1) # 有时需要等待一下,让人眼能看清
    
        # 3. 点击注册按钮
        page.click('button[type="submit"]')
    
        # 等待页面跳转或出现成功提示
        page.wait_for_selector('h1:text("注册成功")')
        print("注册成功!")
    
        time.sleep(5) # 停留 5 秒让你看结果
        browser.close()
    
    with sync_playwright() as p:
        run(p)

这个阶段的目标是让你学会如何处理由 JavaScript 生成内容的网站,并能自动化完成重复性的网页任务。


第三阶段:接口逆向分析 (API Reverse Engineering) 🚀

这是最高效、最稳定的方法。所有网页上的数据,几乎都是通过前端 JavaScript 调用后端 API 获取的。我们要做的是,跳过浏览器和 JavaScript,直接去“假装”成前端,和 API 对话。

核心工具
学习流程 (chat2api 类项目原理)
  1. 开始抓包:

    • 打开目标网站(比如一个在线聊天应用)。
    • 按下 F12 打开开发者工具,切换到 Network 标签页。
    • 为了过滤掉图片、CSS 等无关请求,点击筛选器中的 Fetch/XHR。这会只显示数据请求。
  2. 执行操作并观察:

    • 在网页上执行一个核心操作(比如,发送一条消息)。
    • 观察 Network 标签页,你会立刻看到一个新的请求出现。这个就是我们要找的 API 请求!
  3. 分析请求: 点击那条新的请求,仔细分析它的所有细节:

    • Headers (请求头):
      • Request URL: API 的地址是什么?
      • Request Method: 是 GET 还是 POST
      • Authorization: 是否有 Bearer Token 或其他认证信息?这是权限验证的关键。
      • Cookie: 是否携带了身份验证的 Cookie?
      • User-Agent: 服务器通过它来识别客户端类型。
    • Payload (载荷) / Body (请求体): (通常在 POST 请求中)
      • 查看你发送的数据是什么格式的,通常是 JSON。例如 {"prompt": "你好", "model": "gpt-4"}
  4. 模仿请求:

    • 最简单的方式: 在 Network 标签页中右键点击该请求,选择 Copy -> Copy as cURL
    • 将复制的内容粘贴到你的终端(命令行工具)里执行。如果能成功返回数据,说明你已经成功在浏览器外复现了这个请求!
    • 用 Python 实现: 现在,把 cURL 命令里的信息翻译成 Python requests 代码。
    import requests
    import json
    
    # 1. 从 F12 分析中获取的信息
    api_url = 'https://api.example.com/chat/completions' # Request URL
    
    headers = {
        'Authorization': 'Bearer sk-xxxxxxxxxxxxxxxxxxxx', # 身份验证信息
        'Content-Type': 'application/json',
        'User-Agent': 'Mozilla/5.0 ...'
    }
    
    payload = {
        'model': 'some-model',
        'messages': [
            {'role': 'user', 'content': '你好,世界!'}
        ]
    }
    
    # 2. 使用 requests 发送 POST 请求
    response = requests.post(api_url, headers=headers, data=json.dumps(payload))
    
    # 3. 处理响应
    if response.status_code == 200:
        # 通常 API 返回的是 JSON 格式数据
        result = response.json()
        print("API 响应:", result)
        # print("AI 的回复:", result['choices'][0]['message']['content'])
    else:
        print("请求失败:", response.status_code, response.text)

这个阶段的目标是让你彻底摆脱对浏览器界面的依赖,直接与数据源头对话,这是编写高效、稳定爬虫和自动化工具的终极形态。

祝你学习顺利!从第一阶段开始,动手实践,你会发现一个全新的世界。



Suggest Changes

Previous Post
爬虫学习笔记:第一个静态网站爬虫
Next Post
Adding new posts in AstroPaper theme