源码结构如下:
https://dcnsre5ugu1w.feishu.cn/sync/RNvRd7bnOsMwRFbDuHNcKKywnkc
图片
-
init .py:
入口,导出类核心
图片
-
爬虫框架核心
图片
-
Spider基类:先从这里开始读
-
跑了的第一个例子,
指令如下:
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 条引用
-
"The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking."
-
"It is our choices, Harry, that show what we truly are, far more than our abilities."
-
其中用到一个我不认识的库
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
- 第二个源码的例子
指令如下:
uv run python agent-skill\Scrapling-Skill\examples\02_dynamic_session.py
遇到个我没见过的东西:msgspec
msgspec 是一个高性能的结构化数据库,用于序列化、验证和转换 JSON/MessagePack 等格式。 - 示例3:源码翻译:
"""
示例 3:Python - StealthySession(Patchright 隐形浏览器,可见)
使用持久的隐身浏览器会话抓取 quotes.toscrape.com 的全部 10 页内容。
自动绕过反爬虫保护(Cloudflare Turnstile、指纹识别等)。
最适合:防护良好的网站、Cloudflare 保护的页面、能检测到 Playwright 的网站。
将 headless 设置为 True 可以在后台运行浏览器。
添加 solve_cloudflare=True 可以自动解决 Cloudflare 验证。""" - 示例3中遇到的库:patchright
patchright 是 Playwright 的强化版(apify 团队维护),专门解决 Playwright 被反爬检测的问题 - 第四个例子:源码注释翻译
"""
示例 4:Python - 爬虫(自动爬取框架)
自动抓取 quotes.toscrape.com 网站的所有页面,通过点击"下一页"分页链接实现。无需手动循环页面。
该蜘蛛程序生成结构化的项目(文本 + 作者 + 标签)并将其导出为 JSON 格式。
最适合:多页抓取、全站抓取、任何需要分页或跨多页链接跟踪的情况。
输出:
- 爬取过程中实时统计信息输出到终端
- 爬取结束时的最终统计信息
- 当前目录下的 quotes.json 文件"""
第四个例子没遇见过的库:protego
protego 是 Python 的 Protocol Buffers 实现库。
- 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
- 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" # 覆盖父类的默认值
类属性默认值,子类覆盖之后生效
- allowed_domains: Setstr = set()
限定爬虫的爬取范围