scrapling框架源码5/19

源码结构如下:

https://dcnsre5ugu1w.feishu.cn/sync/RNvRd7bnOsMwRFbDuHNcKKywnkc

图片

  1. init .py:

    入口,导出类核心

    图片

  2. 爬虫框架核心

    图片

  3. Spider基类:先从这里开始读

  4. 跑了的第一个例子,

    指令如下:

    E:\Scrapling2>uv run python agent-skill\Scrapling-Skill\examples\01_fetcher_session.py

    部分输出结果如下:

    E:\Scrapling2>uv run python agent-skill\Scrapling-Skill\examples\01_fetcher_session.py

    2026-05-19 19:13:23\] INFO: Fetched (200) \ (referer: https://www.google.com/) 第 1页: 10 条引用 (状态: 200) \[2026-05-19 19:13:23\] INFO: Fetched (200) \ (referer: https://www.google.com/) 第 2页: 10 条引用 (状态: 200) ... 总数: 100 条引用

  5. "It is our choices, Harry, that show what we truly are, far more than our abilities."

  6. 其中用到一个我不认识的库

    browserforge

    browserforge 是用来生成随机浏览器指纹的库,帮助绕过反爬检测

    具体功能:

    它能生成随机的:

    browserforge.generate.user_agent() # 随机User-Agent

    browserforge.generate.screen() # 随机屏幕分辨率

    browserforge.generate.webgl() # WebGL指纹

    browserforge.generate.canvas() # Canvas指纹

  • 生成随机的 User-Agent、Accept-Language 等请求头
  • 随机化 TLS/SSL 指纹(JA3/JA4)
  • 随机化 HTTP/2 头部
  • 生成随机化的浏览器配置文件
    这个库在Scrapling里的作用:
    Scrapling 的 StealthyFetcher / curl_cffi

    browserforge 生成随机指纹

    让请求看起来像真实浏览器

    绕过反爬(Cloudflare/Pulse/PerimeterX等)
    这是一个agent skill
  1. 第二个源码的例子
    指令如下:
    uv run python agent-skill\Scrapling-Skill\examples\02_dynamic_session.py
    遇到个我没见过的东西:msgspec
    msgspec 是一个高性能的结构化数据库,用于序列化、验证和转换 JSON/MessagePack 等格式。
  2. 示例3:源码翻译:
    """
    示例 3:Python - StealthySession(Patchright 隐形浏览器,可见)
    使用持久的隐身浏览器会话抓取 quotes.toscrape.com 的全部 10 页内容。
    自动绕过反爬虫保护(Cloudflare Turnstile、指纹识别等)。
    最适合:防护良好的网站、Cloudflare 保护的页面、能检测到 Playwright 的网站。
    将 headless 设置为 True 可以在后台运行浏览器。
    添加 solve_cloudflare=True 可以自动解决 Cloudflare 验证。"""
  3. 示例3中遇到的库:patchright
    patchright 是 Playwright 的强化版(apify 团队维护),专门解决 Playwright 被反爬检测的问题
  4. 第四个例子:源码注释翻译
    """
    示例 4:Python - 爬虫(自动爬取框架)
    自动抓取 quotes.toscrape.com 网站的所有页面,通过点击"下一页"分页链接实现。无需手动循环页面。
    该蜘蛛程序生成结构化的项目(文本 + 作者 + 标签)并将其导出为 JSON 格式。
    最适合:多页抓取、全站抓取、任何需要分页或跨多页链接跟踪的情况。
    输出:
  • 爬取过程中实时统计信息输出到终端
  • 爬取结束时的最终统计信息
  • 当前目录下的 quotes.json 文件"""
    第四个例子没遇见过的库:protego
    protego 是 Python 的 Protocol Buffers 实现库。
  1. class Spider(ABC):源码注释翻译:
    "用于创建网络爬虫的抽象基类。
    请访问文档网站以获取更多信息。"""
    ABC = Abstract Base Class()
    ABC是Python标准库的类,用于定义抽象基类
    from abc import ABC, abstractmethod

class Spider(ABC):

@abstractmethod

def parse(self, response):

"""子类必须实现这个方法,否则报错"""

pass

如果直接实例化 Spider,会报错:

spider = Spider() # ❌ TypeError: Can't instantiate abstract class Spider with abstract methods parse

子类必须实现 parse() 才能实例化:

class MySpider(Spider):

async def parse(self, response): # ✅ 必须实现

...

作用:强制子类必须实现parse()方法,否则爬虫无法工作

name: Optional[str] = None

  1. Optional[str]是python typing模块的类型注解

from typing import Optional, Union

完整写法:

name: Optional[str] = None

等价于:

name: Union[str, None] = None

等价于(Python 3.10+):

name: str | None = None

意思是:name 可以是字符串,也可以是 None

Name是必须填写的:

Spider.init 里会检查:

if self.name is None:

raise ValueError(f"{self.class .name} must have a name.")

正确用法:

class QuotesSpider(Spider):

name = "quotes" # ✅ 必须给名字

基类定义(父类)

class Spider(ABC):

name: Optional[str] = None

start_urls: list[str] = [] # 有默认值,可以被子类覆盖

子类继承(传进来)

class MySpider(Spider):

name = "my-spider"

start_urls = ["https://example.com"] # 覆盖父类的默认值

类属性默认值,子类覆盖之后生效

  1. allowed_domains: Set[str] = set()

限定爬虫的爬取范围

相关推荐
xingyuzhisuan6 小时前
Jupyter Notebook 云GPU配置全解析(含实操+选型指南)
ide·python·jupyter·gpu算力
ITIRONMAN7 小时前
开源data-compare:轻量级数据对比工具
人工智能·python
云姜.7 小时前
如何快速使用Langchain上手编程
python·langchain
念恒123067 小时前
Python(for循环进阶)
开发语言·python
AI玫瑰助手7 小时前
Python运算符:算术运算符(加减乘除取模幂)详解
开发语言·python
情绪总是阴雨天~7 小时前
深度解析:LangChain、Agent、RAG、FC、ReAct、LangGraph、A2A、MCP — 区别、联系与全景图
python·langchain·agent·rag·langgraph·mcp·a2a
小李不困还能学8 小时前
PyCharm2025.2下载安装配置保姆级教程
python·pycharm
A000—ic测试座(陈佳鑫)8 小时前
芯片高温加速寿命测试:除了初始测试还有哪些关键条件?
网络·人工智能·python
2301_803934618 小时前
SQL如何进行分组后字符串拼接_使用GROUP_CONCAT或STRING_AGG
jvm·数据库·python