当前位置: 首页 > news >正文

爬虫汇总与实战

概述

本文汇总一些开源和闭源爬虫框架,其中部分框架诞生于在大模型时代,或在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响应式图图像识别模型训练
音视频抓取嵌入媒体标签多模态模型输入
PDF原生支持文字/表格/元数据提取学术文献知识图谱
  • 企业级部署架构
    • 分布式爬虫集群: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插件
http://www.dtcms.com/a/490213.html

相关文章:

  • 哪个网站做网销更好python怎么做网站
  • dede 网站地图 插件添加图标wordpress
  • 对比k8s的service和kube-proxy
  • 理想汽车Java后台开发面试题及参考答案(上)
  • Kotlin 实现社交 App 音视频模块:语音录制、播放、暂停与进度控制全流程封装
  • Lustre/Scade 形式化语义基础 —— 同步Kahn网络 (1996)
  • 内核空间与用户空间解读
  • ELK运维之路(Filebeat第一章-7.17.24)
  • 开源接口管理工具深度横评,swagger vs PostIn哪个更适合你?
  • list的使用和模拟实现
  • 群辉怎么做网站服务器专做投放广告网站
  • 【34】MFC入门到精通——MFC 控件 ComboBox 运行点击控件下拉框 “终止“、“重试“、“忽略“、“引发异常”
  • 论文见解:REACT:在语言模型中协同推理和行动
  • Megatron-DeepSpeed 方案
  • 停止检索!刚刚这本期刊被数据库剔除!
  • Flink-Kafka 数据倾斜问题解决方案
  • html 实现鼠标滑动点亮横轴
  • 连接 TDengine 遇到报错 “failed to connect to server, reason: Connection refused” 怎么办?
  • Web自动化(三方库:Selenium)
  • 网站单页在线制作软件长尾关键词是什么意思
  • 生成静态页面网站源码信息门户网站是什么
  • 在阿里云CentOS服务器上使用Certbot为Nginx配置SSL证书
  • 如何优化网站打开速度网站运营和管理
  • 华为数通认证学习难吗?需掌握哪些核心知识点?
  • 【vue】导出excel
  • WiFi模块远程连接APP:wifi模块的应用
  • 关闭电脑的“快速启动”功能
  • 【MongoDB 基本语法】数据库和集合的基本操作--探秘 MongoDB
  • 提示词管理器设计:从需求到用户体验的高效落地逻辑
  • idea 网站开发无远低代码开发平台