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()

限定爬虫的爬取范围

相关推荐
AC赳赳老秦14 分钟前
网页公开附件自动采集:OpenClaw 批量下载页面内嵌 Word/Excel 附件,统一格式后结构化入库
java·python·word·php·excel·deepseek·openclaw
北斗落凡尘15 分钟前
LangGraph 入门实战(3)
python·langchain
TAN-90°-26 分钟前
Deep Learning for Computer Vision——Image Classification with Linear Classifiers
python·深度学习·算法·计算机视觉·线性回归
AINative软件工程27 分钟前
LLM API 成本失控怎么办?工程师的实时异常检测指南
python
练习两年半的攻城狮28 分钟前
LlamaIndex ResponseMode 深度解析
python·llamaindex
阿pin44 分钟前
Java随笔-红黑树
java·python·算法·红黑树
2603_965148111 小时前
eBay商品数据API:寻找海外仓与价格洼地
大数据·人工智能·windows·python·microsoft
2601_956319881 小时前
TqSdk Tick 数据适合做什么?获取方法与使用边界
人工智能·python
苏灿烤鱼2 小时前
把 Agent 做成一家公司,真比通用提示词好用吗?
python·agent·shell