爬虫汇总与实战
概述
本文汇总一些开源和闭源爬虫框架,其中部分框架诞生于在大模型时代,或在AI加持下功能和性能得到提升。
Scrapy
Python领域最负盛名的爬虫框架,官网,开源(58.6K Star,11.1K Fork)。
有待进一步深入学习。
Crawl4AI
官方文档,专为LLM和AI代理设计的开源(52.3K Star,5.2K Fork)爬虫框架,通过异步架构+语义理解引擎,实现网页数据到AI就绪格式的自动化转换。其三大颠覆性设计直击传统爬虫痛点:
- 原生LLM优化:生成结构化Markdown/JSON,适配RAG微调和模型训练
- 军工级性能:异步引擎支持300+页面/秒抓取,比Scrapy提速60%
- 智能反检测:浏览器指纹模拟+人类行为建模,突破Cloudflare等防护
优势:
- 成本革命:私有化部署零授权费
- 生态爆发:周更迭代+200+贡献者社区,插件市场覆盖电商等各领域
- 中国本土优化:深度适配微信/微博/抖音等平台反爬机制
技术突破
- 智能爬取
- 无头浏览器控制:基于Playwright支持Chromium/Firefox/Webkit,自动执行JS、等待异步加载、捕获SPA应用数据
- 全页滚动扫描:模拟人类滚动行为,完美抓取无限滚动页面(如社交媒体)
- 语义分块引擎
- BM25算法:自动过滤广告/版权声明等噪音内容,核心信息留存率98%
- 余弦相似度分块:按主题分割文本(例:电商页面分离产品描述/参数/评论)
# 基于主题的语义分块配置示例
from crawl4ai import CosineStrategy
config = {"content_filter": {"strategy": CosineStrategy(query="量子计算研究", threshold=0.7)}
}
- 多模态数据管道
数据类型 | 提取能力 | 应用场景 |
---|---|---|
文本 | Markdown/HTML/纯文本 | NLP训练数据集构建 |
图片 | 解析srcset/picture响应式图 | 图像识别模型训练 |
音视频 | 抓取嵌入媒体标签 | 多模态模型输入 |
原生支持文字/表格/元数据提取 | 学术文献知识图谱 |
- 企业级部署架构
- 分布式爬虫集群:Redis任务队列+动态负载均衡,支持横向扩展至100节点
- 安全合规设计:自动遵循robots.txt,内置TLS指纹混淆+请求频率控制
- LLM协同工作流
局限性及应对策略
- 复杂表格识别:合并单元格解析精度约85%→人工校正或LLM后处理
- 法律合规风险:严格遵循
robots.txt
+请求间隔≥5秒 - 硬件要求:万级页面处理需8GB+内存→分布式集群部署
安装:pip install crawl4ai
使用:
python -m playwright install --with-deps chromium# 抓取arXiv论文并构建知识图谱
crwl https://arxiv.org --deep-crawl bfs -q "量子计算" -o kgraph.jsonimport asyncio
from crawl4ai import *async def main():async with AsyncWebCrawler() as crawler:result = await crawler.arun(url="https://www.nbcnews.com/business")print(result.markdown)if __name__ == "__main__":asyncio.run(main())
Docker部署:
services:crawler:image: crawl4ai/crawler:latestports:- "11235:11235"environment:- CRAWLER_MAX_CONCURRENT=50- REDIS_URL=redis://cache:6379
Firecrawl
开源,55.9K Star,4.7K Fork,AI爬虫工具,可高效抓取网页数据并转换为Markdown或结构化数据,支持LLM训练和RAG。
EasySpider
中文名易采集,官网,开源(GitHub,43K Star,5.3K Fork)的无代码可视化爬虫工具,适用于非技术人员和开发者快速采集网页数据,支持多线程、分布式等高级特性,并提供命令行执行与云服务器配置功能。
功能特性:
- 无代码可视化操作
- 通过图形化界面,用户无需编写代码即可设计爬虫任务;
- 支持在网页上直接选择目标内容(如文本、图片),软件自动识别并高亮显示类似数据块;
- 提供循环点击、自动翻页等操作,简化复杂采集流程。
- 多平台兼容性
- 支持Windows、macOS、Linux系统,跨平台运行无障碍;
- 可单独以命令行方式执行脚本,便于集成到其他系统或自动化流程中。
- 高级特性支持
- 多线程与分布式:提升数据采集效率,适合大规模数据抓取;
- 正则表达式:灵活匹配复杂网页结构,增强数据提取精度;
- JSON数据支持:直接输出结构化数据,便于后续处理;
- Headless:后台运行不显示浏览器窗口,节省资源。
- 云服务器配置:支持配置云服务器地址,实现任务信息的统一存储与管理,适合团队协作或远程部署。
- 内容修改与调试
- 内置代码执行功能,可直接运行和调试Python代码,满足定制化需求;
- 支持修改网页内容,适应更复杂的采集场景。
实战
以Windows为例,从GitHub Release或从官网下载,解压缩即得到exe文件,双击即可。
官方说无广告,其实还是有广告(看着怪怪的):
另外,压缩包并不是纯净版。解压缩后,任务界面长这样(看得我一脸懵逼):
分析后,不难得知,本地tasks
目录有缓存配置文件:
JSON文件:
{"id": 33,"name": "新web采集任务","url": "https://www.jd.com","links": "https://www.jd.com","containJudge": false,"desc": "https://www.jd.com","inputParameters": [{"id": 0,"name": "urlList_0","nodeId": 1,"nodeName": "打开网页","value": "https://www.jd.com","desc": "要采集的网址列表,多行以\\n分开","type": "string","exampleValue": "https://www.jd.com"}],"outputParameters": [],"graph": [{"id": 2,"index": 2,"parentId": 0,"type": 0,"option": 3,"title": "提取数据","sequence": [],"isInLoop": false,"position": 1,"parameters": {"history": 4,"tabIndex": -1,"useLoop": false,"xpath": "","iframe": false,"wait": 0,"waitType": 0,"beforeJS": "","beforeJSWaitTime": 0,"afterJS": "","afterJSWaitTime": 0,"params": [{"nodeType": 0,"contentType": 0,"relative": false,"name": "参数1_文本","desc": "","extractType": 0,"relativeXPath": "/html/body/pre[1]","allXPaths": ["/html/body/pre[1]","//pre[contains(., '{\"timestam')]","/html/body/pre"],"exampleValues": [{"num": 0,"value": ""}],"unique_index": "3cf4ibhw1niljsn6ls6","iframe": false,"default": "","paraType": "mediumText","recordASField": 1,"beforeJS": "","beforeJSWaitTime": 0,"JS": "","JSWaitTime": 0,"afterJS": "","afterJSWaitTime": 0,"downloadPic": 0}]}}]
}
PySpider
GitHub,16.9K Star,3.7K Fork;不过,已经于24年6月11日归档。
一个国人编写的强大的网络爬虫系统并带有强大的WebUI。采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。
WaterCrawl
GitHub,1.3K Star,134 Fork
Transform Web Content into LLM-Ready Data
技术栈:Django、Scrapy、Celery、MinIO
功能
- 高度可定制的网络爬虫系统,支持深度、速度、目标内容的精准控制。不是简单的页面抓取,而是智能化的内容提取。
- 内置强大的搜索引擎功能,提供基础、高级、终极三个搜索深度。多语言内容支持,能够按国家地区进行精准定向。
- 异步处理能力,通过SSE实时监控爬取和搜索进度,处理状态一目了然。
特点:
- API设计规范,OpenAPI文档完整
- 客户端库覆盖主流编程语言
- 无门槛集成到现有项目
- 生态集成:Dify、N8N、Langflow、Flowise
- 支持批量操作,结果处理参数可以灵活定制
- 部署简单
AppCrawler
开源(GitHub,1.2K Star,475 Fork),使用Scala/Java编写、基于自动遍历的App爬虫工具,支持Android和IOS,支持真机和模拟器。灵活性高,可通过配置来设定遍历的规则。
执行参数与配置文件
- capability设置:与appium完全一致
- testcase:用于启动app后的基础测试用例
- selectedList:遍历范围设定
- triggerActions:特定条件触发执行动作的设置
- selectedList:需要被遍历的元素范围
- firstList:优先被点击
- lastList:最后被点击
- tagLimitMax:同祖先(同类型)的元素最多点击多少次
- backButton:当所有元素都被点击后默认后退控件定位
- blackList:黑名单
- maxDepth: 遍历的最大深度
完整形态
- given:所有的先决条件
- when:先决条件成立后的行为
- then:断言集合
简写形态**
- xpath:对应when里的xpath
- action:对应when的action
执行参数比配置文件优先级别高
- given 前提条件
- when 执行动作
- then 写断言
简写形态
- xpath xpath支持xpath表达式、正则、包含
- action 支持
xpath定义
- xpath - //[@resource-id=‘xxxx’] - //[contains(@text, ‘密码’)]
- 正则 - ^确定$ - ^.*输入密码
- 包含 - 密码 - 输入 - 请
action定义
- “” 只是截图记录
- back 后退
- backApp 回退到当前的app 默认等价于back行为 可定制
- monkey 随机事件
- click
- longTap
- xxx() 执行scala或者java代码 - Thread.sleep(3000) - driver.swipe(0.9, 0.5, 0.1, 0.5)
- 非以上所有行为是输入 xx ddd
配置文件解读:
maxTimeDescription: "最大运行时间"
maxTime: 10800
maxDepthDescription: "默认的最大深度10, 结合baseUrl可很好的控制遍历的范围"
maxDepth: 10
capabilityDescription: "appium的capability通用配置,其中automationName代表自动化的驱动引擎,除支持appium的所有引擎外,额外增加adb和selenium支持"
capability:appActivity: ".ApiDemos"appium: "http://127.0.0.1:4723/wd/hub"noReset: "true"appPackage: "io.appium.android.apis"fullReset: "false"
testcaseDescription: "测试用例设置,用于遍历开始之前的一些前置操作,比如自动登录"
testcase:name: "AppCrawler TestCase"steps:- given: []when: nullthen: []xpath: "/*/*"action: "Thread.sleep(1000)"actions: []times: -1
triggerActionsDescription: "在遍历过程中需要随时处理的一些操作,比如弹框、登录等"
triggerActions:- given: []xpath: "permission_allow_button"action: ""actions: []times: 3
selectedListDescription: "默认遍历列表,只有出现在这个列表里的控件范围才会被遍历"
selectedList:- given: []# 每个xpath都需要单独写一份???xpath: "//*[contains(name(), 'Button')]"xpath: "//*[contains(name(), 'Text') and @clickable='true' and string-length(@text)<10]"xpath: "//*[@clickable='true']//*[contains(name(), 'Text') and string-length(@text)<10]"xpath: "//*[contains(name(), 'Image') and @clickable='true']"xpath: "//*[@clickable='true']/*[contains(name(), 'Image')]"xpath: "//*[contains(name(), 'Image') and @name!='']"xpath: "//*[contains(name(), 'Text') and @name!='' and string-length(@label)<10]"xpath: "//a"xpath: "//*[contains(@class, 'Text') and @clickable='true' and string-length(@text)<10]"xpath: "//*[@clickable='true']//*[contains(@class, 'Text') and string-length(@text)<10]"xpath: "//*[contains(@class, 'Image') and @clickable='true']"xpath: "//*[@clickable='true']/*[contains(@class, 'Image')]"xpath: "//*[@clickable='true' and contains(@class, 'Button')]"
blackListDescription: "黑名单列表 matches风格, 默认排除内容包含2个数字的控件"
blackList:xpath: ".*[0-9]{2}.*"
firstListDescription: "优先遍历列表,同时出现在selectedList与firstList中的控件会被优先遍历"
firstList: []
lastListDescription: "最后遍历列表,同时出现在selectedList与lastList中的控件会被最后遍历"
lastList:- given: []xpath: "//*[@selected='true']/..//*"xpath: "//*[@selected='true']/../..//*"
backButtonDescription: "后退按钮列表,默认在所有控件遍历完成后,才会最后点击后退按钮。目前具备了自动判断返回按钮的能力,默认不需要配置"
backButton:- given: []xpath: "Navigate up"action: ""actions: []times: -1
xpathAttributesDescription: "在生成一个控件的唯一定位符中应该包含的关键属性"
xpathAttributes:- "name()"- "name"- "label"- "value"- "resource-id"- "content-desc"- "text"- "id"- "name"- "innerText"- "tag"- "class"
sortByAttributeDescription: "陆续根据属性进行遍历排序微调,depth表示从dom中最深层的控件开始遍历,list表示dom中列表优先,selected表示菜单最后遍历,这是默认规则,一般不需要改变"
sortByAttribute:- "depth"- "list"- "selected"
findByDescription: "默认生成控件唯一定位符的表达式风格,可选项 default|android|id|xpath,默认会自动判断是否使用Android或iOS定位"
findBy: "xpath"
baseUrlDescription: "设置一个起始点,从这个起始点开始计算深度,比如默认从登录后的界面开始计算"
baseUrl: []
appWhiteListDescription: "app白名单,允许在这些app里进行遍历"
appWhiteList: []
urlBlackListDescription: "url黑名单,用于排除某些页面的遍历"
urlBlackList: []
urlWhiteListDescription: "url白名单,仅在这些界面内遍历"
urlWhiteList: []
beforeStartWaitDescription: "启动一个app默认等待的时间"
beforeStartWait: 6000
beforeRestart: []
beforeElementDescription: "在遍历每个控件之前默认执行的动作"
beforeElement: []
afterElementDescription: "在遍历每个控件之后默认执行的动作"
afterElement: []
afterElementWaitDescription: "在遍历每个控件之后默认等待的时间,用于等待新页面加载"
afterElementWait: 500
afterAllDescription: "在遍历完当前页面内的所有控件后,是否需要刷新或者滑动"
afterAll: []
afterAllMaxDescription: "afterAll的最大重试次数,比如连续滑动2次都没新元素即取消"
afterAllMax: 2
tagLimitMaxDescription: "相似控件最多点击几次"
tagLimitMax: 2
tagLimitDescription: "设置部分相似控件的最大遍历次数"
tagLimit:- given: []when: nullthen: []xpath: "确定"action: ""actions: []times: 1000- given: []when: nullthen: []xpath: "取消"action: ""actions: []times: 1000- given: []when: nullthen: []xpath: "share_comment_guide_btn_name"action: ""actions: []times: 1000
assertGlobalDescription: "全局断言"
assertGlobal: []
suiteNameDescription: "报告中的测试套件名字可以由列表内的控件内容替换,增强报告中关键界面的辨识度"
suiteName:- "//*[@selected='true']//android.widget.TextView/@text"
screenshotDescription: "是否截图"
screenshot: true
reportTitleDescription: "报告的title"
reportTitle: "AppCrawler"
resultDirDescription: "结果目录,如果为空会自动创建对应时间戳_报名的结果目录"
resultDir: ""
showCancelDescription: "是否展示跳过的控件记录"
showCancel: true
pluginListDescription: "插件列表,暂时禁用,太高级了,很多人不会用"
Description: "。在selectedList firstList lastList等很多配置中,需要填充的是测试步骤Step类型。Step类型由given(满足条件)when(条件满足的行为)then(断言)三部分组成。Step可以简化为xpath(定位表达式,支持xpath 正则 包含关系)与action(点击输入等行为)。"
pluginList: []
闭源
广告嫌疑,不过多解释:
- 八爪鱼
- Bright Data,国际版
- Web Scraper:Chrome插件