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) <GET https://quotes.toscrape.com/page/1/\> (referer: https://www.google.com/)

    第 1页: 10 条引用 (状态: 200)

    2026-05-19 19:13:23 INFO: Fetched (200) <GET https://quotes.toscrape.com/page/2/\> (referer: https://www.google.com/)

    第 2页: 10 条引用 (状态: 200)

    ...

    总数: 100 条引用

  5. "The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking."

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

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

    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: Optionalstr = None

  1. Optionalstr是python typing模块的类型注解

from typing import Optional, Union

完整写法:

name: Optionalstr = None

等价于:

name: Unionstr, 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: Optionalstr = None

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

子类继承(传进来)

class MySpider(Spider):

name = "my-spider"

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

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

  1. allowed_domains: Setstr = set()

限定爬虫的爬取范围

相关推荐
belldeep9 分钟前
python:genesis-world, Genesis-Embodied-AI
人工智能·python·ai·genesis
benchmark_cc1 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
维克兜率天2 小时前
【维克】趋势型CTA:期货市场的“追涨杀跌“
人工智能·python
取名真是2 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
梦想不只是梦与想3 小时前
PyTorch、CPU、GPU、CUDA
人工智能·pytorch·python·深度学习·机器学习·cuda
数字融合3 小时前
透明化视频孪生危化安全管控解决方案
人工智能·python·安全
别问!问就是全会4 小时前
Jupyter Notebook 安装包下载|单元格分块运行,图表直接内嵌
ide·python·其他·jupyter
深蓝AI5 小时前
Python 缓存击穿实测:16 个并发请求如何只回源 1 次
python
benchmark_cc5 小时前
用 00700.HK 做港股行情清洗:字段核对、校验与个人量化开发实践
python·数据分析·pandas·量化交易·股票数据·quantdash
zh路西法5 小时前
【PACE】面向永磁同步电机PMSM 执行器的参数辨识与能耗感知强化学习 Sim-to-Real
python·cma-es·pmsm·sim-to-real·issac·pace