爬虫汇总与实战

概述

本文汇总一些开源和闭源爬虫框架,其中部分框架诞生于在大模型时代,或在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%
    • 余弦相似度分块:按主题分割文本(例:电商页面分离产品描述/参数/评论)
py 复制代码
# 基于主题的语义分块配置示例
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

使用:

py 复制代码
python -m playwright install --with-deps chromium

# 抓取arXiv论文并构建知识图谱
crwl https://arxiv.org --deep-crawl bfs -q "量子计算" -o kgraph.json

import 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部署:

yaml 复制代码
services:
  crawler:
    image: crawl4ai/crawler:latest
    ports:
      - "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文件:

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

配置文件解读:

yaml 复制代码
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: null
      then: []
      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: null
    then: []
    xpath: "确定"
    action: ""
    actions: []
    times: 1000
  - given: []
    when: null
    then: []
    xpath: "取消"
    action: ""
    actions: []
    times: 1000
  - given: []
    when: null
    then: []
    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: []

闭源

广告嫌疑,不过多解释:

相关推荐
一晌小贪欢4 小时前
Python爬虫第5课:正则表达式与数据清洗技术
爬虫·python·正则表达式·网络爬虫·python爬虫·python3·网页爬虫
打酱油的;7 小时前
【无标题】
爬虫·python·php
Amazon数据采集11 小时前
🚀 Pangolin Scrape API实战指南:从0到1构建高性能亚马逊数据采集系统
爬虫·自动化运维
DataLaboratory20 小时前
Python爬取百度地图-前端直接获取
爬虫·python·百度地图
APIshop1 天前
代码实例:Python 爬虫抓取与解析 JSON 数据
爬虫·python·json
一晌小贪欢1 天前
Python爬虫第4课:XPath与lxml高级解析技术
开发语言·爬虫·python·网络爬虫·python爬虫·python3·python办公
一晌小贪欢2 天前
Python爬虫第3课:BeautifulSoup解析HTML与数据提取
爬虫·python·网络爬虫·beautifulsoup·python爬虫·python3·requests
小白学大数据2 天前
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
爬虫·python·ajax
Jonathan Star2 天前
跨域处理的核心是解决浏览器的“同源策略”限制,主流方案
javascript·chrome·爬虫