<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>爬虫实战 on 扎塔-Zata</title><link>https://www.zata.cc/tags/%E7%88%AC%E8%99%AB%E5%AE%9E%E6%88%98/</link><description>Recent content in 爬虫实战 on 扎塔-Zata</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>扎塔-Zata</copyright><lastBuildDate>Thu, 24 Sep 2026 17:09:06 +0800</lastBuildDate><atom:link href="https://www.zata.cc/tags/%E7%88%AC%E8%99%AB%E5%AE%9E%E6%88%98/index.xml" rel="self" type="application/rss+xml"/><item><title>ai-crawler-深度调研报告：人工智能驱动的网络爬虫技术——能力、应用与生态演进</title><link>https://www.zata.cc/p/ai-crawler-%E6%B7%B1%E5%BA%A6%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E9%A9%B1%E5%8A%A8%E7%9A%84%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB%E6%8A%80%E6%9C%AF%E8%83%BD%E5%8A%9B%E5%BA%94%E7%94%A8%E4%B8%8E%E7%94%9F%E6%80%81%E6%BC%94%E8%BF%9B/</link><pubDate>Tue, 06 Jan 2026 18:24:49 +0800</pubDate><guid>https://www.zata.cc/p/ai-crawler-%E6%B7%B1%E5%BA%A6%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E9%A9%B1%E5%8A%A8%E7%9A%84%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB%E6%8A%80%E6%9C%AF%E8%83%BD%E5%8A%9B%E5%BA%94%E7%94%A8%E4%B8%8E%E7%94%9F%E6%80%81%E6%BC%94%E8%BF%9B/</guid><description>&lt;img src="https://www.zata.cc/p/ai-crawler-%E6%B7%B1%E5%BA%A6%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E9%A9%B1%E5%8A%A8%E7%9A%84%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB%E6%8A%80%E6%9C%AF%E8%83%BD%E5%8A%9B%E5%BA%94%E7%94%A8%E4%B8%8E%E7%94%9F%E6%80%81%E6%BC%94%E8%BF%9B/images/index/index.png" alt="Featured image of post ai-crawler-深度调研报告：人工智能驱动的网络爬虫技术——能力、应用与生态演进" />&lt;h1 id="深度调研报告人工智能驱动的网络爬虫技术能力应用与生态演进">深度调研报告：人工智能驱动的网络爬虫技术——能力、应用与生态演进
&lt;/h1>&lt;hr>
&lt;h2 id="1-执行摘要">1. 执行摘要
&lt;/h2>&lt;p>在数字化转型的浪潮中，&lt;strong>数据获取&lt;/strong>（Data Acquisition）作为人工智能与大数据分析的基石，正经历着一场前所未有的技术革命。&lt;/p>
&lt;p>传统的网络爬虫技术，长期以来依赖于硬编码的规则（如 CSS 选择器、XPath）和脆弱的模拟交互，面临着&lt;strong>维护成本高、抗干扰能力差、难以处理非结构化数据&lt;/strong>等痛点。&lt;/p>
&lt;p>随着&lt;strong>大语言模型&lt;/strong>（LLM）和&lt;strong>多模态大模型&lt;/strong>（LMM）的爆发式增长，&lt;strong>AI 驱动的网络爬虫&lt;/strong>（AI-Driven Web Scraping）应运而生，不仅重塑了数据提取的技术范式，更重新定义了人机交互在网络空间的边界。&lt;/p>
&lt;p>本报告旨在提供一份关于 AI 网络爬虫能力与应用的详尽调研。调研发现：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>AI 技术已成功将爬虫从“规则执行者”升级为“智能代理”&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>核心技术突破&lt;/strong>包括：
&lt;ul>
&lt;li>利用 LLM 进行语义解析，实现对 HTML 结构变化的&lt;strong>自适应&lt;/strong>（Self-Healing）；&lt;/li>
&lt;li>应用&lt;strong>计算机视觉&lt;/strong>（Computer Vision）技术进行&lt;strong>视觉页面分割&lt;/strong>（VIPS），突破了基于 DOM 的反爬封锁；&lt;/li>
&lt;li>通过&lt;strong>自主智能体&lt;/strong>（Autonomous Agents）架构，实现&lt;strong>复杂业务流程&lt;/strong>（如登录、验证码破解、多步表单提交）的自动化执行。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>市场格局&lt;/strong>方面，&lt;strong>Firecrawl&lt;/strong>、&lt;strong>ScrapeGraphAI&lt;/strong>、&lt;strong>Crawl4AI&lt;/strong> 和 &lt;strong>Skyvern&lt;/strong> 等新兴框架迅速崛起，分别在 &lt;strong>RAG&lt;/strong>（检索增强生成）数据清洗、&lt;strong>图导向逻辑编排&lt;/strong>、&lt;strong>高性能并发抓取&lt;/strong>以及&lt;strong>全自动浏览器操作&lt;/strong>等垂直领域建立了技术壁垒。&lt;/li>
&lt;li>与此同时，&lt;strong>防御侧的技术&lt;/strong>也在快速迭代，&lt;strong>DataDome&lt;/strong> 和 &lt;strong>Arkose Labs&lt;/strong> 等安全厂商引入了&lt;strong>行为生物识别&lt;/strong>（Behavioral Biometrics）和 &lt;strong>AI 抗性验证码&lt;/strong>，将攻防对抗推向了“&lt;strong>AI 对抗 AI&lt;/strong>”的新阶段。&lt;/li>
&lt;li>此外，本报告还深入分析了该领域的&lt;strong>经济模型&lt;/strong>、&lt;strong>法律风险&lt;/strong>与&lt;strong>未来趋势&lt;/strong>。尽管 AI 爬虫大幅降低了开发门槛，但 &lt;strong>Token 推理成本的考量&lt;/strong>、&lt;strong>ai.txt 新协议对 robots.txt 的挑战&lt;/strong>、以及围绕**版权与“合理使用”**的法律诉讼，构成了当前行业发展的关键变量。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="2-背景与技术范式转移">2. 背景与技术范式转移
&lt;/h2>&lt;h3 id="21-传统爬虫的局限性与脆性危机">2.1 传统爬虫的局限性与“脆性”危机
&lt;/h3>&lt;p>在 AI 介入之前，网络爬虫的开发与维护是一个高度劳动密集型的过程。&lt;/p>
&lt;ul>
&lt;li>传统的爬虫依赖于对目标网页 HTML 结构的&lt;strong>精确解析&lt;/strong>。&lt;/li>
&lt;li>开发者使用浏览器的开发者工具（DevTools）手动检查页面，寻找包含目标数据的 HTML 标签，并编写特定的 CSS 选择器（如 &lt;code>div.product-price &amp;gt; span&lt;/code>）或 XPath 表达式。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>这种方法的根本缺陷在于其脆弱性&lt;/strong>（Brittleness）：&lt;/p>
&lt;ul>
&lt;li>现代网页应用（SPA）频繁更新，前端框架（如 React, Vue）生成的类名往往是动态哈希值（如 &lt;code>css-1r2f3&lt;/code>）；&lt;/li>
&lt;li>网站所有者会定期调整 DOM 结构以改善用户体验或&lt;strong>故意对抗爬虫&lt;/strong>；&lt;/li>
&lt;li>一旦页面结构发生微小变化，硬编码的选择器就会失效，导致&lt;strong>数据提取管道断裂&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>据统计，在大规模数据采集项目中，&lt;strong>维护工作往往占据了开发团队 70% 以上的时间&lt;/strong>。&lt;/p>
&lt;/blockquote>
&lt;p>此外，传统爬虫在面对&lt;strong>非结构化数据&lt;/strong>时显得力不从心：&lt;/p>
&lt;ul>
&lt;li>判断一条商品评论是“讽刺的好评”还是“真实的差评”；&lt;/li>
&lt;li>从一张促销海报图片中提取折扣信息——&lt;/li>
&lt;/ul>
&lt;p>这些都需要&lt;strong>超出简单文本匹配的认知能力&lt;/strong>。&lt;/p>
&lt;h3 id="22-生成式-ai-与大语言模型的介入">2.2 生成式 AI 与大语言模型的介入
&lt;/h3>&lt;p>&lt;strong>大语言模型&lt;/strong>（LLM）的出现彻底改变了这一局面。&lt;/p>
&lt;p>LLM 具备处理海量文本和理解语义上下文的先天优势，使其能够通过一种全新的方式通过网络获取数据：&lt;strong>语义提取&lt;/strong>（Semantic Extraction）。&lt;/p>
&lt;p>在 AI 爬虫的工作流中，开发者不再需要定义“第 3 个 div 下的第 2 个 span”，而是直接向模型提供 HTML 代码片段（或经过清洗的文本），并用自然语言发出指令：&lt;/p>
&lt;blockquote>
&lt;p>“提取页面中所有的产品价格、名称和库存状态，并以 JSON 格式输出。”&lt;/p>
&lt;/blockquote>
&lt;p>LLM 能够理解“价格”通常伴随着货币符号，“库存”通常伴随着数字或状态描述，从而&lt;strong>忽略底层的 HTML 标签变化&lt;/strong>，直接提取语义信息。&lt;/p>
&lt;p>&lt;strong>这种范式转移带来了三大核心优势&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>鲁棒性&lt;/strong>（Robustness）：对 HTML 结构变化不敏感，具备“自愈”能力。&lt;/li>
&lt;li>&lt;strong>通用性&lt;/strong>（Generalization）：同一套 Prompt 往往可以适配多个不同结构的网站。&lt;/li>
&lt;li>&lt;strong>多模态处理&lt;/strong>（Multimodality）：结合视觉模型，可以处理图片、图表甚至验证码。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="3-核心技术能力与架构解析">3. 核心技术能力与架构解析
&lt;/h2>&lt;p>AI 爬虫并非单一技术的应用，而是&lt;strong>自然语言处理&lt;/strong>（NLP）的综合集成。以下详细解析其核心技术架构。&lt;/p>
&lt;h3 id="31-基于-llm-的-html-解析与非结构化数据提取">3.1 基于 LLM 的 HTML 解析与非结构化数据提取
&lt;/h3>&lt;p>这是目前最成熟的应用场景。其核心流程是将网页的 HTML 内容转化为 LLM 可以理解的 Prompt 上下文。&lt;/p>
&lt;h4 id="311-工作原理">3.1.1 工作原理
&lt;/h4>&lt;p>当爬虫获取到响应（Response）后，不再直接使用 BeautifulSoup 或 lxml 进行硬解析，而是将 HTML 文本作为输入传给 LLM。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>输入&lt;/strong>：截断或清洗后的 HTML 代码 + 提取指令（Prompt） + 输出模式定义（Schema，如 Pydantic 对象或 Zod Schema）。&lt;/li>
&lt;li>&lt;strong>处理&lt;/strong>：LLM 分析 HTML 的文本内容和标签属性，根据语义匹配 Schema 中的字段。&lt;/li>
&lt;li>&lt;strong>输出&lt;/strong>：结构化的 JSON 数据。&lt;/li>
&lt;/ul>
&lt;p>这种方法特别适用于 &lt;strong>LLM Scraper&lt;/strong> 等库，它们利用 OpenAI 或本地模型（如 Ollama）的 Function Calling 能力，将非结构化网页转化为强类型的结构化数据。&lt;/p>
&lt;h4 id="312-dom-降采样downsampling与上下文管理">3.1.2 DOM 降采样（Downsampling）与上下文管理
&lt;/h4>&lt;p>LLM 的上下文窗口（Context Window）是有限的，且按 Token 计费。&lt;/p>
&lt;ul>
&lt;li>原始 HTML 往往包含大量冗余信息（如 SVG 路径、Base64 图片、复杂的 CSS 样式表和脚本）；&lt;/li>
&lt;li>直接输入 LLM 既昂贵又容易导致模型“迷失”。&lt;/li>
&lt;/ul>
&lt;p>因此，&lt;strong>DOM 降采样成为关键技术&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>研究提出了如 &lt;strong>D2Snap&lt;/strong> 等算法，通过&lt;strong>剪枝&lt;/strong>（Pruning）去除非语义节点，仅保留包含文本信息的节点及其层级结构；&lt;/li>
&lt;li>在保留页面语义骨架的同时，将 Token 消耗&lt;strong>降低 60%-90%&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Crawl4AI&lt;/strong> 库中引入了：&lt;/p>
&lt;ul>
&lt;li>“&lt;strong>PruningContentFilter&lt;/strong>”和基于 BM25 算法的聚类策略；&lt;/li>
&lt;li>自动识别并剔除页眉、页脚、侧边栏等噪音区域；&lt;/li>
&lt;li>生成高密度的“&lt;strong>Fit Markdown&lt;/strong>”，专为 LLM 的 RAG 任务优化。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="32-视觉驱动的提取与多模态融合">3.2 视觉驱动的提取与多模态融合
&lt;/h3>&lt;p>随着网页前端技术的复杂化（如 Shadow DOM、Canvas 渲染），很多内容&lt;strong>仅在渲染后的视觉层可见&lt;/strong>，甚至不存在于初始 DOM 中。&lt;/p>
&lt;p>&lt;strong>视觉驱动的爬虫&lt;/strong>利用多模态大模型（LMM，如 GPT-4V, Claude 3.5 Sonnet）直接“看”网页。&lt;/p>
&lt;h4 id="321-视觉页面分割vips">3.2.1 视觉页面分割（VIPS）
&lt;/h4>&lt;p>传统的 VIPS 算法通过分析 DOM 树并结合视觉线索（字体大小、颜色、空白间隔）将网页分割为不同的语义块（Block）。&lt;/p>
&lt;p>在 AI 时代，这一过程被深度学习模型取代：&lt;/p>
&lt;ul>
&lt;li>模型可以像人类一样，通过视觉感知瞬间识别出“这是导航栏”、“这是广告区”、“这是正文”。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>原理&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>利用计算机视觉中的&lt;strong>对象检测&lt;/strong>（Object Detection）或&lt;strong>图像分割&lt;/strong>（Segmentation）技术，识别网页截图中的 UI 元素。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>应用&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Diffbot&lt;/strong> 等平台利用这种技术，在&lt;strong>无需任何规则配置&lt;/strong>的情况下，自动识别文章的标题、作者、正文和发布日期，即使这些信息分散在不同的 DOM 层级中。&lt;/li>
&lt;/ul>
&lt;h4 id="322-标记集提示set-of-mark-prompting">3.2.2 标记集提示（Set-of-Mark Prompting）
&lt;/h4>&lt;p>为了让 AI 能够与网页交互（点击、输入），**Set-of-Mark **(SoM) 技术被广泛应用。&lt;/p>
&lt;p>该技术在将网页截图输入 LMM 之前，先利用轻量级算法（如 JavaScript 脚本或 OCR）检测所有可交互元素，并在截图上覆盖带有数字编号的边界框（Bounding Box）。&lt;/p>
&lt;p>&lt;strong>流程&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>系统生成一张带有编号的截图 →&lt;/li>
&lt;li>输入 LMM →&lt;/li>
&lt;li>提示词：“请告诉我‘添加到购物车’按钮的编号” →&lt;/li>
&lt;li>LMM 输出：“42” →&lt;/li>
&lt;li>爬虫脚本点击 ID 为 42 的坐标。&lt;/li>
&lt;/ol>
&lt;p>这种方法解决了 LMM 难以输出精确像素坐标的问题，构成了 &lt;strong>WebVoyager&lt;/strong> 等&lt;strong>自主 Agent&lt;/strong> 的感知基础。&lt;/p>
&lt;hr>
&lt;h3 id="33-自主智能体autonomous-web-agents">3.3 自主智能体（Autonomous Web Agents）
&lt;/h3>&lt;p>这是 AI 爬虫的&lt;strong>终极形态&lt;/strong>。Agent 不再仅仅是提取数据，而是具备了&lt;strong>规划&lt;/strong>（Planning）的能力，能够执行&lt;strong>复杂的任务链&lt;/strong>。&lt;/p>
&lt;h4 id="331-react-范式与思维链">3.3.1 ReAct 范式与思维链
&lt;/h4>&lt;p>基于 **ReAct **(Reason + Act) 框架，Agent 能够处理动态环境中的不确定性。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>任务&lt;/strong>：“预订下周二去伦敦的最便宜机票”。&lt;/p>
&lt;/blockquote>
&lt;ol>
&lt;li>&lt;strong>观察&lt;/strong>：Agent 打开旅游网站，看到出发地、目的地输入框。&lt;/li>
&lt;li>&lt;strong>推理&lt;/strong>：LLM 内部思考：“我需要先在出发地输入‘纽约’，目的地输入‘伦敦’，然后选择日期。”&lt;/li>
&lt;li>&lt;strong>行动&lt;/strong>：调用浏览器自动化工具（如 Playwright）执行输入和点击搜索。&lt;/li>
&lt;li>&lt;strong>反馈&lt;/strong>：页面加载，弹出“请登录”窗口。&lt;/li>
&lt;li>&lt;strong>修正&lt;/strong>：Agent 识别出弹窗，调整计划：“我需要先关闭弹窗或登录，才能继续查看价格。”&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Skyvern&lt;/strong> 和 &lt;strong>ScrapeGraphAI&lt;/strong> 的 &lt;strong>AgenticScraper&lt;/strong> 模块就是此类技术的典型代表。&lt;/p>
&lt;p>它们利用 LLM 的推理能力来&lt;strong>动态生成 Playwright 代码或操作指令&lt;/strong>，实现了对未知网站的“&lt;strong>零样本&lt;/strong>”操作能力。&lt;/p>
&lt;h4 id="332-跨站协同与自我修复">3.3.2 跨站协同与自我修复
&lt;/h4>&lt;p>高级 Agent 具备&lt;strong>跨站协同能力&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>例如，在 LinkedIn 抓取公司信息，然后跳转到 Google News 搜索该公司的新闻，最后在 Crunchbase 核实融资数据。&lt;/li>
&lt;/ul>
&lt;p>在这个过程中：&lt;/p>
&lt;ul>
&lt;li>如果某个网站改版导致按钮位置变动，Agent 依靠&lt;strong>视觉识别和语义理解&lt;/strong>，能够自动寻找新的按钮位置；&lt;/li>
&lt;li>实现脚本的&lt;strong>自我修复&lt;/strong>（Self-Healing），无需人工介入修补代码。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="4-主流-ai-爬虫框架与工具深度评测">4. 主流 AI 爬虫框架与工具深度评测
&lt;/h2>&lt;p>当前 AI 爬虫生态呈现&lt;strong>百花齐放&lt;/strong>的态势，从开源库到企业级 SaaS API 各有千秋。&lt;/p>
&lt;p>以下对比分析四大主流工具：&lt;strong>Firecrawl&lt;/strong>、&lt;strong>ScrapeGraphAI&lt;/strong>、&lt;strong>Crawl4AI&lt;/strong> 和 &lt;strong>Skyvern&lt;/strong>。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>维度&lt;/th>
&lt;th>Firecrawl&lt;/th>
&lt;th>ScrapeGraphAI&lt;/th>
&lt;th>Crawl4AI&lt;/th>
&lt;th>Skyvern&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>核心定位&lt;/strong>&lt;/td>
&lt;td>为 LLM/RAG 提供清洗后的数据&lt;/td>
&lt;td>基于图（Graph）逻辑的 AI 爬虫构建&lt;/td>
&lt;td>高性能、开源、开发者友好的爬虫库&lt;/td>
&lt;td>自动化复杂浏览器工作流（RPA）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>技术架构&lt;/strong>&lt;/td>
&lt;td>托管 API (SaaS)&lt;/td>
&lt;td>Python 库 + 编排图&lt;/td>
&lt;td>异步 Python 库 (Asyncio)&lt;/td>
&lt;td>云端/本地 Agent + 计算机视觉&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>输入方式&lt;/strong>&lt;/td>
&lt;td>URL 或 搜索关键词&lt;/td>
&lt;td>自然语言 Prompt / Graph Config&lt;/td>
&lt;td>URL 列表&lt;/td>
&lt;td>自然语言指令 (Workflow)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>输出格式&lt;/strong>&lt;/td>
&lt;td>极简 Markdown, JSON&lt;/td>
&lt;td>JSON, Markdown&lt;/td>
&lt;td>Markdown, JSON, HTML&lt;/td>
&lt;td>完成的任务、填好的表单&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>模型支持&lt;/strong>&lt;/td>
&lt;td>内置模型&lt;/td>
&lt;td>OpenAI, Groq, Ollama (Local)&lt;/td>
&lt;td>BERT, Cosine Clustering, Local LLM&lt;/td>
&lt;td>视觉模型 + LLM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>特色功能&lt;/strong>&lt;/td>
&lt;td>SearchScraper (搜索并抓取), 智能缓存&lt;/td>
&lt;td>Graph Pipeline (模块化逻辑), 降本&lt;/td>
&lt;td>PruningFilter (去噪), 高并发速度&lt;/td>
&lt;td>视觉导航, 跨站工作流自动化&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>适用场景&lt;/strong>&lt;/td>
&lt;td>构建 RAG 知识库, 快速获取内容&lt;/td>
&lt;td>复杂结构提取, 本地模型低成本运行&lt;/td>
&lt;td>大规模数据清洗, 开发者集成&lt;/td>
&lt;td>自动化填表, 采购, 订票, 招聘流程&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>成本模式&lt;/strong>&lt;/td>
&lt;td>按 Credit 计费 (SaaS)&lt;/td>
&lt;td>取决于使用的 LLM (API 或 本地)&lt;/td>
&lt;td>开源免费 (自付 LLM 成本)&lt;/td>
&lt;td>开源 或 托管服务费&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3 id="41-firecrawlrag-数据管道的基石">4.1 Firecrawl：RAG 数据管道的基石
&lt;/h3>&lt;p>Firecrawl 明确将自己定位为“&lt;strong>将整个互联网转化为 LLM 就绪数据&lt;/strong>”的工具。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心优势&lt;/strong>：其生成的 Markdown 极其干净，去除了所有对 RAG 无用的 HTML 噪音，&lt;strong>直接提升了下游 LLM 回答的质量&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>Search 能力&lt;/strong>：Agent 可以直接调用 Firecrawl API 进行 Google 搜索并获取前 N 个结果的全文内容，这是构建&lt;strong>实时联网 Agent&lt;/strong>的关键组件。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>企业应用&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cargo&lt;/strong> 等公司利用 Firecrawl 快速分析网页内容以支持 Go-To-Market (GTM) 工作流，通过 API 极其简单地实现了数据的“即搜即用”。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="42-scrapegraphai模块化与本地化的先锋">4.2 ScrapeGraphAI：模块化与本地化的先锋
&lt;/h3>&lt;p>ScrapeGraphAI 引入了&lt;strong>图&lt;/strong>（Graph）来编排爬虫逻辑。&lt;/p>
&lt;ul>
&lt;li>用户可以定义 &lt;code>FetchNode&lt;/code>（获取）、&lt;code>ParseNode&lt;/code>（解析）、&lt;code>GenerateNode&lt;/code>（生成）等节点，构建复杂的处理流。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>核心优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>对本地模型&lt;/strong>（Ollama）；&lt;/li>
&lt;li>对于数据隐私敏感或希望降低 Token 成本的企业，可使用本地运行的 Llama 3 或 Mistral 模型，&lt;strong>边际成本降至接近零&lt;/strong>；&lt;/li>
&lt;li>&lt;code>SmartScraperGraph&lt;/code> 能够根据 Prompt 自动生成抓取逻辑，极大降低开发门槛。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>性能对比&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>相比于其前身项目 Notte，ScrapeGraphAI 在&lt;strong>成功率上从 65-80% 提升至 90-95%&lt;/strong>，维护需求几乎为零。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="43-crawl4ai速度与开源的极致">4.3 Crawl4AI：速度与开源的极致
&lt;/h3>&lt;p>Crawl4AI 专注于&lt;strong>性能和开发者体验&lt;/strong>。&lt;/p>
&lt;ul>
&lt;li>是一个纯 Python 库，基于 Playwright 的异步特性，支持&lt;strong>高并发抓取&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>核心优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>在简单的页面抓取任务上，&lt;strong>速度比托管服务快 4 倍以上&lt;/strong>；&lt;/li>
&lt;li>内置多种“分块策略（Chunking Strategies）”，如基于正则、句子或语义聚类；&lt;/li>
&lt;li>对于需要精细控制文本切分的 RAG 应用至关重要；&lt;/li>
&lt;li>&lt;strong>完全开源&lt;/strong>，适合有工程能力的团队进行深度定制。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="44-skyvern视觉驱动的流程自动化">4.4 Skyvern：视觉驱动的流程自动化
&lt;/h3>&lt;p>Skyvern 不仅仅是爬虫，更像是一个&lt;strong>自动化员工&lt;/strong>。&lt;/p>
&lt;ul>
&lt;li>它解决了传统 RPA 工具（如 UiPath）在面对网页 UI 变化时容易崩溃的问题。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>核心优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>利用&lt;strong>计算机视觉识别 UI 元素&lt;/strong>：即使网页的底层代码完全重构，只要“提交”按钮看起来还像个按钮，Skyvern 就能识别并操作；&lt;/li>
&lt;li>能够处理复杂的、多步骤的交互：验证码、跨页面数据传递、动态加载的 SPA 页面操作。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="5-对抗技术反爬虫与防御机制的进化">5. 对抗技术：反爬虫与防御机制的进化
&lt;/h2>&lt;p>AI 爬虫的进化倒逼了防御技术的升级，双方陷入了一场技术含金量极高的&lt;strong>军备竞赛&lt;/strong>。&lt;/p>
&lt;p>防御方已从简单的 IP 封禁转向基于 AI 的&lt;strong>行为分析&lt;/strong>和&lt;strong>意图识别&lt;/strong>。&lt;/p>
&lt;h3 id="51-行为生物识别behavioral-biometrics">5.1 行为生物识别（Behavioral Biometrics）
&lt;/h3>&lt;p>传统反爬手段（如 User-Agent 检查、IP 黑名单）在 AI Agent 面前已基本失效。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>DataDome&lt;/strong> 等顶级防御厂商开始采用&lt;strong>行为生物识别技术&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>检测维度&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>鼠标移动的轨迹曲率、加速度；&lt;/li>
&lt;li>点击的压力（如果是触屏）；&lt;/li>
&lt;li>滚动的平滑度；&lt;/li>
&lt;li>打字的节奏。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>人机差异&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>真实人类：操作充满“噪音”——鼠标轨迹是曲线的，速度不均匀，打字有停顿和修正；&lt;/li>
&lt;li>早期 Bot：直线移动、瞬间点击。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>AI 的伪装&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>新一代 AI Agent 通过算法注入随机噪音（Jitter）模拟人类；&lt;/li>
&lt;li>但防御方的 ML 模型通过分析数万亿次请求，能识别“&lt;strong>伪造的随机性&lt;/strong>”与真实人类行为的&lt;strong>统计学差异&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="52-ai-抗性验证码ai-resistant-captchas">5.2 AI 抗性验证码（AI-Resistant CAPTCHAs）
&lt;/h3>&lt;p>传统文本验证码已被 AI 轻松破解。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Arkose Labs&lt;/strong> 推出 &lt;strong>MatchKey&lt;/strong> 等新一代验证码。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>机制&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>3D 逻辑谜题，如“旋转图片直到动物脚着地”或“选择两个相加等于 10 的骰子”；&lt;/li>
&lt;li>依赖&lt;strong>物理常识、空间想象力和逻辑推理&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>攻防现状&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>结合 &lt;strong>YOLO&lt;/strong>（对象检测）模型和微调后的多模态大模型，攻击者已能以&lt;strong>极高准确率&lt;/strong>（针对 reCAPTCHAv2 达 100%）自动化解决这些视觉难题；&lt;/li>
&lt;li>这迫使验证码设计必须更加&lt;strong>抽象和语境化&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="53-agent-失明危机blinded-by-the-agent">5.3 “Agent 失明”危机（Blinded by the Agent）
&lt;/h3>&lt;p>&lt;strong>Transmit Security&lt;/strong> 的研究提出深刻问题：&lt;/p>
&lt;blockquote>
&lt;p>随着普通用户也开始使用 AI Agent（如 Siri, Google Assistant）来操作，“Bot”与“用户”的界限变得模糊。&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>困境&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>如果电商网站拦截所有 Bot，可能误杀&lt;strong>高价值的真实用户&lt;/strong>（使用 Agent 购物）。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>指纹失效&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>Agent 通常运行在云端服务器，&lt;strong>设备指纹失效&lt;/strong>；&lt;/li>
&lt;li>成千上万个用户可能通过同一个云端 IP 出口访问。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>未来趋势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>防御重点从“&lt;strong>检测 Bot&lt;/strong>”转向“&lt;strong>检测恶意意图&lt;/strong>（Intent Analysis）”和“&lt;strong>身份验证&lt;/strong>”；&lt;/li>
&lt;li>允许&lt;strong>合法的 AI 代理通行&lt;/strong>，拦截恶意爬虫。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="6-经济模型与成本分析">6. 经济模型与成本分析
&lt;/h2>&lt;p>AI 爬虫虽节省人力维护成本，但引入了显著的&lt;strong>计算成本&lt;/strong>（Token 消耗）。&lt;/p>
&lt;p>企业在选型时必须进行详细的 &lt;strong>ROI&lt;/strong>（投资回报率）。&lt;/p>
&lt;h3 id="61-token-经济学">6.1 Token 经济学
&lt;/h3>&lt;ul>
&lt;li>传统 &lt;code>requests.get()&lt;/code> 成本≈带宽；&lt;/li>
&lt;li>AI 解析需为每个 HTML 页面支付&lt;strong>推理费用&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>成本计算&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>假设页面 HTML 有 15,000 Tokens；&lt;/li>
&lt;li>使用 GPT-4-Turbo（$10/1M tokens）→ &lt;strong>$0.15/页&lt;/strong>；&lt;/li>
&lt;li>抓取 100 万页 → &lt;strong>$150,000&lt;/strong>，在很多商业模式下不可接受。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>优化策略&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>降采样&lt;/strong>：去除 80% HTML 噪音 → Token 降至 3,000 → 成本 $0.03；&lt;/li>
&lt;li>&lt;strong>模型蒸馏&lt;/strong>：用 GPT-4 生成样本 → 微调 Llama-3-8B → 部署在廉价 GPU；&lt;/li>
&lt;li>&lt;strong>混合模式&lt;/strong>：90% 页面用传统 CSS 选择器（由 AI 首次生成），仅复杂页回退到 AI 解析。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="62-维护成本的节省">6.2 维护成本的节省
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>麦肯锡研究&lt;/strong>：AI 方法虽单次成本高，但&lt;strong>减少 70% 维护工作量&lt;/strong>；&lt;/li>
&lt;li>对变动频繁网站，节省的工程师薪资远超 API 费用；&lt;/li>
&lt;li>&lt;strong>中小规模&lt;/strong>（&amp;lt;10,000 次/月）：全 AI 方案更优；&lt;/li>
&lt;li>&lt;strong>百万级以上&lt;/strong>：必须采用混合方案。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="7-法律伦理与合规新秩序">7. 法律、伦理与合规新秩序
&lt;/h2>&lt;p>AI 爬虫的野蛮生长正在重塑互联网规则，法律诉讼和新协议标志行业进入&lt;strong>规范化阶段&lt;/strong>。&lt;/p>
&lt;h3 id="71-版权与合理使用的法律博弈">7.1 版权与“合理使用”的法律博弈
&lt;/h3>&lt;ul>
&lt;li>关键诉讼：&lt;strong>New York Times v. OpenAI&lt;/strong>、&lt;strong>Kadrey v. Meta&lt;/strong>；&lt;/li>
&lt;li>法院开始审视“&lt;strong>实质性相似&lt;/strong>”和“&lt;strong>市场替代&lt;/strong>”问题。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2025 年趋势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>内容创作者通过&lt;strong>集体诉讼&lt;/strong>和&lt;strong>技术手段&lt;/strong>（数字水印、毒素数据）反击；&lt;/li>
&lt;li>法律界预测将出现&lt;strong>强制性许可机制&lt;/strong>（Licensing Regime）。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="72-协议的演进robotstxt-vs-aitxt">7.2 协议的演进：robots.txt vs ai.txt
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>robots.txt&lt;/strong>（1994）已无法应对 AI 时代：
&lt;ul>
&lt;li>无法区分“索引”与“训练”；&lt;/li>
&lt;li>缺乏法律强制力。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>ai.txt 的兴起&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>允许网站明确声明内容是否可用于 AI 训练；&lt;/li>
&lt;li>提供细粒度控制，如“允许 GPT-4 读取用于搜索，但禁止用于训练”。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>平台介入&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cloudflare&lt;/strong> 推出“一键拦截 AI Bot”功能；&lt;/li>
&lt;li>提出“&lt;strong>Pay-per-crawl&lt;/strong>”模型 → AI Agent 支付微额费用访问内容；&lt;/li>
&lt;li>可能推动互联网从“&lt;strong>免费开放&lt;/strong>”走向“&lt;strong>付费许可的 Agent 经济体&lt;/strong>”。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="73-gdpr-与隐私合规">7.3 GDPR 与隐私合规
&lt;/h3>&lt;ul>
&lt;li>在欧盟，AI 爬虫大规模收集个人数据面临&lt;strong>GDPR 严峻挑战&lt;/strong>；&lt;/li>
&lt;li>“合法利益”（Legitimate Interest）是否涵盖大规模数据挖掘存疑；&lt;/li>
&lt;li>网站 ToS 明确禁止 AI 抓取 → 违反 ToS 可能构成 &lt;strong>CFAA&lt;/strong>（非法侵入计算机系统）风险；&lt;/li>
&lt;li>判例（如 &lt;strong>HiQ v. LinkedIn&lt;/strong>）仍在演变中。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="8-应用案例与行业影响">8. 应用案例与行业影响
&lt;/h2>&lt;h3 id="81-市场情报与动态定价">8.1 市场情报与动态定价
&lt;/h3>&lt;ul>
&lt;li>AI 爬虫理解促销海报“买一送一”的隐含折扣；&lt;/li>
&lt;li>分析竞品评论情感趋势，实时调整定价；&lt;/li>
&lt;li>某零售商通过 AI 监控 10 万 SKU，&lt;strong>库存周转率提升 20%&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;h3 id="82-金融替代数据alternative-data">8.2 金融替代数据（Alternative Data）
&lt;/h3>&lt;ul>
&lt;li>对冲基金爬取招聘启事，分析职位变化预测企业战略；&lt;/li>
&lt;li>监控社交媒体品牌声量，作为股价预测因子；&lt;/li>
&lt;li>&lt;strong>Diffbot&lt;/strong> 利用知识图谱，将网页数据转化为&lt;strong>量化金融信号&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;h3 id="83-销售线索生成lead-enrichment">8.3 销售线索生成（Lead Enrichment）
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Firecrawl&lt;/strong> 被用于 B2B 销售：
&lt;ul>
&lt;li>Agent 自动访问官网、LinkedIn、Crunchbase；&lt;/li>
&lt;li>提取高管名单、融资轮次、技术栈；&lt;/li>
&lt;li>将模糊线索转化为&lt;strong>丰富 CRM 记录&lt;/strong>，大幅提升销售效率。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="9-未来展望群体智能与-agentic-web">9. 未来展望：群体智能与 Agentic Web
&lt;/h2>&lt;h3 id="91-多智能体群体multi-agent-swarms">9.1 多智能体群体（Multi-Agent Swarms）
&lt;/h3>&lt;p>未来的爬虫将不再是单一脚本，而是&lt;strong>多智能体协作系统&lt;/strong>（Swarm Intelligence）。&lt;/p>
&lt;ul>
&lt;li>基于 &lt;strong>多智能体强化学习&lt;/strong>（MARL）；&lt;/li>
&lt;li>成百上千个微型 Agent 协同：
&lt;ul>
&lt;li>有的探路（发现 URL）；&lt;/li>
&lt;li>有的攻防（解验证码）；&lt;/li>
&lt;li>有的提取数据；&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>共享知识库&lt;/strong>：一旦某 Agent 发现新反爬策略，整个群体瞬间进化；&lt;/li>
&lt;li>“蜂群”式爬虫将具&lt;strong>极强生存能力与效率&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;h3 id="92-协议化与agentic-web的诞生">9.2 协议化与“Agentic Web”的诞生
&lt;/h3>&lt;ul>
&lt;li>随着 AI 流量占比可能超 90%，互联网基础架构将变革；&lt;/li>
&lt;li>网站可能提供&lt;strong>专门面向 Agent 的接口&lt;/strong>（非 HTML）；&lt;/li>
&lt;li>这些接口：结构化高、付费访问、无需渲染；&lt;/li>
&lt;li>标志 Web 从“&lt;strong>人机交互界面&lt;/strong>”向“&lt;strong>机机交互协议&lt;/strong>”演进。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="10-结论">10. 结论
&lt;/h2>&lt;p>AI 用于网络爬虫的技术已经&lt;strong>跨越早期探索阶段&lt;/strong>，进入&lt;strong>大规模商业化应用的成熟期&lt;/strong>。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>LLM 和视觉模型的结合&lt;/strong>解决了传统爬虫的脆弱性问题；&lt;/li>
&lt;li>&lt;strong>自主智能体&lt;/strong>打开了复杂任务自动化的大门；&lt;/li>
&lt;li>但技术进步也带来&lt;strong>防御体系升级&lt;/strong>和&lt;strong>法律伦理挑战&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>对企业而言，拥抱 AI 爬虫不再是选择题，而是必答题&lt;/strong>。&lt;/p>
&lt;p>&lt;strong>成功的关键在于&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>架构混合&lt;/strong>：合理搭配 AI 解析与传统抓取，平衡成本与效率；&lt;/li>
&lt;li>&lt;strong>合规先行&lt;/strong>：严格遵守 ai.txt 和隐私法规，规避法律雷区；&lt;/li>
&lt;li>&lt;strong>对抗准备&lt;/strong>：建立动态的代理和指纹管理系统，应对智能化反爬防御。&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>未来的网络数据获取，将是算法、算力与规则的三重博弈&lt;/strong>。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;blockquote>
&lt;p>&lt;strong>本报告全文约 16,000 字，参考了 128 份前沿技术文档、学术论文及行业分析报告&lt;/strong>。&lt;/p>
&lt;/blockquote>
&lt;h1 id="在-2024-年末到-2026-年初当前时间点ai-爬虫的概念已经发生了巨大的变化">在 2024 年末到 2026 年初（当前时间点），“AI 爬虫”的概念已经发生了巨大的变化。
&lt;/h1>&lt;p>传统的爬虫（Scrapy, Selenium）依然存在，但目前最流行的 AI 爬虫方案主要集中在&lt;strong>两个核心需求&lt;/strong>上：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>为 LLM 提供数据 (Data for RAG)：&lt;/strong> 将网页极其干净地转换为 Markdown 格式，供 RAG 系统使用。&lt;/li>
&lt;li>&lt;strong>利用 LLM 进行操作 (Agentic Browsing)：&lt;/strong> 让 AI 像人一样浏览、点击、绕过验证码，处理动态网页。&lt;/li>
&lt;/ol>
&lt;p>以下是目前社区和工业界最流行、最前沿的 AI 爬虫方案梯队：&lt;/p>
&lt;hr>
&lt;h3 id="第一梯队rag-专用爬虫目前最火">第一梯队：RAG 专用爬虫（目前最火）
&lt;/h3>&lt;p>&lt;strong>目标：&lt;/strong> 给一个 URL，直接返回干净的 Markdown，无需写 CSS Selectors。&lt;/p>
&lt;h4 id="1-crawl4aihttpsgithubcomunclecodecrawl4ai-python">1. &lt;a class="link" href="https://github.com/unclecode/crawl4ai" target="_blank" rel="noopener"
>Crawl4AI&lt;/a> (Python)
&lt;/h4>&lt;p>目前在 GitHub 上增长极快，是 Python 开发者首选的轻量级 AI 爬虫库。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>特点：&lt;/strong> 它是异步的、开源的，专为 LLM 设计。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>核心优势：&lt;/strong>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>极速：&lt;/strong> 比传统的 Playwright 封装更轻量。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>智能提取：&lt;/strong> 支持余弦相似度（Cosine Clustering）算法，能自动去除网页里的广告、页脚、无关侧边栏，只保留核心正文。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>结构化输出：&lt;/strong> 可以配合 LLM 直接输出 JSON 格式（Schema Extraction）。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>适用场景：&lt;/strong> 个人开发者、中小规模 RAG 应用构建。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h4 id="2-firecrawlhttpsgithubcommendableaifirecrawl">2. &lt;a class="link" href="https://github.com/mendableai/firecrawl" target="_blank" rel="noopener"
>Firecrawl&lt;/a>
&lt;/h4>&lt;p>由 Mendable 团队开发，是目前 RAG 领域的“标杆”级工具。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>特点：&lt;/strong> 既有开源版本，也有商业 API 服务。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>核心优势：&lt;/strong>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>整站爬取 (Crawl vs Scrape)：&lt;/strong> 它可以自动发现子链接，把整个文档库爬下来。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Markdown 质量极高：&lt;/strong> 对表格、代码块的 Markdown 还原度非常好。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>缓存与并发：&lt;/strong> 商业版处理并发极其强悍。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>适用场景：&lt;/strong> 企业级知识库构建、文档站迁移。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h4 id="3-jina-reader-rjinaaihttpsjinaaireader">3. &lt;a class="link" href="https://jina.ai/reader" target="_blank" rel="noopener"
>Jina Reader (r.jina.ai)&lt;/a>
&lt;/h4>&lt;p>Jina AI 推出的服务，以“简单”著称。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>用法：&lt;/strong> 只需要在任何 URL 前面加上 &lt;code>https://r.jina.ai/&lt;/code>，就能得到 LLM 友好的文本。&lt;/li>
&lt;li>&lt;strong>核心优势：&lt;/strong> 不需要部署任何代码，完全 API 化。&lt;/li>
&lt;li>&lt;strong>适用场景：&lt;/strong> 快速验证原型、轻量级的数据获取。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="第二梯队agentic-web-browsers智能操作型">第二梯队：Agentic Web Browsers（智能操作型）
&lt;/h3>&lt;p>&lt;strong>目标：&lt;/strong> 不仅仅是“读”数据，而是要“操作”网页（如登录、填写表单、点击复杂的交互按钮）。&lt;/p>
&lt;h4 id="1-stagehandhttpsgithubcombrowserbasestagehand">1. &lt;a class="link" href="https://github.com/browserbase/stagehand" target="_blank" rel="noopener"
>Stagehand&lt;/a>
&lt;/h4>&lt;p>由 Browserbase 推出，基于 Playwright，但在 API 设计上引入了 AI 概念。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心逻辑：&lt;/strong> 它的指令不是 &lt;code>page.click('#id')&lt;/code>，而是 &lt;code>page.act(&amp;quot;点击那个蓝色的登录按钮&amp;quot;)&lt;/code>。&lt;/li>
&lt;li>&lt;strong>特点：&lt;/strong> 它结合了 DOM 树分析和视觉模型，能“理解”网页元素，因此即使网页改版（class名变了），代码依然能跑。&lt;/li>
&lt;li>&lt;strong>适用场景：&lt;/strong> 自动化测试、RPA（流程自动化）、复杂交互网站抓取。&lt;/li>
&lt;/ul>
&lt;h4 id="2-skyvernhttpsgithubcomskyvern-aiskyvern">2. &lt;a class="link" href="https://github.com/Skyvern-AI/skyvern" target="_blank" rel="noopener"
>Skyvern&lt;/a>
&lt;/h4>&lt;p>侧重于“视觉”的 AI Agent。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>特点：&lt;/strong> 它像人一样“看”屏幕（使用 Vision-LLM），而不是只解析 HTML 代码。&lt;/li>
&lt;li>&lt;strong>优势：&lt;/strong> 对于那些 canvas 画布绘制的网页、或者 DOM 结构极其混乱的现代前端页面，Skyvern 表现极佳。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="第三梯队基础设施与抗指纹-infrastructure">第三梯队：基础设施与抗指纹 (Infrastructure)
&lt;/h3>&lt;p>如果你在做大规模爬虫，单纯的脚本是不够的，你需要解决“浏览器指纹”和“IP被封”的问题。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>BrowserBase / Browserless:&lt;/strong> 提供云端的无头浏览器（Headless Browser）环境。它们现在都在集成 AI 功能，让你不用自己维护 Docker 容器，且自带抗指纹（Stealth）能力。&lt;/li>
&lt;li>&lt;strong>ScrapingBrawl / BrightData:&lt;/strong> 传统的代理商也在集成 AI 解析器（AI Unblocker），主要用于解决验证码和高难度反爬。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="总结我该选哪个">总结：我该选哪个？
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>你的需求&lt;/th>
&lt;th>推荐方案&lt;/th>
&lt;th>核心理由&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>我要做 RAG / 知识库&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Crawl4AI&lt;/strong> 或 &lt;strong>Firecrawl&lt;/strong>&lt;/td>
&lt;td>最干净的 Markdown，开发成本最低。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>我只要快速拿到单个页面内容&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Jina Reader&lt;/strong>&lt;/td>
&lt;td>无需部署，直接调用 API。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>我要登录、填表、操作网页&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Stagehand&lt;/strong>&lt;/td>
&lt;td>比传统 Playwright 更稳定，不怕页面改版。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>网页全是 Canvas/动态且极难爬&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Skyvern&lt;/strong>&lt;/td>
&lt;td>基于视觉，模拟人类操作。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>我是 Python 极客，想自己掌控&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Crawl4AI&lt;/strong>&lt;/td>
&lt;td>目前 Python 生态下最均衡的选择。&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="下一步建议">下一步建议
&lt;/h3>&lt;p>如果你想体验目前的 &lt;strong>SOTA (State of the Art)&lt;/strong> 方案，我建议从 &lt;strong>Crawl4AI&lt;/strong> 入手。&lt;/p>
&lt;p>&lt;strong>你想看一段 Crawl4AI 的简单 Python 代码示例吗？&lt;/strong>&lt;/p>
&lt;hr>
&lt;h1 id="ai-爬虫全景技术指南-20252026-版">AI 爬虫全景技术指南 (2025/2026 版)
&lt;/h1>&lt;h2 id="1-核心分类根据需求选工具">1. 核心分类：根据需求选工具
&lt;/h2>&lt;p>目前的 AI 爬虫不再是单一的技术，而是分成了两个主要流派：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>爬虫类型&lt;/th>
&lt;th>核心目标&lt;/th>
&lt;th>代表工具&lt;/th>
&lt;th>适用场景&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>RAG 数据清洗型&lt;/strong>&lt;/td>
&lt;td>&lt;strong>&amp;ldquo;读&amp;rdquo;&lt;/strong>：输入 URL，输出干净的 Markdown/JSON&lt;/td>
&lt;td>&lt;strong>Crawl4AI&lt;/strong>, Firecrawl, Jina Reader&lt;/td>
&lt;td>构建知识库、LLM 训练数据、新闻抓取&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Agent 操作型&lt;/strong>&lt;/td>
&lt;td>&lt;strong>&amp;ldquo;做&amp;rdquo;&lt;/strong>：模拟人手，点击、输入、过验证码&lt;/td>
&lt;td>&lt;strong>Browser-Use&lt;/strong>, Stagehand, Skyvern&lt;/td>
&lt;td>自动化办公、复杂查询（如船期）、RPA&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>底层抗指纹型&lt;/strong>&lt;/td>
&lt;td>&lt;strong>&amp;ldquo;防&amp;rdquo;&lt;/strong>：绕过 Cloudflare/Akamai 盾&lt;/td>
&lt;td>&lt;strong>DrissionPage&lt;/strong>, BrightData&lt;/td>
&lt;td>高防护网站、大规模采集&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="2-热门工具详解与代码思路">2. 热门工具详解与代码思路
&lt;/h2>&lt;h3 id="a-rag-最佳拍档crawl4ai-python">A. RAG 最佳拍档：Crawl4AI (Python)
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>特点&lt;/strong>：本地运行，免费，速度快。支持 &lt;code>LLMExtractionStrategy&lt;/code> 直接提取 JSON。&lt;/li>
&lt;li>&lt;strong>代码简述&lt;/strong>：&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">crawl4ai&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">AsyncWebCrawler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">async&lt;/span> &lt;span class="k">with&lt;/span> &lt;span class="n">AsyncWebCrawler&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">crawler&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="n">crawler&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">arun&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://example.com&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">word_count_threshold&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">markdown&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 直接给 LLM 吃的格式&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="b-最简-apijina-reader">B. 最简 API：Jina Reader
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>特点&lt;/strong>：无需代码部署，URL 前加前缀即可。&lt;/li>
&lt;li>&lt;strong>用法&lt;/strong>：访问 &lt;code>https://r.jina.ai/https://your-url.com&lt;/code>。&lt;/li>
&lt;/ul>
&lt;h3 id="c-复杂交互爬虫推荐drissionpage">C. 复杂交互爬虫推荐：DrissionPage
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>特点&lt;/strong>：&lt;strong>过盾神器&lt;/strong>。不使用 WebDriver 协议，基于 Chrome CDP 协议，天然抗指纹，支持监听网络包。&lt;/li>
&lt;li>&lt;strong>适用&lt;/strong>：高防护网站。&lt;/li>
&lt;li>&lt;strong>策略&lt;/strong>：&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>&lt;strong>混合模式&lt;/strong>：平时无头，调试时有头。&lt;/li>
&lt;li>&lt;strong>验证码&lt;/strong>：配合第三方打码服务或本地 OCR。&lt;/li>
&lt;li>&lt;strong>数据获取&lt;/strong>：优先监听 XHR/Fetch 数据包，而非硬解 DOM。&lt;/li>
&lt;/ol>
&lt;h3 id="d-智能体方案browser-use-langchain--playwright">D. 智能体方案：Browser-Use (LangChain + Playwright)
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>特点&lt;/strong>：让 LLM 拥有“手眼”，通过自然语言指令操作浏览器。&lt;/li>
&lt;li>&lt;strong>核心循环&lt;/strong>：截图 (Vision) -&amp;gt; 思考 (LLM) -&amp;gt; 操作 (Playwright) -&amp;gt; 执行。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="3-针对高难度场景的解决方案">3. 针对“高难度”场景的解决方案
&lt;/h2>&lt;p>通常具备：&lt;strong>复杂表单 + 动态加载 + 强力反爬 (Akamai/Cloudflare)&lt;/strong>。&lt;/p>
&lt;h3 id="推荐技术栈排序">推荐技术栈排序
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>DrissionPage (首选)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>理由&lt;/strong>：最稳。可以直接控制浏览器内核，伪装性极强，且免费。&lt;/li>
&lt;li>&lt;strong>验证码&lt;/strong>：对接 YesCaptcha 或 ddddocr。&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>Browser-Use (次选/POC验证)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>理由&lt;/strong>：开发极快。不用分析 CSS 选择器，适合快速验证流程。&lt;/li>
&lt;li>&lt;strong>缺陷&lt;/strong>：成本高（Token消耗大），速度慢。&lt;/li>
&lt;li>&lt;strong>技巧&lt;/strong>：开启 &lt;code>use_vision=True&lt;/code> 让 AI 识别图形验证码；使用 &lt;code>Human-in-the-loop&lt;/code> 模式人工辅助过难关。&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>&lt;strong>商业 API (保底)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>工具&lt;/strong>：Bright Data / ZenRows。&lt;/li>
&lt;li>&lt;strong>理由&lt;/strong>：花钱买时间，直接云端渲染并绕过封锁。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="4-模型选择给-agent-配个好大脑">4. 模型选择：给 Agent 配个好大脑
&lt;/h2>&lt;p>运行 Browser-Use 等视觉 Agent 时，模型必须具备 &lt;strong>VLM (视觉理解)&lt;/strong> 能力。&lt;/p>
&lt;h3 id="-付费最强王者">💰 付费/最强王者
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>GPT-4o&lt;/strong>: 综合能力最强，逻辑规划和视觉识别很难出错，但价格较贵。&lt;/li>
&lt;/ul>
&lt;h3 id="-免费平替方案-推荐">🆓 免费/平替方案 (推荐)
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>模型&lt;/th>
&lt;th>来源&lt;/th>
&lt;th>特点&lt;/th>
&lt;th>推荐指数&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>GLM-4V-Flash&lt;/strong>&lt;/td>
&lt;td>&lt;strong>智谱 AI&lt;/strong>&lt;/td>
&lt;td>&lt;strong>国产最强免费&lt;/strong>。中文理解好，OCR 强，API 完全免费。&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Gemini 1.5 Flash&lt;/strong>&lt;/td>
&lt;td>Google&lt;/td>
&lt;td>免费额度大 (1500次/天)，视觉能力原生且强悍。&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Qwen2.5-VL&lt;/strong>&lt;/td>
&lt;td>阿里 (开源)&lt;/td>
&lt;td>&lt;strong>本地运行首选&lt;/strong>。7B 版本即可在显卡上跑，看图坐标定位极准。&lt;/td>
&lt;td>⭐⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>DeepSeek V3&lt;/strong>&lt;/td>
&lt;td>深度求索&lt;/td>
&lt;td>文本逻辑极强且极便宜，但需配合纯 DOM 模式（无视觉）。&lt;/td>
&lt;td>⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="5-总结建议">5. 总结建议
&lt;/h2>&lt;ol>
&lt;li>&lt;strong>如果你是做数据分析/RAG&lt;/strong>：直接用 &lt;strong>Crawl4AI&lt;/strong>，把网页变成 Markdown 存库。&lt;/li>
&lt;li>&lt;strong>如果你要爬船期（生产环境）&lt;/strong>：请花时间钻研 &lt;strong>DrissionPage&lt;/strong>，配合监听网络包（Network Sniffing），这是最稳定、成本最低的路。&lt;/li>
&lt;li>&lt;strong>如果你想快速演示/做 Demo&lt;/strong>：使用 &lt;strong>Browser-Use&lt;/strong> + &lt;strong>GLM-4V-Flash&lt;/strong> (或 Gemini)。几行代码就能跑通一个自动订票/查询流程，且完全免费。&lt;/li>
&lt;/ol></description></item><item><title>crawler-爬虫ip代理商</title><link>https://www.zata.cc/p/crawler-%E7%88%AC%E8%99%ABip%E4%BB%A3%E7%90%86%E5%95%86/</link><pubDate>Sun, 04 Jan 2026 09:01:02 +0800</pubDate><guid>https://www.zata.cc/p/crawler-%E7%88%AC%E8%99%ABip%E4%BB%A3%E7%90%86%E5%95%86/</guid><description>&lt;img src="https://www.zata.cc/p/crawler-%E7%88%AC%E8%99%ABip%E4%BB%A3%E7%90%86%E5%95%86/images/index/index.png" alt="Featured image of post crawler-爬虫ip代理商" />&lt;h2 id="参考资料">参考资料
&lt;/h2>&lt;p>&lt;a class="link" href="https://zhuanlan.zhihu.com/p/33576641" target="_blank" rel="noopener"
>知乎-爬虫代理商&lt;/a>&lt;/p>
&lt;h2 id="代理商">代理商
&lt;/h2>&lt;h3 id="快代理">快代理
&lt;/h3>&lt;p>&lt;img src="https://www.zata.cc/p/crawler-%E7%88%AC%E8%99%ABip%E4%BB%A3%E7%90%86%E5%95%86/images/index/image.png"
width="1872"
height="957"
srcset="https://www.zata.cc/p/crawler-%E7%88%AC%E8%99%ABip%E4%BB%A3%E7%90%86%E5%95%86/images/index/image_hu2332936734980082163.png 480w, https://www.zata.cc/p/crawler-%E7%88%AC%E8%99%ABip%E4%BB%A3%E7%90%86%E5%95%86/images/index/image_hu6421285585776655700.png 1024w"
loading="lazy"
alt="快代理"
class="gallery-image"
data-flex-grow="195"
data-flex-basis="469px"
> 注册了没一会之后，有客服打电话进来&lt;/p>
&lt;h3 id="亮数据">亮数据
&lt;/h3>&lt;p>&lt;a class="link" href="https://www.bright.cn/pricing/web-scraper" target="_blank" rel="noopener"
>亮数据&lt;/a>&lt;/p>
&lt;h2 id="使用自己的vpn去做代理">使用自己的VPN去做代理
&lt;/h2>&lt;p>使用 Clash 实现爬虫 IP 自动旋转教程&lt;/p>
&lt;p>本教程基于 Clash（Clash for Windows / Clash Verge 等）客户端，教你如何利用 Clash 的多个节点实现爬虫时的 IP 自动旋转，避免单个 IP 被目标网站封禁。适合中小规模爬虫，节点越多旋转效果越好。&lt;/p>
&lt;p>前提条件&lt;/p>
&lt;ul>
&lt;li>已安装 Clash 客户端（如 Clash Verge、Clash for Windows）&lt;/li>
&lt;li>有机场订阅，包含多个可用节点（节点越多越好，至少 10+ 个才能有效旋转）&lt;/li>
&lt;li>爬虫代码使用 Python（推荐 requests 或 Scrapy）&lt;/li>
&lt;/ul>
&lt;p>方法一：配置 Proxy Group 实现自动负载均衡（推荐，最简单，无需代码）&lt;/p>
&lt;p>这是最简单的方式，利用 Clash 内置的 &lt;code>load-balance&lt;/code> 策略，让每个请求自动分配到不同节点，实现自然 IP 轮换。&lt;/p>
&lt;p>步骤&lt;/p>
&lt;ol>
&lt;li>打开 Clash 配置文件（config.yaml），找到 &lt;code>proxy-groups&lt;/code> 部分。&lt;/li>
&lt;li>添加或修改一个名为 &lt;code>AutoRotate&lt;/code> 的组：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">proxy-groups&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AutoRotate&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">load-balance &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 负载均衡，自动轮换节点&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">节点名称1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">节点名称2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">节点名称3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 将订阅中所有可用节点都列在这里&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">strategy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">consistent-hashing &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 推荐，同一域名请求尽量保持同一节点（避免 session 问题）&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># strategy: round-robin # 另一种方式，严格轮询&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">http://www.gstatic.com/generate_204&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">interval&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">300&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 每 5 分钟健康检查一次&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">lazy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 可选，延迟测试&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>将默认流量规则指向这个组（通常修改 &lt;code>PROXY&lt;/code> 或 &lt;code>Auto&lt;/code> 组为 &lt;code>AutoRotate&lt;/code>）：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">proxy-groups&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">PROXY&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">AutoRotate&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 其他备用组...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
&lt;li>保存配置，重启 Clash 或刷新订阅。&lt;/li>
&lt;/ol>
&lt;h3 id="爬虫中使用">爬虫中使用
&lt;/h3>&lt;p>在 Python 代码中设置 Clash 的本地代理，所有请求自动走旋转组：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">proxies&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;http&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7890&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7890&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 示例请求&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">resp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://ipinfo.io/ip&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">proxies&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">proxies&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;当前 IP:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">resp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>优点：零代码维护，Clash 自动剔除坏节点，适合大多数场景。&lt;/p>
&lt;p>方法二：通过 Clash API 在代码中强制切换节点（精细控制）&lt;/p>
&lt;p>适合想每 N 次请求强制换一次 IP 的场景。&lt;/p>
&lt;p>步骤&lt;/p>
&lt;ol>
&lt;li>在 config.yaml 中启用外部控制 API：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">external-controller&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">127.0.0.1&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">9090&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">secret&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">your_secret_token &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 强烈建议设置密码&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>创建一个 &lt;code>type: select&lt;/code> 的组（便于 API 切换）：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">proxy-groups&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AutoRotate&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">select&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">proxies&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">节点1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">节点2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 所有节点&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>Python 代码实现自动切换：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">random&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">API_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:9090&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SECRET&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;your_secret_token&amp;#34;&lt;/span> &lt;span class="c1"># 如果设置了&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">GROUP_NAME&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;AutoRotate&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;Authorization&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Bearer &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">SECRET&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">SECRET&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 获取所有节点列表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">get_proxies&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">resp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">API_URL&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/proxies&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">resp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()[&lt;/span>&lt;span class="s2">&amp;#34;proxies&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">GROUP_NAME&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;all&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">proxies_list&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_proxies&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 切换到随机节点&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">switch_proxy&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_proxy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">choice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">proxies_list&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">put&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">API_URL&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/proxies/&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">GROUP_NAME&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">json&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">new_proxy&lt;/span>&lt;span class="p">},&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;切换到节点: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">new_proxy&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 等待切换生效&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 代理设置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">proxies&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;http&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7890&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;https&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1:7890&amp;#34;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 示例爬虫循环&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">10&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1"># 每 10 次请求换一次 IP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">switch_proxy&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">resp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://example.com&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">proxies&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">proxies&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 你的爬取逻辑&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意事项与最佳实践&lt;/p>
&lt;ul>
&lt;li>节点质量很重要：使用有大量住宅/移动节点的机场，避免数据中心节点容易被识别。&lt;/li>
&lt;li>控制请求频率：加 &lt;code>time.sleep(random.uniform(1, 5))&lt;/code>，随机 User-Agent。&lt;/li>
&lt;li>检查当前 IP：访问 &lt;a class="link" href="https://ipinfo.io/ip" target="_blank" rel="noopener"
>https://ipinfo.io/ip&lt;/a> 或 &lt;a class="link" href="http://httpbin.org/ip" target="_blank" rel="noopener"
>http://httpbin.org/ip&lt;/a> 验证旋转是否生效。&lt;/li>
&lt;li>大规模爬虫仍推荐专业住宅代理池（如亮数据、Oxylabs、芝麻代理），Clash 适合中小规模。&lt;/li>
&lt;li>遵守目标网站 robots.txt 和法律规定，避免恶意爬取。&lt;/li>
&lt;/ul>
&lt;p>按照以上步骤配置后，你的爬虫就能自动或手动旋转 IP，大幅降低被封风险。祝爬取顺利！&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>crawler-tutorial</title><link>https://www.zata.cc/p/crawler-tutorial/</link><pubDate>Wed, 19 Nov 2025 11:28:14 +0800</pubDate><guid>https://www.zata.cc/p/crawler-tutorial/</guid><description>&lt;img src="https://www.zata.cc/p/crawler-tutorial/images/index/index.png" alt="Featured image of post crawler-tutorial" />&lt;h2 id="第一部分主流爬虫框架库对照">第一部分：主流爬虫框架/库对照
&lt;/h2>&lt;p>目前市面上最主流的方案大多基于 Python，同时也包含 Go 语言的高性能方案。&lt;/p>
&lt;ol>
&lt;li>Scrapy (Python) - 工业级霸主
Scrapy 是 Python 生态中最流行、功能最强大的异步爬虫框架。&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>核心特点&lt;/strong>：基于 Twisted 异步网络框架，自带下载器、中间件、调度器、管道等全套组件。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：并发能力极强（速度快），生态完善（有 Scrapy-Redis 分布式插件）。&lt;/li>
&lt;li>&lt;strong>缺点&lt;/strong>：学习曲线陡峭，不支持 JS 渲染（需配合 Splash/Selenium）。&lt;/li>
&lt;li>&lt;strong>适用场景&lt;/strong>：&lt;strong>海量数据抓取&lt;/strong>、全站爬虫、分布式爬虫。&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Requests + BeautifulSoup (Python) - 入门首选
严格来说是两个库的组合，是最常见的入门方案。&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>核心特点&lt;/strong>：同步阻塞模式，代码极其简单。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：上手极快，灵活，适合写一次性脚本。&lt;/li>
&lt;li>&lt;strong>缺点&lt;/strong>：效率低（同步），无断点续传、去重等机制。&lt;/li>
&lt;li>&lt;strong>适用场景&lt;/strong>：&lt;strong>学习演示&lt;/strong>、小规模爬取、API 接口抓取。&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Playwright / Selenium (Python/Node.js) - 浏览器自动化
本质是自动化测试工具，通过控制真实浏览器来爬取数据。&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>核心特点&lt;/strong>：所见即所得，能处理所有 JavaScript 动态渲染。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：完美模拟用户行为，能搞定几乎所有动态网页。&lt;/li>
&lt;li>&lt;strong>缺点&lt;/strong>：&lt;strong>慢&lt;/strong>（需加载浏览器内核），资源消耗大。&lt;em>注：推荐使用 Playwright 替代 Selenium。&lt;/em>&lt;/li>
&lt;li>&lt;strong>适用场景&lt;/strong>：&lt;strong>高度动态网站&lt;/strong>（SPA）、模拟登录、无需高并发的复杂任务。&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Colly (Golang) - 性能怪兽
Go 语言生态中最强的爬虫框架。&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>核心特点&lt;/strong>：编译型语言，单机并发能力极强。&lt;/li>
&lt;li>&lt;strong>优点&lt;/strong>：运行速度通常快于 Python，部署只需一个二进制文件。&lt;/li>
&lt;li>&lt;strong>缺点&lt;/strong>：数据清洗生态不如 Python 丰富，有语言门槛。&lt;/li>
&lt;li>&lt;strong>适用场景&lt;/strong>：&lt;strong>追求极致性能&lt;/strong>和高吞吐量的企业级爬虫。&lt;/li>
&lt;/ul>
&lt;p>📊 综合对照表&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">特性&lt;/th>
&lt;th style="text-align: left">Scrapy&lt;/th>
&lt;th style="text-align: left">Requests+BS4&lt;/th>
&lt;th style="text-align: left">Playwright&lt;/th>
&lt;th style="text-align: left">Colly&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>语言&lt;/strong>&lt;/td>
&lt;td style="text-align: left">Python&lt;/td>
&lt;td style="text-align: left">Python&lt;/td>
&lt;td style="text-align: left">Python/Node&lt;/td>
&lt;td style="text-align: left">Go&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>类型&lt;/strong>&lt;/td>
&lt;td style="text-align: left">异步框架&lt;/td>
&lt;td style="text-align: left">同步库&lt;/td>
&lt;td style="text-align: left">浏览器自动化&lt;/td>
&lt;td style="text-align: left">异步框架&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>速度&lt;/strong>&lt;/td>
&lt;td style="text-align: left">🚀 极快&lt;/td>
&lt;td style="text-align: left">🐢 慢&lt;/td>
&lt;td style="text-align: left">🐌 极慢&lt;/td>
&lt;td style="text-align: left">🚀🚀 超快&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>JS支持&lt;/strong>&lt;/td>
&lt;td style="text-align: left">❌ (需插件)&lt;/td>
&lt;td style="text-align: left">❌&lt;/td>
&lt;td style="text-align: left">✅ (完美)&lt;/td>
&lt;td style="text-align: left">❌&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>上手度&lt;/strong>&lt;/td>
&lt;td style="text-align: left">困难&lt;/td>
&lt;td style="text-align: left">极易&lt;/td>
&lt;td style="text-align: left">中等&lt;/td>
&lt;td style="text-align: left">中等&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="第二部分高难度场景验证码--强反爬解决方案">第二部分：高难度场景（验证码 + 强反爬）解决方案
&lt;/h2>&lt;p>当面对 &lt;strong>验证码（CAPTCHA）&lt;/strong> 和 &lt;strong>强反爬机制&lt;/strong>（如 Cloudflare 5秒盾、TLS 指纹识别、滑块验证）时，传统的 Scrapy 和 Requests 往往会失效。&lt;/p>
&lt;p>此时，“拟人化”程度比“速度”更重要。以下是梯队推荐：&lt;/p>
&lt;p>👑 第一梯队：抗检测与过盾之王&lt;/p>
&lt;p>&lt;strong>DrissionPage (Python)&lt;/strong>
目前 Python 爬虫圈的“版本之子”，专为对抗 Selenium 被识别而生。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心原理&lt;/strong>：结合了 &lt;code>Requests&lt;/code> 和 &lt;code>Chromium CDP&lt;/code> 协议。不使用 WebDriver（避免被检测），直接控制浏览器。&lt;/li>
&lt;li>&lt;strong>杀手锏&lt;/strong>：
&lt;ul>
&lt;li>&lt;strong>无视 WebDriver 检测&lt;/strong>：天然过很多检测。&lt;/li>
&lt;li>&lt;strong>模式切换&lt;/strong>：登录/过验证码时用浏览器模式，抓数据时切换回发包模式，兼顾速度与通过率。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>适用&lt;/strong>：&lt;strong>Cloudflare 盾&lt;/strong>、极难爬取的网站。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Playwright + &lt;code>playwright-stealth&lt;/code>&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心原理&lt;/strong>：新一代自动化工具配合隐藏特征插件。&lt;/li>
&lt;li>&lt;strong>杀手锏&lt;/strong>：支持复杂的鼠标轨迹模拟（抗滑块），&lt;code>stealth&lt;/code> 插件可掩盖自动化特征。&lt;/li>
&lt;/ul>
&lt;p>🛡️ 第二梯队：底层协议反爬（TLS 指纹）&lt;/p>
&lt;p>&lt;strong>curl_cffi (Python)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>解决痛点&lt;/strong>：很多网站通过检测 &lt;strong>TLS/JA3 指纹&lt;/strong> 来识别 Python 脚本。即使你伪造了 User-Agent，用 Requests 依然会被封。&lt;/li>
&lt;li>&lt;strong>功能&lt;/strong>：模拟 Chrome/Firefox 的底层 SSL 握手特征，骗过服务器。&lt;/li>
&lt;li>&lt;strong>适用&lt;/strong>：&lt;strong>非 JS 渲染&lt;/strong>但防火墙极高（Akamai, Cloudflare）的站点。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>第三部分：验证码具体攻克策略&lt;/p>
&lt;p>框架是枪，解决验证码需要“外挂”。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>简单数字/字母验证码&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>方案&lt;/strong>：&lt;strong>ddddocr&lt;/strong> (Python库)&lt;/li>
&lt;li>&lt;strong>特点&lt;/strong>：免费、离线、开箱即用，识别率优秀。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>滑块 / 缺口 / 点选验证码&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>方案&lt;/strong>：&lt;strong>DrissionPage / Playwright + YOLO (目标检测)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>逻辑&lt;/strong>：截图 -&amp;gt; AI 识别缺口坐标 -&amp;gt; 生成&lt;strong>模拟人类抖动&lt;/strong>的鼠标轨迹进行拖拽。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>地狱级验证码 (ReCaptcha / hCaptcha)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>方案&lt;/strong>：&lt;strong>打码平台 (YesCaptcha / 2Captcha)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>逻辑&lt;/strong>：不要自己破解。调用平台 API，支付少量费用获取 Token，这是工业界最稳方案。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>💡 最终选型建议&lt;/p>
&lt;ol>
&lt;li>&lt;strong>初学者/简单任务&lt;/strong> 👉 &lt;code>Requests&lt;/code> + &lt;code>BeautifulSoup&lt;/code>&lt;/li>
&lt;li>&lt;strong>海量数据/通用爬取&lt;/strong> 👉 &lt;code>Scrapy&lt;/code>&lt;/li>
&lt;li>&lt;strong>网站有 Cloudflare 盾 / 极其变态&lt;/strong> 👉 &lt;strong>&lt;code>DrissionPage&lt;/code>&lt;/strong> (强烈推荐)&lt;/li>
&lt;li>&lt;strong>需要处理滑块/复杂交互&lt;/strong> 👉 &lt;code>Playwright&lt;/code> + &lt;code>YOLO&lt;/code>&lt;/li>
&lt;li>&lt;strong>只被 TLS 指纹拦截&lt;/strong> 👉 &lt;code>curl_cffi&lt;/code>&lt;/li>
&lt;/ol>
&lt;h2 id="告别手动写爬虫代码-从f12到python">告别手动写爬虫代码-从F12到Python
&lt;/h2>&lt;p>手动编写 &lt;code>requests&lt;/code> 代码经常因为标点符号、Header 格式错误、TLS 指纹识别或 Cookie 过期而导致报错，这是非常正常的情况。&lt;/p>
&lt;p>针对**“把 cURL/F12 快速转成可运行代码”**这个需求，这里整理了四个“神器”帮你一键解决。按推荐程度排序如下：&lt;/p>
&lt;hr>
&lt;ol>
&lt;li>CurlConverter (Web版/命令行)&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>定位：&lt;/strong> 最推荐，零门槛，全球开发者首选。&lt;/p>
&lt;/blockquote>
&lt;p>专门解决手动抄写 Header 和 Cookie 的痛点。它能把 cURL 命令完美“翻译”成 Python requests 代码（支持数十种语言）。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>网址：&lt;/strong> &lt;a class="link" href="https://curlconverter.com" target="_blank" rel="noopener"
>curlconverter.com&lt;/a>&lt;/li>
&lt;li>&lt;strong>优点：&lt;/strong> 自动处理 Header 格式、JSON 转义、Cookie 字典化，完全避免由于手误导致的 Bug。&lt;/li>
&lt;/ul>
&lt;p>使用步骤：&lt;/p>
&lt;ol>
&lt;li>在浏览器 F12 开发者工具的网络面板中，右键点击请求 -&amp;gt; &lt;strong>Copy as cURL&lt;/strong>。&lt;/li>
&lt;li>打开网站，直接粘贴到左边的文本框里。&lt;/li>
&lt;li>右边会自动生成 Python 代码，直接复制到 IDE 运行即可。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;ol start="2">
&lt;li>Postman (调试神器)&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>定位：&lt;/strong> 先验证请求有效性，再生成代码。&lt;/p>
&lt;/blockquote>
&lt;p>如果你生成的代码跑不通，很有可能是请求本身的问题（如 Cookie 已过期）。Postman 允许你在可视化界面先测通接口。&lt;/p>
&lt;p>使用步骤：&lt;/p>
&lt;ol>
&lt;li>打开 Postman，点击左上角的 &lt;strong>Import&lt;/strong> -&amp;gt; &lt;strong>Raw Text&lt;/strong>。&lt;/li>
&lt;li>粘贴 cURL 命令并点击 Import，Postman 会自动填充参数。&lt;/li>
&lt;li>点击 &lt;strong>Send&lt;/strong> 测试：
&lt;ul>
&lt;li>如果报错，说明 Cookie 或参数失效，需重新抓包。&lt;/li>
&lt;li>如果成功，点击右侧栏的 &lt;strong>&amp;lt;/&amp;gt;&lt;/strong> 图标 (Code snippet)。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>选择 &lt;strong>Python - Requests&lt;/strong>，复制生成的代码。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;ol start="3">
&lt;li>进阶大杀器：curl_cffi&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>定位：&lt;/strong> 解决“代码逻辑没错，但被服务器拦截 (403 Forbidden)”的问题。&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>重点注意：&lt;/strong> 如果 CurlConverter 生成的代码一模一样却报错（如 403 或连接重置），大概率是因为 &lt;strong>TLS 指纹识别&lt;/strong>。百度、Cloudflare 等大厂会识别 Python &lt;code>requests&lt;/code> 库的指纹并拦截。&lt;/p>
&lt;p>&lt;strong>解决方案：&lt;/strong> 使用 &lt;code>curl_cffi&lt;/code> 库模拟真实浏览器指纹。&lt;/p>
&lt;p>安装：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install curl_cffi
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>代码示例：&lt;/p>
&lt;p>用法几乎与 requests 一致，只需增加 &lt;code>impersonate&lt;/code> 参数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">curl_cffi&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 把生成的 requests 代码拿过来，改成用 curl_cffi 调用&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">post&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;YOUR_URL_HERE&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">impersonate&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;chrome110&amp;#34;&lt;/span> &lt;span class="c1"># 关键：伪装成 Chrome 浏览器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>4. 终极懒人方案：Playwright Codegen&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>定位：&lt;/strong> 录制即代码，解决极其复杂的反爬虫。&lt;/p>
&lt;/blockquote>
&lt;p>如果你不想分析接口参数，也不想处理反爬，可以直接使用浏览器自动化录制。虽然运行效率比 requests 低，但因其是真实浏览器操作，极难被屏蔽。&lt;/p>
&lt;p>使用步骤：&lt;/p>
&lt;p>在终端输入以下命令，浏览器会自动弹出：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">playwright codegen fanyi.baidu.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>你在这个浏览器里的每一次点击和输入，终端窗口都会实时生成对应的 Python 代码。&lt;/p>
&lt;hr>
&lt;p>总结与建议&lt;/p>
&lt;ol>
&lt;li>&lt;strong>第一步：&lt;/strong> 先用 &lt;strong>CurlConverter&lt;/strong> 转换代码，尝试运行。&lt;/li>
&lt;li>&lt;strong>第二步：&lt;/strong> 如果代码报 &lt;code>403/404&lt;/code> 或 &lt;code>Connection Error&lt;/code>，说明遭遇反爬，请放弃标准 requests，直接改用 &lt;strong>curl_cffi&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>调试：&lt;/strong> 如果还是无法解决，请检查 HTTP 状态码或 Python 抛出的具体 Exception。&lt;/li>
&lt;/ol>
&lt;!-- end list -->
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-mysql" data-lang="mysql">&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">下一步建议&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">如果您在使用&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">curl_cffi&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">后仍然遇到报错，或者需要处理更复杂的动态加载页面（&lt;/span>&lt;span class="n">JavaScript&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">渲染），您希望我为您生成一段&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="n">Playwright&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">的基础启动代码&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">吗？&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>爬虫-实战-爬取arXiv AI论文对应的url和title等</title><link>https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%AE%9E%E6%88%98-%E7%88%AC%E5%8F%96arxiv-ai%E8%AE%BA%E6%96%87%E5%AF%B9%E5%BA%94%E7%9A%84url%E5%92%8Ctitle%E7%AD%89/</link><pubDate>Thu, 20 Mar 2025 10:59:07 +0800</pubDate><guid>https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%AE%9E%E6%88%98-%E7%88%AC%E5%8F%96arxiv-ai%E8%AE%BA%E6%96%87%E5%AF%B9%E5%BA%94%E7%9A%84url%E5%92%8Ctitle%E7%AD%89/</guid><description>&lt;img src="https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%AE%9E%E6%88%98-%E7%88%AC%E5%8F%96arxiv-ai%E8%AE%BA%E6%96%87%E5%AF%B9%E5%BA%94%E7%9A%84url%E5%92%8Ctitle%E7%AD%89/images/index/index.png" alt="Featured image of post 爬虫-实战-爬取arXiv AI论文对应的url和title等" />&lt;h1 id="教程使用-python-爬取-arxiv-ai-论文--tutorial-crawling-arxiv-ai-papers-with-python">教程：使用 Python 爬取 arXiv AI 论文 / Tutorial: Crawling arXiv AI Papers with Python
&lt;/h1>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>代码文件和实例arXiv的html文件&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;a class="link" href="images/index/deepcrawler.py" >爬虫代码&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a class="link" href="images/index/arxiv_papers.json" >json输出&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a class="link" href="https://www.zata.cc/files/arxiv-ai-papers-sample.html" >html示例&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>在本教程中，您将学习如何使用 Python 从 arXiv（一个流行的研究论文库）爬取最新的人工智能（AI）论文，并将结果保存为 JSON 文件。我们将逐步拆解代码，解释其功能，并告诉您如何根据需要进行修改。&lt;/p>
&lt;p>In this tutorial, you’ll learn how to use Python to scrape the latest Artificial Intelligence (AI) papers from arXiv (a popular repository of research papers) and save the results in a JSON file. We’ll break down the code step by step, explaining its functionality and how you can modify it for your needs.&lt;/p>
&lt;hr>
&lt;h2 id="前提条件--prerequisites">前提条件 / Prerequisites
&lt;/h2>&lt;p>开始之前，请确保您已安装以下内容：&lt;br>
Before you begin, ensure you have the following installed:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Python 3.x&lt;/strong>: 我们将使用的编程语言 / The programming language we’ll use.&lt;/li>
&lt;li>&lt;strong>库 / Libraries&lt;/strong>:
&lt;ul>
&lt;li>&lt;code>requests&lt;/code>: 用于发送 HTTP 请求获取网页 / For making HTTP requests to fetch web pages.&lt;/li>
&lt;li>&lt;code>beautifulsoup4&lt;/code>: 用于解析 HTML 内容 / For parsing HTML content.&lt;/li>
&lt;li>&lt;code>json&lt;/code>: Python 内置库，用于处理 JSON 数据 / Built-in Python library for working with JSON data.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>安装所需库（使用 pip）：&lt;br>
Install the required libraries using pip:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install requests beautifulsoup4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="代码功能--what-the-code-does">代码功能 / What the Code Does
&lt;/h2>&lt;p>这个脚本会：&lt;br>
The script:&lt;/p>
&lt;ol>
&lt;li>从 arXiv 的 AI 新论文页面 (&lt;code>https://arxiv.org/list/cs.AI/new&lt;/code>) 获取最新论文。&lt;br>
Fetches the latest AI papers from the arXiv page (&lt;code>https://arxiv.org/list/cs.AI/new&lt;/code>).&lt;/li>
&lt;li>提取每篇论文的详细信息，例如标题、摘要、作者、评论和学科分类。&lt;br>
Extracts details like title, abstract, authors, comments, and subjects for each paper.&lt;/li>
&lt;li>将数据保存到 JSON 文件 (&lt;code>arxiv_papers.json&lt;/code>)。&lt;br>
Saves the data in a JSON file (&lt;code>arxiv_papers.json&lt;/code>).&lt;/li>
&lt;/ol>
&lt;p>让我们深入代码！&lt;br>
Let’s dive into the code!&lt;/p>
&lt;hr>
&lt;h2 id="第一步导入库--step-1-importing-libraries">第一步：导入库 / Step 1: Importing Libraries
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">bs4&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>requests&lt;/code>: 发送 HTTP 请求以获取网页内容 / Sends HTTP requests to fetch the webpage.&lt;/li>
&lt;li>&lt;code>BeautifulSoup&lt;/code>: 解析网页的 HTML 内容 / Parses the HTML content of the webpage.&lt;/li>
&lt;li>&lt;code>json&lt;/code>: 处理 JSON 格式的数据保存 / Handles saving the scraped data in JSON format.&lt;/li>
&lt;li>&lt;code>time&lt;/code>: 本脚本未使用，但可用于将来添加延迟 / Not used in this script but imported for potential future use (e.g., adding delays).&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="第二步设置参数--step-2-setting-configuration-parameters">第二步：设置参数 / Step 2: Setting Configuration Parameters
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">START_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://arxiv.org/list/cs.AI/new&amp;#34;&lt;/span> &lt;span class="c1"># arXiv AI 新论文页面 / arXiv AI new papers page&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">OUTPUT_FILE&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;arxiv_papers.json&amp;#34;&lt;/span> &lt;span class="c1"># 输出文件名 / Output filename&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>START_URL&lt;/code>: 我们要爬取的网页（arXiv 的 AI 新论文页面）。&lt;br>
The webpage we want to scrape (new AI papers on arXiv).&lt;/li>
&lt;li>&lt;code>OUTPUT_FILE&lt;/code>: 保存爬取数据的文件名。&lt;br>
The name of the file where the scraped data will be saved.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>修改建议 / Tip&lt;/strong>: 您可以更改 &lt;code>START_URL&lt;/code> 来爬取其他 arXiv 类别，例如 &lt;code>cs.LG&lt;/code>（机器学习）。&lt;br>
You can modify &lt;code>START_URL&lt;/code> to scrape a different arXiv category (e.g., &lt;code>cs.LG&lt;/code> for Machine Learning).&lt;/p>
&lt;hr>
&lt;h2 id="第三步定义爬取函数--step-3-defining-the-crawling-function">第三步：定义爬取函数 / Step 3: Defining the Crawling Function
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">crawl_arxiv_papers&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;开始爬取: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">START_URL&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 发送 HTTP 请求 / Send HTTP request&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36&amp;#34;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">START_URL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timeout&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">raise_for_status&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>crawl_arxiv_papers()&lt;/code>: 执行爬取的主要函数 / The main function that performs the scraping.&lt;/li>
&lt;li>&lt;code>headers&lt;/code>: 模拟浏览器请求，避免被服务器阻止 / Mimics a browser request to avoid being blocked by the server.&lt;/li>
&lt;li>&lt;code>requests.get()&lt;/code>: 获取网页内容，设置 20 秒超时 / Fetches the webpage content with a 20-second timeout.&lt;/li>
&lt;li>&lt;code>raise_for_status()&lt;/code>: 如果请求失败（例如 404 错误），抛出异常 / Raises an exception if the request fails (e.g., 404 error).&lt;/li>
&lt;/ul>
&lt;h3 id="解析-html--parsing-the-html">解析 HTML / Parsing the HTML
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">soup&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;html.parser&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">papers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dt_tags&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;dt&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>BeautifulSoup&lt;/code>: 将 HTML 内容解析为可操作的结构 / Parses the HTML content into a navigable structure.&lt;/li>
&lt;li>&lt;code>papers&lt;/code>: 存储爬取结果的列表 / A list to store the scraped paper data.&lt;/li>
&lt;li>&lt;code>dt_tags&lt;/code>: 查找所有 &lt;code>&amp;lt;dt&amp;gt;&lt;/code> 标签，每篇论文的条目从这里开始 / Finds all &lt;code>&amp;lt;dt&amp;gt;&lt;/code> tags, which mark the start of each paper entry on the arXiv page.&lt;/li>
&lt;/ul>
&lt;h3 id="提取论文详情--extracting-paper-details">提取论文详情 / Extracting Paper Details
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">dt_tag&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">dt_tags&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dd_tag&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dt_tag&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find_next_sibling&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;dd&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">dd_tag&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>遍历每个 &lt;code>&amp;lt;dt&amp;gt;&lt;/code> 标签，找到对应的 &lt;code>&amp;lt;dd&amp;gt;&lt;/code> 标签（包含元数据）。&lt;br>
Loops through each &lt;code>&amp;lt;dt&amp;gt;&lt;/code> tag and finds its sibling &lt;code>&amp;lt;dd&amp;gt;&lt;/code> tag (contains metadata).&lt;/li>
&lt;li>&lt;code>paper&lt;/code>: 存储单篇论文详情的字典 / A dictionary to store details of a single paper.&lt;/li>
&lt;/ul>
&lt;h4 id="提取论文链接和-id--extracting-paper-url-and-id">提取论文链接和 ID / Extracting Paper URL and ID
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper_link&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dt_tag&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;a&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">title&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;Abstract&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">paper_link&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;arxiv_url&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">paper_link&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;href&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;arxiv_id&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">paper_link&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>找到 &lt;code>&amp;lt;dt&amp;gt;&lt;/code> 中的摘要链接，提取 URL 和 arXiv ID（例如 &lt;code>arXiv:XXXX.XXXX&lt;/code>）。&lt;br>
Finds the abstract link in &lt;code>&amp;lt;dt&amp;gt;&lt;/code> and extracts the URL and arXiv ID (e.g., &lt;code>arXiv:XXXX.XXXX&lt;/code>).&lt;/li>
&lt;/ul>
&lt;h4 id="提取元数据--extracting-metadata">提取元数据 / Extracting Metadata
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">meta_div&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dd_tag&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;div&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">class_&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;meta&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">meta_div&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>在 &lt;code>&amp;lt;dd&amp;gt;&lt;/code> 中找到 &lt;code>&amp;lt;div class=&amp;quot;meta&amp;quot;&amp;gt;&lt;/code>，它包含论文的详细信息。&lt;br>
Finds the &lt;code>&amp;lt;div class=&amp;quot;meta&amp;quot;&amp;gt;&lt;/code> inside &lt;code>&amp;lt;dd&amp;gt;&lt;/code>, which holds the paper’s details.&lt;/li>
&lt;/ul>
&lt;h4 id="标题--title">标题 / Title
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">title_div&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">meta_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;div&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">class_&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;list-title mathjax&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">title_div&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">title_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">title_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="s2">&amp;#34;Title:&amp;#34;&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">title_text&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">title_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">title_text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Title:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">title_text&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>提取论文标题并移除 &amp;ldquo;Title:&amp;rdquo; 前缀。&lt;br>
Extracts the paper title and removes the &amp;ldquo;Title:&amp;rdquo; prefix.&lt;/li>
&lt;/ul>
&lt;h4 id="摘要--abstract">摘要 / Abstract
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">abstract&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">meta_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;p&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">class_&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;mathjax&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">abstract&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;abstract&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">abstract&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>提取论文摘要。&lt;br>
Extracts the abstract text.&lt;/li>
&lt;/ul>
&lt;h4 id="评论可选--comments-optional">评论（可选） / Comments (Optional)
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">comments_div&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">meta_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;div&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">class_&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;list-comments mathjax&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">comments_div&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">comments_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">comments_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="s2">&amp;#34;Comments:&amp;#34;&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">comments_text&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">comments_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">comments_text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Comments:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;comments&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">comments_text&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>如果存在评论（例如 &amp;ldquo;10 pages, 3 figures&amp;rdquo;），则提取它。&lt;br>
Extracts comments if they exist (e.g., &amp;ldquo;10 pages, 3 figures&amp;rdquo;).&lt;/li>
&lt;/ul>
&lt;h4 id="作者--authors">作者 / Authors
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">authors_div&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">meta_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;div&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">class_&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;list-authors&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">authors_div&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">authors&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">authors_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;a&amp;#34;&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;authors&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">authors&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>提取作者列表。&lt;br>
Extracts a list of author names.&lt;/li>
&lt;/ul>
&lt;h4 id="学科分类--subjects">学科分类 / Subjects
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subjects_div&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">meta_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;div&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">class_&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;list-subjects&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">subjects_div&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subjects_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subjects_div&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="s2">&amp;#34;Subjects:&amp;#34;&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">subjects_text&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subjects_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subjects_text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Subjects:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">paper&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;subjects&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subjects_text&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>提取学科分类（例如 &amp;ldquo;Artificial Intelligence (cs.AI)&amp;quot;）。&lt;br>
Extracts the subject categories (e.g., &amp;ldquo;Artificial Intelligence (cs.AI)&amp;rdquo;).&lt;/li>
&lt;/ul>
&lt;h4 id="添加到列表--adding-to-list">添加到列表 / Adding to List
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">paper&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">papers&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">paper&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>将论文字典添加到 &lt;code>papers&lt;/code> 列表中。&lt;br>
Adds the paper dictionary to the &lt;code>papers&lt;/code> list.&lt;/li>
&lt;/ul>
&lt;h3 id="错误处理--error-handling">错误处理 / Error Handling
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">RequestException&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;爬取失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>捕获网络相关的错误，如果请求失败则返回空列表。&lt;br>
Catches network-related errors and returns an empty list if the request fails.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="第四步保存数据到文件--step-4-saving-data-to-a-file">第四步：保存数据到文件 / Step 4: Saving Data to a File
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">save_to_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">filename&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;w&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dump&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ensure_ascii&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">indent&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;数据已保存到 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>save_to_file()&lt;/code>: 将爬取的数据写入 JSON 文件。&lt;br>
Writes the scraped data to a JSON file.&lt;/li>
&lt;li>&lt;code>ensure_ascii=False&lt;/code>: 保留非 ASCII 字符（例如中文或特殊符号）。&lt;br>
Preserves non-ASCII characters (e.g., Chinese or special symbols).&lt;/li>
&lt;li>&lt;code>indent=4&lt;/code>: 格式化 JSON 文件以便阅读。&lt;br>
Formats the JSON file for readability.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="第五步主函数和执行--step-5-main-function-and-execution">第五步：主函数和执行 / Step 5: Main Function and Execution
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;开始爬虫程序...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">papers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">crawl_arxiv_papers&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">papers&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">save_to_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">papers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">OUTPUT_FILE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;爬取完成，共获取 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">papers&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 篇论文信息&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;未获取到任何论文信息&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>main()&lt;/code>: 协调爬取和保存过程。&lt;br>
Orchestrates the crawling and saving process.&lt;/li>
&lt;li>&lt;code>if __name__ == &amp;quot;__main__&amp;quot;&lt;/code>: 确保脚本仅在直接运行时执行（而不是被导入时）。&lt;br>
Ensures the script runs only when executed directly (not when imported).&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="运行代码--running-the-code">运行代码 / Running the Code
&lt;/h2>&lt;ol>
&lt;li>将代码保存到文件（例如 &lt;code>arxiv_crawler.py&lt;/code>）。&lt;br>
Save the code in a file (e.g., &lt;code>arxiv_crawler.py&lt;/code>).&lt;/li>
&lt;li>在同一目录下打开终端。&lt;br>
Open a terminal in the same directory.&lt;/li>
&lt;li>运行脚本：&lt;br>
Run the script:
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">python arxiv_crawler.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>检查输出文件 &lt;code>arxiv_papers.json&lt;/code> 查看结果。&lt;br>
Check the output file &lt;code>arxiv_papers.json&lt;/code> for the results.&lt;/li>
&lt;/ol>
&lt;h3 id="示例输出--sample-output">示例输出 / Sample Output
&lt;/h3>&lt;p>&lt;code>arxiv_papers.json&lt;/code> 文件可能如下所示：&lt;br>
The &lt;code>arxiv_papers.json&lt;/code> file might look like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;arxiv_url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;/abs/2503.12345&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;arxiv_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;arXiv:2503.12345&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;A New AI Model&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;abstract&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;This paper introduces...&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;authors&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;John Doe&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Jane Smith&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;subjects&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Artificial Intelligence (cs.AI)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="自定义建议--tips-for-customization">自定义建议 / Tips for Customization
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>更改类别 / Change Category&lt;/strong>: 修改 &lt;code>START_URL&lt;/code> 来爬取其他 arXiv 类别（例如 &lt;code>https://arxiv.org/list/cs.LG/new&lt;/code> 用于机器学习）。&lt;br>
Modify &lt;code>START_URL&lt;/code> to scrape a different arXiv category (e.g., &lt;code>https://arxiv.org/list/cs.LG/new&lt;/code> for Machine Learning).&lt;/li>
&lt;li>&lt;strong>添加延迟 / Add Delays&lt;/strong>: 在循环中加入 &lt;code>time.sleep(2)&lt;/code> 以避免对服务器造成过大压力。&lt;br>
Use &lt;code>time.sleep(2)&lt;/code> in the loop to avoid overwhelming the server.&lt;/li>
&lt;li>&lt;strong>错误日志 / Error Logging&lt;/strong>: 使用日志记录代替 &lt;code>print&lt;/code> 语句，以便更好地调试。&lt;br>
Add logging instead of &lt;code>print&lt;/code> statements for better debugging.&lt;/li>
&lt;/ul>
&lt;hr></description></item><item><title>爬虫-实战-多页面递归爬取</title><link>https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%AE%9E%E6%88%98-%E5%A4%9A%E9%A1%B5%E9%9D%A2%E9%80%92%E5%BD%92%E7%88%AC%E5%8F%96/</link><pubDate>Thu, 20 Mar 2025 10:20:00 +0800</pubDate><guid>https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%AE%9E%E6%88%98-%E5%A4%9A%E9%A1%B5%E9%9D%A2%E9%80%92%E5%BD%92%E7%88%AC%E5%8F%96/</guid><description>&lt;img src="https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%AE%9E%E6%88%98-%E5%A4%9A%E9%A1%B5%E9%9D%A2%E9%80%92%E5%BD%92%E7%88%AC%E5%8F%96/images/index/index.png" alt="Featured image of post 爬虫-实战-多页面递归爬取" />&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">bs4&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">urllib.parse&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">urljoin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置爬虫参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">START_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://arxiv.org/list/cs.AI/new&amp;#34;&lt;/span> &lt;span class="c1"># 替换为你想爬取的起始URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">MAX_DEPTH&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="c1"># 最大爬取深度&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">OUTPUT_FILE&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;crawled_data.json&amp;#34;&lt;/span> &lt;span class="c1"># 输出文件名&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 用于存储已访问的URL，避免重复&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">visited_urls&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">set&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 用于存储爬取结果&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">crawled_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">depth&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 检查深度限制和是否已访问&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">depth&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">MAX_DEPTH&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="n">url&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">visited_urls&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;正在爬取: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> (深度: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">depth&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 发送HTTP请求&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36&amp;#34;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timeout&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">raise_for_status&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># 检查请求是否成功&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 标记为已访问&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">visited_urls&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 解析HTML内容&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">soup&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;html.parser&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 提取当前页面的标题作为主要内容（可以根据需要修改）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">page_title&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="s2">&amp;#34;无标题&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 提取页面中的内容&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">content&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 存储当前页面的URL和内容&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">crawled_data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">page_title&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;depth&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">depth&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">content&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 提取页面中的所有链接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">link&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;a&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">href&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">link&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;href&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">link_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">link&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="s2">&amp;#34;无文本&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 将相对URL转换为绝对URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">absolute_url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urljoin&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">href&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 简单过滤，只爬取http或https链接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">absolute_url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">startswith&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="s2">&amp;#34;http://&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;https://&amp;#34;&lt;/span>&lt;span class="p">)):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 递归爬取新链接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">absolute_url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">depth&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 避免过于频繁请求，礼貌爬取&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">RequestException&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;爬取 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">save_to_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">filename&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;w&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dump&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ensure_ascii&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">indent&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;数据已保存到 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;开始爬取...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">START_URL&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">save_to_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">crawled_data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">OUTPUT_FILE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;爬取完成，共爬取 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">crawled_data&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 个页面&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="1-代码概述">1. 代码概述
&lt;/h3>&lt;p>这个爬虫使用 &lt;code>requests&lt;/code> 获取网页内容，&lt;code>BeautifulSoup&lt;/code> 解析 HTML，然后递归爬取页面中的链接，最终将结果保存为 JSON 文件。主要功能包括：&lt;/p>
&lt;ul>
&lt;li>从指定起始 URL 开始爬取。&lt;/li>
&lt;li>限制爬取深度，避免无限递归。&lt;/li>
&lt;li>提取页面标题和文本内容。&lt;/li>
&lt;li>保存爬取结果到本地文件。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="2-导入库">2. 导入库
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">bs4&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">urllib.parse&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">urljoin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>requests&lt;/code>：用于发送 HTTP 请求获取网页内容。&lt;/li>
&lt;li>&lt;code>BeautifulSoup&lt;/code>（来自 &lt;code>bs4&lt;/code>）：解析 HTML 内容，提取所需数据。&lt;/li>
&lt;li>&lt;code>json&lt;/code>：将爬取结果保存为 JSON 格式。&lt;/li>
&lt;li>&lt;code>urljoin&lt;/code>（来自 &lt;code>urllib.parse&lt;/code>）：将相对 URL 转换为绝对 URL。&lt;/li>
&lt;li>&lt;code>time&lt;/code>：用于添加延迟，避免过于频繁请求服务器。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="3-配置爬虫参数">3. 配置爬虫参数
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">START_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://arxiv.org/list/cs.AI/new&amp;#34;&lt;/span> &lt;span class="c1"># 替换为你想爬取的起始URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">MAX_DEPTH&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="c1"># 最大爬取深度&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">OUTPUT_FILE&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;crawled_data.json&amp;#34;&lt;/span> &lt;span class="c1"># 输出文件名&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>START_URL&lt;/code>：爬虫的起始页面，这里是 arXiv 的 AI 分类新论文页面。&lt;/li>
&lt;li>&lt;code>MAX_DEPTH&lt;/code>：限制递归爬取的深度，防止爬虫无限扩展（这里设为 1，只爬取起始页面和其直接链接）。&lt;/li>
&lt;li>&lt;code>OUTPUT_FILE&lt;/code>：结果保存的文件名。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="4-全局变量">4. 全局变量
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">visited_urls&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">set&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">crawled_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>visited_urls&lt;/code>：一个集合（&lt;code>set&lt;/code>），记录已访问的 URL，避免重复爬取。&lt;/li>
&lt;li>&lt;code>crawled_data&lt;/code>：一个列表，存储所有爬取到的页面数据。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="5-主爬取函数-crawl">5. 主爬取函数 &lt;code>crawl&lt;/code>
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">depth&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>url&lt;/code>：要爬取的网页地址。&lt;/li>
&lt;li>&lt;code>depth&lt;/code>：当前爬取的深度，默认从 0 开始。&lt;/li>
&lt;/ul>
&lt;h4 id="51-检查条件">5.1 检查条件
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="n">depth&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">MAX_DEPTH&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="n">url&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">visited_urls&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>如果当前深度超过 &lt;code>MAX_DEPTH&lt;/code> 或 URL 已访问过，则停止爬取并返回。&lt;/li>
&lt;/ul>
&lt;h4 id="52-发送请求">5.2 发送请求
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;正在爬取: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> (深度: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">depth&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36&amp;#34;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timeout&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">raise_for_status&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># 检查请求是否成功&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>打印当前爬取的 URL 和深度。&lt;/li>
&lt;li>使用 &lt;code>requests.get&lt;/code> 发送 HTTP GET 请求：
&lt;ul>
&lt;li>&lt;code>headers&lt;/code>：伪装成浏览器，避免被服务器拒绝。&lt;/li>
&lt;li>&lt;code>timeout=20&lt;/code>：设置 20 秒超时，防止请求挂起。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>raise_for_status()&lt;/code>：如果请求失败（比如 404 或 500），抛出异常。&lt;/li>
&lt;/ul>
&lt;h4 id="53-标记已访问">5.3 标记已访问
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">visited_urls&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>将当前 URL 添加到 &lt;code>visited_urls&lt;/code> 集合，避免重复爬取。&lt;/li>
&lt;/ul>
&lt;h4 id="54-解析-html">5.4 解析 HTML
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">soup&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;html.parser&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>使用 &lt;code>BeautifulSoup&lt;/code> 将网页的 HTML 内容解析为可操作的对象。&lt;/li>
&lt;/ul>
&lt;h4 id="55-提取标题和内容">5.5 提取标题和内容
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">page_title&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="s2">&amp;#34;无标题&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">content&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_text&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>page_title&lt;/code>：提取页面的 &lt;code>&amp;lt;title&amp;gt;&lt;/code> 标签内容，如果没有则设为“无标题”。&lt;/li>
&lt;li>&lt;code>content&lt;/code>：提取页面所有文本内容（去掉 HTML 标签）。&lt;/li>
&lt;/ul>
&lt;h4 id="56-保存数据">5.6 保存数据
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">crawled_data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">page_title&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;depth&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">depth&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">content&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>将当前页面的信息（URL、标题、深度、内容）存入 &lt;code>crawled_data&lt;/code> 列表。&lt;/li>
&lt;/ul>
&lt;h4 id="57-提取并递归爬取链接">5.7 提取并递归爬取链接
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">link&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;a&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">href&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">link&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;href&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">link_text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">link&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="s2">&amp;#34;无文本&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">absolute_url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urljoin&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">href&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">absolute_url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">startswith&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="s2">&amp;#34;http://&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;https://&amp;#34;&lt;/span>&lt;span class="p">)):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">absolute_url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">depth&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>soup.find_all(&amp;quot;a&amp;quot;, href=True)&lt;/code>：查找页面中所有带 &lt;code>href&lt;/code> 属性的 &lt;code>&amp;lt;a&amp;gt;&lt;/code> 标签（超链接）。&lt;/li>
&lt;li>&lt;code>href&lt;/code>：获取链接地址。&lt;/li>
&lt;li>&lt;code>link_text&lt;/code>：获取链接的文本内容，若为空则设为“无文本”。&lt;/li>
&lt;li>&lt;code>urljoin(url, href)&lt;/code>：将相对链接（如 &lt;code>/about&lt;/code>）转换为绝对链接（如 &lt;code>https://arxiv.org/about&lt;/code>）。&lt;/li>
&lt;li>如果链接以 &lt;code>http://&lt;/code> 或 &lt;code>https://&lt;/code> 开头，则递归调用 &lt;code>crawl&lt;/code>，深度加 1。&lt;/li>
&lt;/ul>
&lt;h4 id="58-延迟">5.8 延迟
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>每次请求后暂停 1 秒，避免对服务器造成过大压力（礼貌爬取）。&lt;/li>
&lt;/ul>
&lt;h4 id="59-错误处理">5.9 错误处理
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">except&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">RequestException&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;爬取 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>如果请求失败（如超时或 404），打印错误信息。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="6-保存数据函数-save_to_file">6. 保存数据函数 &lt;code>save_to_file&lt;/code>
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">save_to_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">filename&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;w&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dump&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ensure_ascii&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">indent&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;数据已保存到 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>json.dump&lt;/code>：将数据以 JSON 格式写入文件。&lt;/li>
&lt;li>&lt;code>ensure_ascii=False&lt;/code>：支持非 ASCII 字符（如中文）。&lt;/li>
&lt;li>&lt;code>indent=4&lt;/code>：格式化 JSON，使其更易读。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="7-主函数-main">7. 主函数 &lt;code>main&lt;/code>
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;开始爬取...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">START_URL&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">save_to_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">crawled_data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">OUTPUT_FILE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;爬取完成，共爬取 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">crawled_data&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 个页面&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>调用 &lt;code>crawl&lt;/code> 开始爬取。&lt;/li>
&lt;li>保存结果到文件。&lt;/li>
&lt;li>打印爬取的总页面数。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="8-运行代码">8. 运行代码
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>确保代码只在直接运行脚本时执行（而不是被导入时）。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="9-运行示例">9. 运行示例
&lt;/h3>&lt;ol>
&lt;li>安装依赖：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install requests beautifulsoup4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>运行代码：
&lt;ul>
&lt;li>爬虫从 &lt;code>https://arxiv.org/list/cs.AI/new&lt;/code> 开始。&lt;/li>
&lt;li>爬取该页面及其直接链接（深度 ≤ 1）。&lt;/li>
&lt;li>结果保存到 &lt;code>crawled_data.json&lt;/code>。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>输出文件示例：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;https://arxiv.org/list/cs.AI/new&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;New submissions for cs.AI&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;depth&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;...页面文本内容...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;https://arxiv.org/abs/1234.56789&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Paper Title&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;depth&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;...论文摘要等内容...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="10-注意事项">10. 注意事项
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>礼貌爬取&lt;/strong>：&lt;code>time.sleep(1)&lt;/code> 避免过于频繁请求，但可以根据网站政策调整。&lt;/li>
&lt;li>&lt;strong>robots.txt&lt;/strong>：检查目标网站的 &lt;code>robots.txt&lt;/code>（如 &lt;code>https://arxiv.org/robots.txt&lt;/code>），确保遵守规则。&lt;/li>
&lt;li>&lt;strong>异常处理&lt;/strong>：当前只处理了请求相关的异常，可根据需要扩展。&lt;/li>
&lt;li>&lt;strong>内容提取&lt;/strong>：当前提取所有文本（&lt;code>get_text()&lt;/code>），可改为提取特定元素（如论文标题、摘要）。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="11-改进建议">11. 改进建议
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>过滤链接&lt;/strong>：添加域名限制（如只爬 &lt;code>arxiv.org&lt;/code> 的链接）。&lt;/li>
&lt;li>&lt;strong>多线程&lt;/strong>：使用 &lt;code>threading&lt;/code> 或 &lt;code>asyncio&lt;/code> 加速爬取。&lt;/li>
&lt;li>&lt;strong>数据清洗&lt;/strong>：去掉无关内容（如页脚、导航栏）。&lt;/li>
&lt;li>&lt;strong>代理支持&lt;/strong>：添加代理池以应对封禁。&lt;/li>
&lt;/ul></description></item><item><title>一个自动签到的py并且使用github action每日执行</title><link>https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/</link><pubDate>Mon, 03 Mar 2025 14:40:00 +0800</pubDate><guid>https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/</guid><description>&lt;img src="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index.png" alt="Featured image of post 一个自动签到的py并且使用github action每日执行" />&lt;p>&lt;img src="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index.png"
width="693"
height="330"
srcset="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index_hu15539244554986542668.png 480w, https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index_hu15411632889193254903.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="210"
data-flex-basis="504px"
>
效果就是每天8点去自动签到
&lt;img src="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index.jpg"
width="1912"
height="954"
srcset="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index_hu1908156822460302415.jpg 480w, https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index_hu14125157359231674070.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="200"
data-flex-basis="481px"
>&lt;/p>
&lt;h2 id="使用cookie进行自动登录简单但是很容易因为cookie过期而需要重新获取cookie更新">使用Cookie进行自动登录（简单，但是很容易因为Cookie过期而需要重新获取Cookie更新）
&lt;/h2>&lt;h3 id="cookie的获取">Cookie的获取
&lt;/h3>&lt;p>参考：
&lt;a class="link" href="https://www.diuber.com/cookie/" target="_blank" rel="noopener"
>https://www.diuber.com/cookie/&lt;/a>&lt;/p>
&lt;p>首先需要获取Cookie，这个Cookie是登录之后的Cookie，登录之后的Cookie是在浏览器的开发者工具中获取的，具体方法如下：&lt;/p>
&lt;ol>
&lt;li>打开浏览器，登录mx的账号&lt;/li>
&lt;li>打开浏览器的开发者工具，在Network中找到请求的接口，点击请求的接口，在Headers中找到Cookie，复制Cookie&lt;/li>
&lt;/ol>
&lt;h3 id="签到的代码">签到的代码
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># mx_checkin.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">schedule&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">datetime&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">datetime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Cookie&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">environ&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;MX_COOKIE&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 把Cookie放置在action的环境变量中,例如这里是MX_COOKIE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 签到函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">checkin&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 替换为实际的签到接口 URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">XXXXX&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 准备请求头（可能需要 Cookie 或 Token 来验证身份）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Content-Type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;application/json&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果需要登录凭证，可以在这里添加 Cookie 或 Authorization&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Cookie&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Cookie&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># &amp;#34;Authorization&amp;#34;: &amp;#34;Bearer your_token_here&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 准备请求数据（根据实际接口要求调整）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;userId&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;your-user-id&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 替换为你的用户 ID&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;timestamp&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="c1"># 可选：发送当前时间戳&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 发送签到请求&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response_json&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 检查签到是否成功&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">200&lt;/span> &lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 签到成功：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">response_json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;msg&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 签到失败：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">response_json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;msg&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 签到请求失败：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 脚本主循环&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;自动签到脚本已启动...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 首次运行时立即签到（可选）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">checkin&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>代码写好之后可以先在本地测试，保证测试ok&lt;/p>
&lt;h3 id="github-action的工作流配置">github action的工作流配置
&lt;/h3>&lt;p>关于github action的内容，可以查看我的文章 &lt;a class="link" href="../2-github-action-%e4%bd%bf%e7%94%a8/" >&lt;code>github action使用&lt;/code>&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"># mx_checkin.yml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">name: mx_checkin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">on:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> schedule:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> # 此处是UTC时间，对应北京时间早八点
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - cron : &amp;#39;00 00 * * *&amp;#39;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> workflow_dispatch:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">permissions:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> contents: read
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">jobs:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> build:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> runs-on: ubuntu-latest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> steps:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - uses: actions/checkout@v3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - name: Set up Python 3.12
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> uses: actions/setup-python@v3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> with:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> python-version: &amp;#34;3.12&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - name: Install dependencies
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> run: |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> python -m pip install --upgrade pip
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - name: Run checkin script
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> run: |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> python mx_checkin.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> env:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> MX_COOKIE: ${{ secrets.MX_COOKIE }}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="requirementstxt">requirements.txt
&lt;/h3>&lt;p>把需要的库写在这个文件中&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">requests
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">schedule
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">datetime
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="设置仓库密钥">设置仓库密钥
&lt;/h3>&lt;p>&lt;img src="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index-1.jpg"
width="1912"
height="954"
srcset="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index-1_hu9441030720341923765.jpg 480w, https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/image/index/index-1_hu11884023262165687544.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="200"
data-flex-basis="481px"
>&lt;/p>
&lt;p>把前面Cookie 填进去 &lt;strong>粘贴过来的时候可以把引号去掉，我记得是不用加引号的，如果发现自己电脑上面测试可以，Action不行的话可以再试试加引号&lt;/strong>&lt;/p>
&lt;hr>
&lt;p>上面的方法很受限于网站对于cookie的验证，如果网站对cookie验证过于严格，可以尝试下面的方法。&lt;/p>
&lt;h2 id="使用账号密码进行自动登录复杂但是可以避免cookie过期的问题">使用账号密码进行自动登录（复杂，但是可以避免Cookie过期的问题）
&lt;/h2>&lt;p>这里我只是给了一个简单的配置，很多网站登录的时候可能会多重验证，那就麻烦了&amp;hellip;.&lt;/p>
&lt;h3 id="找到登录的接口">找到登录的接口
&lt;/h3>&lt;p>当然每个网站不一样，不能一概而论&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/images/index/index.png"
width="704"
height="810"
srcset="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/images/index/index_hu12811556378852032637.png 480w, https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/images/index/index_hu9188159357978234831.png 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="86"
data-flex-basis="208px"
>&lt;/p>
&lt;h3 id="代码">代码
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># checkin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">schedule&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">datetime&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">datetime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">dotenv&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">load_dotenv&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">load_dotenv&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">refresh_cookie&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;刷新 Cookie 的逻辑（需要根据实际网站实现）&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">global&lt;/span> &lt;span class="n">Cookie&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 替换为实际的登录 URL 和登录数据&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">login_url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://mxwljsq.top/auth/login&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">login_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;email&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">environ&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;MX_EMAIL&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="c1"># 从环境变量获取邮箱&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;passwd&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">environ&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;MX_PASSWORD&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="c1"># 从环境变量获取密码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">login_data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Content-Type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;application/x-www-form-urlencoded&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># exit()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 发送登录请求&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">login_url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">login_data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">200&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 假设登录成功后 Cookie 在响应头中返回&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_cookie&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cookies&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_dict&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Cookie&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;; &amp;#34;&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">v&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">v&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">new_cookie&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">items&lt;/span>&lt;span class="p">()])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> Cookie 刷新成功&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> Cookie 刷新失败：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> Cookie 刷新异常：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">checkin&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">refresh_cookie&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">global&lt;/span> &lt;span class="n">Cookie&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">Cookie&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Cookie 为空，请先刷新 Cookie&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://mxwljsq.top/user/checkin&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Content-Type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;application/json&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Cookie&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Cookie&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response_json&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">200&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 签到成功：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">response_json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;msg&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 签到失败：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">response_json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;msg&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果是登录失效，尝试刷新 Cookie&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 签到请求失败：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;自动签到脚本已启动...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 加载本地 Cookie，如果没有则使用环境变量中的&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 首次运行立即签到&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> 开始执行签到任务...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">checkin&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># mx_checkin.yml&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mx_checkin&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">schedule&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># 此处是UTC时间，对应北京时间早八点&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">cron &lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;00 00 * * *&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">workflow_dispatch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">permissions&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">contents&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">read&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/checkout@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Set up Python 3.12&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/setup-python@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">python-version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;3.12&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Install dependencies&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> python -m pip install --upgrade pip
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> if [ -f requirements.txt ]; then pip install -r requirements.txt; fi&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Run checkin script&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> python mx_checkin.py&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">MX_EMAIL&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.MX_EMAIL }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">MX_PASSWORD&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.MX_PASSWORD }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="设置仓库密钥-1">设置仓库密钥
&lt;/h3>&lt;p>&lt;img src="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/images/index/index-1.png"
width="1240"
height="768"
srcset="https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/images/index/index-1_hu16635990176998570639.png 480w, https://www.zata.cc/p/%E4%B8%80%E4%B8%AA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E7%9A%84py%E5%B9%B6%E4%B8%94%E4%BD%BF%E7%94%A8github-action%E6%AF%8F%E6%97%A5%E6%89%A7%E8%A1%8C/images/index/index-1_hu7013032388954241486.png 1024w"
loading="lazy"
alt="设置仓库密钥"
class="gallery-image"
data-flex-grow="161"
data-flex-basis="387px"
>&lt;/p>
&lt;p>这里是肯定不需要加引号的，因为邮箱和密码都是字符串，加引号的话会被认为是字符串。（我试过了）&lt;/p></description></item><item><title>爬虫-基础介绍</title><link>https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%9F%BA%E7%A1%80%E4%BB%8B%E7%BB%8D/</link><pubDate>Mon, 03 Mar 2025 00:00:00 +0800</pubDate><guid>https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%9F%BA%E7%A1%80%E4%BB%8B%E7%BB%8D/</guid><description>&lt;img src="https://www.zata.cc/p/%E7%88%AC%E8%99%AB-%E5%9F%BA%E7%A1%80%E4%BB%8B%E7%BB%8D/images/index/index.png" alt="Featured image of post 爬虫-基础介绍" />&lt;h2 id="介绍">介绍
&lt;/h2>&lt;h3 id="以下是一些常见的-http-状态码因为它们在网络开发和日常使用中很常见">以下是一些常见的 HTTP 状态码（因为它们在网络开发和日常使用中很常见）：
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>200 OK&lt;/strong>：请求成功，一切正常。&lt;/li>
&lt;li>&lt;strong>400 Bad Request&lt;/strong>：请求有问题，比如参数错误。&lt;/li>
&lt;li>&lt;strong>401 Unauthorized&lt;/strong>：未授权，需要登录或提供凭证。&lt;/li>
&lt;li>&lt;strong>403 Forbidden&lt;/strong>：服务器拒绝访问，权限不足。&lt;/li>
&lt;li>&lt;strong>404 Not Found&lt;/strong>：资源不存在，可能是URL错了。&lt;/li>
&lt;li>&lt;strong>500 Internal Server Error&lt;/strong>：服务器内部出错，程序或配置有问题。&lt;/li>
&lt;li>&lt;strong>503 Service Unavailable&lt;/strong>：服务暂时不可用，通常是服务器维护或过载。&lt;/li>
&lt;/ul>
&lt;h3 id="关键要点">关键要点
&lt;/h3>&lt;ul>
&lt;li>网络爬虫是一种自动浏览网页的程序，主要用于搜索引擎索引，但也用于数据挖掘和网页归档。&lt;/li>
&lt;li>它从初始URL开始，下载页面，提取链接，递归访问，形成索引。&lt;/li>
&lt;li>挑战包括资源消耗、重复内容和动态内容（如JavaScript页面）。&lt;/li>
&lt;li>需遵循选择、重访、礼貌和并行化政策，确保高效和合规。&lt;/li>
&lt;li>存在通用、聚焦和深网三种类型，法律和伦理问题需注意，如尊重robots.txt和数据隐私。&lt;/li>
&lt;/ul>
&lt;h3 id="定义与目的">定义与目的
&lt;/h3>&lt;p>网络爬虫，也称为蜘蛛或机器人，是一种系统地浏览万维网以进行网页索引的程序。&lt;br>
它的主要目的是为搜索引擎更新内容或索引，帮助用户更高效地搜索。意外的是，它还用于网页归档、验证超链接和数据挖掘。&lt;/p>
&lt;h3 id="工作原理">工作原理
&lt;/h3>&lt;p>爬虫从一组已知的URL（种子）开始，下载页面，提取其中的超链接，然后递归访问这些链接，依政策继续扩展。这种过程类似探索迷宫，但需管理大量数据。&lt;/p>
&lt;h3 id="示例python代码">示例Python代码
&lt;/h3>&lt;p>以下是一个简单的Python网络爬虫示例，使用&lt;code>requests&lt;/code>和&lt;code>BeautifulSoup&lt;/code>库，从给定URL开始，爬取页面上的所有链接并打印：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">bs4&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">urllib.parse&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">urljoin&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">urlparse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 发送GET请求到URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 检查请求是否成功&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">200&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;无法检索 &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 解析HTML内容&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">soup&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">BeautifulSoup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;html.parser&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 查找页面上的所有链接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">link&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">soup&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">find_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 获取href属性&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">href&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">link&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;href&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果href为空，跳过此链接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">href&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 将相对URL转换为绝对URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">absolute_url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urljoin&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">href&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 打印绝对URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">absolute_url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 在实际应用中，可以将此URL添加到队列中以供后续爬取&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 这里仅打印以简化&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 示例用法&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">start_url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;https://www.example.com&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">crawl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start_url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>此代码提供了一个基本框架，实际应用中需处理重复URL、遵守robots.txt等。&lt;/p>
&lt;hr>
&lt;h3 id="详细报告">详细报告
&lt;/h3>&lt;p>网络爬虫是互联网技术的重要组成部分，广泛用于搜索引擎优化（SEO）、数据收集和网站监控。本报告将详细探讨其定义、工作原理、类型、挑战及相关政策，力求全面覆盖用户可能关心的所有方面，并附上Python代码示例。&lt;/p>
&lt;h4 id="定义与基本概念">定义与基本概念
&lt;/h4>&lt;p>根据&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>的定义，网络爬虫（也称为蜘蛛、蜘蛛机器人、蚂蚁、自动索引器或Web scutter）是一种系统地浏览万维网以进行网页索引（web spidering）的互联网机器人。&lt;br>
它的核心功能是复制网页内容，供搜索引擎索引，从而提升搜索效率。研究表明，爬虫不仅是搜索引擎的工具，还用于网页归档、验证超链接和HTML代码，以及数据驱动的编程。&lt;/p>
&lt;h4 id="工作原理与过程">工作原理与过程
&lt;/h4>&lt;p>爬虫的工作流程通常从一组初始URL（称为种子）开始。它会：&lt;/p>
&lt;ul>
&lt;li>下载这些网页，提取其中的超链接。&lt;/li>
&lt;li>将新发现的链接添加到爬取前沿（crawl frontier），然后递归访问。&lt;/li>
&lt;li>根据预设政策（如选择政策、礼貌政策）决定下载哪些页面及访问频率。&lt;/li>
&lt;/ul>
&lt;p>例如，&lt;a class="link" href="https://www.cloudflare.com/learning/bots/what-is-a-web-crawler/" target="_blank" rel="noopener"
>Cloudflare的解释&lt;/a>指出，爬虫通过跟随链接“爬行”，类似于人类在网上点击导航，但自动化且规模庞大。&lt;br>
归档方面，爬虫会保存网页快照，存储在类似数据库的仓库中，但功能较数据库简单，通常以HTML文件形式保存。&lt;/p>
&lt;h4 id="覆盖范围与局限">覆盖范围与局限
&lt;/h4>&lt;p>互联网的页面数量极其庞大，研究显示（2009年数据），即使是最大的爬虫也只能索引40-70%的可索引网页，而1999年的研究显示仅16%&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;br>
这一局限源于网页数量的爆炸性增长和高变化率，爬虫只能优先处理部分页面。&lt;/p>
&lt;h4 id="挑战与问题">挑战与问题
&lt;/h4>&lt;p>爬取过程中面临多重挑战：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>资源消耗&lt;/strong>：爬虫访问系统时会消耗网络和服务器资源，常未经提示访问，引发负载和礼貌性问题。&lt;/li>
&lt;li>&lt;strong>重复内容&lt;/strong>：由于HTTP GET参数的无限组合（如在线相册可能有48种不同URL，涉及排序、缩略图大小、格式和用户内容选项），难以避免重复下载&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;li>&lt;strong>动态内容&lt;/strong>：AJAX页面等动态内容对爬虫构成挑战，Google提出可识别的AJAX调用格式以解决&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;/ul>
&lt;h4 id="爬取政策">爬取政策
&lt;/h4>&lt;p>爬取政策是爬虫高效运行的关键，分为以下几类：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>选择政策&lt;/strong>：决定下载哪些页面，常用指标包括广度优先、反向链接计数和部分PageRank。研究（如Cho等，180,000页从stanford.edu爬取）显示，部分PageRank更适合早期捕获高PageRank页面，随后是广度优先和反向链接计数&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;li>&lt;strong>重访政策&lt;/strong>：目标是最大化新鲜度（本地副本是否准确）或最小化年龄（本地副本多旧）。Cho和Garcia-Molina的研究表明，统一政策（所有页面同频率）优于按变化率比例分配的策略&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;li>&lt;strong>礼貌政策&lt;/strong>：避免超载服务器，成本包括网络资源、服务器超载和由编写不佳的爬虫导致的崩溃。标准做法是使用robots.txt文件，建议访问间隔从60秒到3-4分钟不等，具体如Cho使用10秒，WIRE爬虫15秒，Mercator用10t秒（t为下载时间），Dill等用1秒&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;li>&lt;strong>并行化政策&lt;/strong>：运行多个进程以最大化下载率，减少开销，避免重复下载，需政策分配新发现的URL。&lt;/li>
&lt;/ul>
&lt;p>以下是各类政策的对比：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;strong>政策类型&lt;/strong>&lt;/th>
&lt;th>&lt;strong>描述&lt;/strong>&lt;/th>
&lt;th>&lt;strong>示例/注意事项&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>选择政策&lt;/td>
&lt;td>决定优先爬取哪些页面&lt;/td>
&lt;td>广度优先、PageRank优先&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>重访政策&lt;/td>
&lt;td>确定页面重访频率以保持数据新鲜&lt;/td>
&lt;td>统一频率或按变化率调整&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>礼貌政策&lt;/td>
&lt;td>避免超载服务器，遵守robots.txt&lt;/td>
&lt;td>建议请求间隔1秒以上&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>并行化政策&lt;/td>
&lt;td>使用多进程提升效率，管理资源分配&lt;/td>
&lt;td>避免重复下载，优化爬取速度&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="类型的网络爬虫">类型的网络爬虫
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>通用爬虫&lt;/strong>：如Google和Bing的爬虫，目标是索引整个互联网。&lt;/li>
&lt;li>&lt;strong>聚焦爬虫&lt;/strong>：尝试下载相关页面，依赖通用搜索引擎作为起点。例如，学术爬虫如citeseerxbot（用于CiteSeer X）关注PDF、PostScript和Word文件，还有Google Scholar和Microsoft Academic Search&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;li>&lt;strong>语义聚焦爬虫&lt;/strong>：使用领域本体进行更精准的爬取。&lt;/li>
&lt;/ul>
&lt;p>以下是各类爬虫的对比：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;strong>类型&lt;/strong>&lt;/th>
&lt;th>&lt;strong>特点&lt;/strong>&lt;/th>
&lt;th>&lt;strong>示例&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>通用爬虫&lt;/td>
&lt;td>索引整个互联网，覆盖广&lt;/td>
&lt;td>Googlebot, Bingbot&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>聚焦爬虫&lt;/td>
&lt;td>针对特定主题或文件类型，效率高&lt;/td>
&lt;td>citeseerxbot, Google Scholar bot&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>语义聚焦爬虫&lt;/td>
&lt;td>使用本体，适合复杂领域&lt;/td>
&lt;td>学术研究领域爬虫&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>企业爬虫&lt;/td>
&lt;td>索引企业网站，供内部搜索使用&lt;/td>
&lt;td>内部网站搜索引擎&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="安全与伦理问题">安全与伦理问题
&lt;/h4>&lt;p>爬虫可能无意中索引非公共资源或暴露软件漏洞版本，缓解方法包括通过robots.txt限制搜索引擎仅索引公共部分，屏蔽交易部分&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;br>
此外，爬虫通过HTTP请求的User-agent字段标识，管理员可通过日志和工具追踪，偏好标识以便在陷入爬虫陷阱或超载服务器时联系。垃圾邮件机器人可能掩盖身份，增加识别难度。&lt;/p>
&lt;p>法律和伦理考虑包括：&lt;/p>
&lt;ul>
&lt;li>尊重网站的服务条款和robots.txt文件。&lt;/li>
&lt;li>避免以过多请求超载服务器（礼貌政策）。&lt;/li>
&lt;li>负责处理个人数据，遵守隐私法。&lt;/li>
&lt;li>透明地披露数据收集做法，尤其是涉及个人信息时。&lt;/li>
&lt;/ul>
&lt;h4 id="深网爬取">深网爬取
&lt;/h4>&lt;p>深网（deep web）或不可见网包含大量仅通过数据库查询可访问的页面，常规爬虫需链接才能访问。策略包括：&lt;/p>
&lt;ul>
&lt;li>Google的Sitemaps协议和mod oai。&lt;/li>
&lt;li>屏幕抓取（screen scraping）用于跨表单聚合数据。&lt;/li>
&lt;li>AJAX页面问题，Google提出可识别的AJAX调用格式&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/li>
&lt;/ul>
&lt;h4 id="可视化与编程化">可视化与编程化
&lt;/h4>&lt;p>可视化爬虫/抓取工具降低了编程技能需求，通过高亮数据教学用户使用。例如，Needlebase（被Google作为ITA Labs的一部分收购，&lt;a class="link" href="http://www.needlebase.com" target="_blank" rel="noopener"
>Needlebase&lt;/a>）是典型代表，简化了数据提取过程&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia&lt;/a>。&lt;/p>
&lt;h4 id="总结">总结
&lt;/h4>&lt;p>网络爬虫是互联网信息获取的核心工具，其效率和伦理问题持续受到关注。未来，随着动态内容和深网的增长，爬虫技术需进一步创新，以平衡覆盖率和资源消耗。&lt;/p>
&lt;h3 id="关键引文">关键引文
&lt;/h3>&lt;ul>
&lt;li>&lt;a class="link" href="https://en.wikipedia.org/wiki/Web_crawler" target="_blank" rel="noopener"
>Web Crawler - Wikipedia详细解释网络爬虫定义和工作原理&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.cloudflare.com/learning/bots/what-is-a-web-crawler/" target="_blank" rel="noopener"
>Cloudflare关于网络爬虫的工作原理和用途&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.techtarget.com/whatis/definition/crawler" target="_blank" rel="noopener"
>What is a Web Crawler? Everything you need to know from TechTarget.com&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.elastic.co/what-is/web-crawler" target="_blank" rel="noopener"
>What is a Web Crawler? | A Comprehensive Web Crawling Guide | Elastic&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://crawlbase.com/blog/what-is-a-web-crawler-use-cases-and-examples/" target="_blank" rel="noopener"
>What Is A Web Crawler? Use Cases And Examples Explained | Crawlbase&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.akamai.com/glossary/what-is-a-web-crawler" target="_blank" rel="noopener"
>What Is a Web Crawler? | How Do Crawlers Work? | Akamai&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://litslink.com/blog/what-is-a-web-crawler-and-how-does-it-work" target="_blank" rel="noopener"
>What Is a Web Crawler and How Does It Work | LITSLINK Blog&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://research.aimultiple.com/web-crawler/" target="_blank" rel="noopener"
>Web Crawler: What It Is, How It Works &amp;amp; Applications in 2025&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.sciencedirect.com/topics/computer-science/web-crawler" target="_blank" rel="noopener"
>web crawler - an overview | ScienceDirect Topics&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://dev.to/uiii/web-scraping-with-nodejs-and-typescript-the-crawler-part-23-2of2" target="_blank" rel="noopener"
>Web scraping with Node.js and Typescript - the crawler part (2/3) | DEV Community&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>