<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>楓念的博客</title><description>记录代码、技术与二次元生活</description><link>https://fengmic.pages.dev/</link><language>zh-CN</language><atom:link href="https://fengmic.pages.dev/rss.xml" rel="self" type="application/rss+xml"/><item><title>DeepSeek V4 新模型该如何使用：以 Claude Code 工程流为例</title><link>https://fengmic.pages.dev/post/deepseek-v4%E6%96%B0%E6%A8%A1%E5%9E%8B%E8%AF%A5%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E4%BB%A5claude-code%E5%B7%A5%E7%A8%8B%E6%B5%81%E4%B8%BA%E4%BE%8B/</link><guid isPermaLink="true">https://fengmic.pages.dev/post/deepseek-v4%E6%96%B0%E6%A8%A1%E5%9E%8B%E8%AF%A5%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E4%BB%A5claude-code%E5%B7%A5%E7%A8%8B%E6%B5%81%E4%B8%BA%E4%BE%8B/</guid><description>从模型选型、成本与延迟控制、提示词设计、评测闭环到上线治理，系统讲清楚如何把 DeepSeek V4 真正用进开发工作流，并给出以 Claude Code 为核心的人机协作范式。</description><pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;这篇文章不是“参数抄作业”，而是“把模型用出业务价值”的一套可执行方法。你会看到：模型怎么选、调用怎么写、流程怎么落地、质量怎么控、团队怎么协作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;一先把问题问对你到底在用模型做什么&quot;&gt;一、先把问题问对：你到底在“用模型做什么”？&lt;/h2&gt;
&lt;p&gt;很多人一上来就比较“哪个模型更强”，然后把整个系统做成“单轮对话 + 大段提示词 + 盲目上线”。结果通常是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;成本飙升。&lt;/li&gt;
&lt;li&gt;延迟不可控。&lt;/li&gt;
&lt;li&gt;正确率不稳定。&lt;/li&gt;
&lt;li&gt;线上不可解释。&lt;/li&gt;
&lt;li&gt;团队无法复现。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;真正应该先回答的是：&lt;strong&gt;你的场景是“快响应优先”，还是“推理质量优先”？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;结合 DeepSeek 官方 API 文档（2026-04 读取）可以看到，当前主力模型是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;deepseek-v4-flash&lt;/code&gt;：更偏吞吐与成本效率。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deepseek-v4-pro&lt;/code&gt;：更偏复杂任务质量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;并且官方明确提到：&lt;code&gt;deepseek-chat&lt;/code&gt; 与 &lt;code&gt;deepseek-reasoner&lt;/code&gt; 将在未来进入兼容迁移路径（文档显示已给出弃用时间窗口），本质上分别对应 V4 Flash 的非思考模式与思考模式。&lt;strong&gt;这条信息非常关键&lt;/strong&gt;，因为它直接影响你的 SDK 封装、路由规则和历史兼容策略。&lt;/p&gt;
&lt;h2 id=&quot;二以-claude-code-为例正确理解工具层和模型层&quot;&gt;二、以 Claude Code 为例：正确理解“工具层”和“模型层”&lt;/h2&gt;
&lt;p&gt;先澄清一个常见误区：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Claude Code 是一个&lt;strong&gt;工程代理工作台&lt;/strong&gt;（会读代码、改文件、跑命令、协助评审）。&lt;/li&gt;
&lt;li&gt;DeepSeek V4 是你应用里的&lt;strong&gt;推理模型服务&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两者不是二选一关系，而是分层关系：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你可以用 Claude Code 帮你构建、重构、测试“调用 DeepSeek V4 的业务系统”。&lt;/li&gt;
&lt;li&gt;你也可以让 Claude Code 帮你做压测脚本、评测集、回归测试、告警策略。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一句话：&lt;strong&gt;Claude Code 负责“把工程做对”，DeepSeek V4 负责“把推理做好”。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;三从-0-到-1一套可落地的-deepseek-v4-接入骨架&quot;&gt;三、从 0 到 1：一套可落地的 DeepSeek V4 接入骨架&lt;/h2&gt;
&lt;p&gt;根据 DeepSeek API 文档，OpenAI 兼容格式的基础调用要点是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Base URL: &lt;code&gt;https://api.deepseek.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;典型模型名：&lt;code&gt;deepseek-v4-flash&lt;/code&gt; / &lt;code&gt;deepseek-v4-pro&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;可启用 thinking 模式，并可设置 &lt;code&gt;reasoning_effort&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;1最小可运行调用python&quot;&gt;1）最小可运行调用（Python）&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; openai &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; OpenAI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;client &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; OpenAI(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E36209&quot;&gt;    api_key&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;YOUR_DEEPSEEK_API_KEY&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E36209&quot;&gt;    base_url&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;https://api.deepseek.com&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;resp &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; client.chat.completions.create(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E36209&quot;&gt;    model&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;deepseek-v4-pro&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E36209&quot;&gt;    messages&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        {&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;system&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;你是资深后端工程师，回答需给出可执行步骤。&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        {&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;请帮我设计一个高并发下的限流方案。&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E36209&quot;&gt;    thinking&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E36209&quot;&gt;    reasoning_effort&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;high&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E36209&quot;&gt;    stream&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(resp.choices[&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;].message.content)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2路由策略建议&quot;&gt;2）路由策略建议&lt;/h3&gt;
&lt;p&gt;把任务分成三层：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;L1&lt;/code&gt;（轻问答/改写/分类）：默认走 &lt;code&gt;v4-flash&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;L2&lt;/code&gt;（中等推理/代码解释/文档生成）：先 flash，低置信度再升级 pro。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;L3&lt;/code&gt;（复杂规划/多约束决策/高风险输出）：直接 &lt;code&gt;v4-pro + thinking&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个策略比“全部 pro”更稳，通常能在质量和成本之间取得更高 ROI。&lt;/p&gt;
&lt;h2 id=&quot;四把-claude-code-放进来工程流程怎么设计&quot;&gt;四、把 Claude Code 放进来：工程流程怎么设计&lt;/h2&gt;
&lt;p&gt;Anthropic 的 Claude Code 文档（overview/quickstart/best-practices）反复强调一件事：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;给模型“可验证目标”，并把流程拆成 Explore -&gt; Plan -&gt; Implement -&gt; Verify。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这和你使用 DeepSeek V4 完全同构。建议你在团队里采用下面这套标准流程。&lt;/p&gt;
&lt;h3 id=&quot;phase-a探索explore&quot;&gt;Phase A：探索（Explore）&lt;/h3&gt;
&lt;p&gt;让 Claude Code 先读代码再提方案，不要直接改。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;claude&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 提示词示例&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;请先阅读&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; @src/llm&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; 和&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; @src/api，梳理当前模型调用链、重试策略、超时策略。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;只输出风险点和改造建议，不要改代码。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;phase-b规划plan&quot;&gt;Phase B：规划（Plan）&lt;/h3&gt;
&lt;p&gt;明确“哪些文件改、为什么改、怎么验证”。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;请基于当前项目输出 DeepSeek V4 迁移计划：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1) 兼容旧模型名&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2) 增加 flash/pro 路由&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3) 增加失败重试与熔断&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4) 增加评测脚本&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;并给出每一步的回滚方案。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;phase-c实现implement&quot;&gt;Phase C：实现（Implement）&lt;/h3&gt;
&lt;p&gt;要求 Claude Code 一次只做一类改动，避免大杂烩提交。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;按计划先实现第 1 和第 2 步。完成后仅运行相关单测，不跑全量回归。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;phase-d验证verify&quot;&gt;Phase D：验证（Verify）&lt;/h3&gt;
&lt;p&gt;Claude Code 官方最佳实践里最重要的一条是：&lt;strong&gt;必须给可验证标准&lt;/strong&gt;。例如：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;指定测试命令。&lt;/li&gt;
&lt;li&gt;指定通过阈值。&lt;/li&gt;
&lt;li&gt;指定失败处理。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;运行以下验证：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 单测：npm run test -- llm-router&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 评测：npm run eval:llm -- --suite routing_v4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 通过标准：准确率 &gt;= 85%，P95 延迟 &amp;#x3C;= 2.5s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;失败时输出根因分析和修复建议。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;五你最容易踩的-8-个坑含规避方案&quot;&gt;五、你最容易踩的 8 个坑（含规避方案）&lt;/h2&gt;
&lt;h3 id=&quot;坑-1把思考模式滥用到所有请求&quot;&gt;坑 1：把“思考模式”滥用到所有请求&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;现象：成本上涨、延迟升高。&lt;/li&gt;
&lt;li&gt;处理：只在高价值高复杂任务启用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;坑-2历史兼容没有做模型别名层&quot;&gt;坑 2：历史兼容没有做模型别名层&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;现象：旧调用方大量失败。&lt;/li&gt;
&lt;li&gt;处理：保留 alias 映射层，统一在网关转换。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;坑-3把推理链路当黑盒&quot;&gt;坑 3：把推理链路当黑盒&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;现象：线上出错无法复盘。&lt;/li&gt;
&lt;li&gt;处理：记录输入模板版本、路由决策、模型参数、输出摘要哈希。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;坑-4只看主观像不像对不做评测集&quot;&gt;坑 4：只看主观“像不像对”，不做评测集&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;现象：版本升级后质量回退没人发现。&lt;/li&gt;
&lt;li&gt;处理：建立固定 eval set（基础题、边界题、对抗题）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;坑-5没有输出结构约束&quot;&gt;坑 5：没有输出结构约束&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;现象：下游解析异常。&lt;/li&gt;
&lt;li&gt;处理：统一 JSON Schema 校验，失败自动重试或降级。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;坑-6忽略缓存命中收益&quot;&gt;坑 6：忽略缓存命中收益&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;现象：相同请求反复付费。&lt;/li&gt;
&lt;li&gt;处理：提示词模板分层，静态前缀缓存。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;坑-7错误地把-sdk-参数看成生效&quot;&gt;坑 7：错误地把 SDK 参数“看成生效”&lt;/h3&gt;
&lt;p&gt;DeepSeek 历史文档里对某些模型参数有“兼容但不生效”的说明（例如旧推理模型对部分采样参数）。&lt;strong&gt;生产系统必须显式记录每个参数是否真的生效&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&quot;坑-8团队只学提示词不学任务拆解&quot;&gt;坑 8：团队只学“提示词”，不学“任务拆解”&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;现象：提示词越写越长，效果越来越飘。&lt;/li&gt;
&lt;li&gt;处理：先拆任务、再定约束、后写提示。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;六成本延迟质量三角平衡怎么做&quot;&gt;六、成本、延迟、质量：三角平衡怎么做&lt;/h2&gt;
&lt;p&gt;你可以把每个请求看成一个优化问题：&lt;/p&gt;
&lt;p&gt;$$
\text{Business Value} = f(\text{Quality}, \text{Latency}, \text{Cost}, \text{Risk})
$$&lt;/p&gt;
&lt;p&gt;实践上建议：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;每周审一次路由命中率（flash/pro 比例）。&lt;/li&gt;
&lt;li&gt;每周审一次失败重试分布（哪些任务常失败）。&lt;/li&gt;
&lt;li&gt;每两周审一次评测集（是否过拟合旧题）。&lt;/li&gt;
&lt;li&gt;每月审一次“人审工时节省率”。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你要一个“能直接交付老板”的指标板，我建议至少有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;质量&lt;/code&gt;: 任务成功率、人工返工率。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;效率&lt;/code&gt;: P50/P95 延迟、吞吐。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;成本&lt;/code&gt;: 每千请求成本、缓存命中率。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;风险&lt;/code&gt;: 高风险输出拦截率、回滚次数。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;七面向生产环境的提示词模板可复用&quot;&gt;七、面向生产环境的提示词模板（可复用）&lt;/h2&gt;
&lt;h3 id=&quot;模板-a规范型输出&quot;&gt;模板 A：规范型输出&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;你是资深技术顾问。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;任务：根据输入生成方案。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;强约束：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1) 输出必须为 JSON&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2) 字段包括 summary, steps, risks, fallback&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3) steps 至少 5 步，每步不超过 60 字&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4) 不确定时必须显式写 unknown&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;模板-b代码修复型&quot;&gt;模板 B：代码修复型&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;你是代码修复助手。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;目标：修复 bug 并保持向后兼容。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;必须遵守：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1) 先描述根因，再给 patch 思路&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2) 不能删除公共 API&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3) 必须给回归测试点&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4) 输出格式：RootCause / Patch / Tests / Rollback&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;模板-c高风险决策型&quot;&gt;模板 C：高风险决策型&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;你是架构评审专家。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;请先列出假设，再给建议。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;若证据不足，必须输出“需要更多数据”。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;禁止给绝对化结论。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;八30-天落地计划个人小团队都能执行&quot;&gt;八、30 天落地计划（个人/小团队都能执行）&lt;/h2&gt;
&lt;h3 id=&quot;第-1-周打底&quot;&gt;第 1 周：打底&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;接入 DeepSeek V4，做最小 API 封装。&lt;/li&gt;
&lt;li&gt;引入日志字段：模型名、参数、请求 ID。&lt;/li&gt;
&lt;li&gt;设计 30 条评测样本。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;第-2-周分层路由&quot;&gt;第 2 周：分层路由&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;建立 flash/pro 路由规则。&lt;/li&gt;
&lt;li&gt;增加超时、重试、熔断。&lt;/li&gt;
&lt;li&gt;完成第一版成本看板。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;第-3-周工程化&quot;&gt;第 3 周：工程化&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;用 Claude Code 补齐单测与回归脚本。&lt;/li&gt;
&lt;li&gt;引入输出结构校验。&lt;/li&gt;
&lt;li&gt;增加失败样本自动归档。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;第-4-周上线治理&quot;&gt;第 4 周：上线治理&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;灰度发布（10% -&gt; 30% -&gt; 100%）。&lt;/li&gt;
&lt;li&gt;做一次版本复盘与参数冻结。&lt;/li&gt;
&lt;li&gt;形成团队 SOP 与值班手册。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;九结语模型升级不是换名字而是换生产方式&quot;&gt;九、结语：模型升级不是“换名字”，而是“换生产方式”&lt;/h2&gt;
&lt;p&gt;DeepSeek V4 给了你很强的模型底座，但真正决定上限的，是你如何把它嵌入工程系统。把 Claude Code 这样的代理工具当作“工程增幅器”，你会发现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;迭代速度更快。&lt;/li&gt;
&lt;li&gt;回归质量更稳。&lt;/li&gt;
&lt;li&gt;团队协作更可复制。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果只追“单次回答惊艳”，你会很快掉回手工救火；如果追“系统持续可交付”，你才会在半年后仍然领先。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;参考资料&quot;&gt;参考资料&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;DeepSeek API Docs: Your First API Call, Models &amp;#x26; Pricing, Reasoning Model（2026-04 访问）&lt;/li&gt;
&lt;li&gt;Claude Code Docs: Overview / Quickstart / Best Practices（2026-04 访问）&lt;/li&gt;
&lt;li&gt;Anthropic News: Claude 3.7 Sonnet and Claude Code（2025-02-24）&lt;/li&gt;
&lt;/ol&gt;</content:encoded><dc:creator>楓念</dc:creator><category>AI</category><category>DeepSeek</category><category>Claude Code</category><category>工程实践</category><category>大模型</category></item><item><title>目前掌握哪些 AI 工具相关技能，更有利于找工作？一份 2026 实战路线图</title><link>https://fengmic.pages.dev/post/%E7%9B%AE%E5%89%8D%E6%8E%8C%E6%8F%A1%E5%93%AA%E4%BA%9Bai%E5%B7%A5%E5%85%B7%E7%9B%B8%E5%85%B3%E6%8A%80%E8%83%BD%E6%9B%B4%E6%9C%89%E5%88%A9%E4%BA%8E%E6%89%BE%E5%B7%A5%E4%BD%9C/</link><guid isPermaLink="true">https://fengmic.pages.dev/post/%E7%9B%AE%E5%89%8D%E6%8E%8C%E6%8F%A1%E5%93%AA%E4%BA%9Bai%E5%B7%A5%E5%85%B7%E7%9B%B8%E5%85%B3%E6%8A%80%E8%83%BD%E6%9B%B4%E6%9C%89%E5%88%A9%E4%BA%8E%E6%89%BE%E5%B7%A5%E4%BD%9C/</guid><description>基于 WEF 与 Microsoft Work Trend Index 等公开资料，系统拆解 AI 时代最有就业价值的技能组合、岗位映射、作品集策略与 90 天执行计划。</description><pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;如果你只学“一个 AI 工具怎么用”，你会很快被替代；如果你学会“如何把 AI 变成稳定产出系统”，你会越来越值钱。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;一先看趋势不是会不会被替代而是你能不能放大自己的杠杆&quot;&gt;一、先看趋势：不是“会不会被替代”，而是“你能不能放大自己的杠杆”&lt;/h2&gt;
&lt;p&gt;关于 AI 与就业，最常见的两种错误判断是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;过度乐观：觉得只要会用 ChatGPT/Copilot 就能涨薪。&lt;/li&gt;
&lt;li&gt;过度悲观：觉得 AI 一来所有知识工作都没机会。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;现实更接近第三种：&lt;strong&gt;岗位结构在重排，价值密度在重估。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;从公开研究信号看，方向非常清晰：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;世界经济论坛 Future of Jobs 2025 指出，到 2030 年，技能结构会继续剧烈变化，技术技能与人类通用能力将同时走强。&lt;/li&gt;
&lt;li&gt;微软 Work Trend Index 2025 指出，组织开始从“人做全部工作”转向“人 + Agent 混合协作”，并提出“agent boss（代理管理者）”能力。&lt;/li&gt;
&lt;li&gt;LinkedIn 在 WorkLab 相关文章中强调，未来竞争力不仅是工具熟练度，更是 5Cs（好奇心、勇气、创造力、同理心、沟通）这类人类能力。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以真正的问题不是“学不学 AI”，而是：&lt;strong&gt;你是否正在构建“技术能力 + 业务能力 + 协作能力”的复合竞争力。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;二找工作最有用的不是单点技能而是-4-层能力栈&quot;&gt;二、找工作最有用的，不是单点技能，而是 4 层能力栈&lt;/h2&gt;
&lt;p&gt;我建议你把技能拆成四层。每一层都要有“能被验证的产出”。&lt;/p&gt;
&lt;h3 id=&quot;第-1-层ai-使用与提问能力入门门槛&quot;&gt;第 1 层：AI 使用与提问能力（入门门槛）&lt;/h3&gt;
&lt;p&gt;这是最低层，也是很多人停留的层次。包含：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;能写结构化提示词。&lt;/li&gt;
&lt;li&gt;知道如何补上下文（文件、数据、约束、目标）。&lt;/li&gt;
&lt;li&gt;能做多轮纠偏，而不是一次性“玄学提问”。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;招聘价值&lt;/strong&gt;：有，但不高。因为很快会成为默认能力。&lt;/p&gt;
&lt;h3 id=&quot;第-2-层工具链编排能力效率分水岭&quot;&gt;第 2 层：工具链编排能力（效率分水岭）&lt;/h3&gt;
&lt;p&gt;你要会把多个工具串起来，而不是“单工具表演”。例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Claude Code / Copilot 负责代码协作与工程实现。&lt;/li&gt;
&lt;li&gt;模型 API（DeepSeek、Claude、其他）负责推理与生成。&lt;/li&gt;
&lt;li&gt;自动化脚本负责批处理、评测、回归、告警。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;招聘价值&lt;/strong&gt;：高。因为这层直接决定“是否能进生产”。&lt;/p&gt;
&lt;h3 id=&quot;第-3-层业务问题建模能力价值核心&quot;&gt;第 3 层：业务问题建模能力（价值核心）&lt;/h3&gt;
&lt;p&gt;你要能把“模糊需求”转成“可执行系统”。比如：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;把客服效率问题拆成意图识别、知识召回、回复生成、人工兜底。&lt;/li&gt;
&lt;li&gt;把运营内容问题拆成选题、素材、风格约束、质量评审、发布复盘。&lt;/li&gt;
&lt;li&gt;把研发质量问题拆成静态检查、单测生成、回归验证、风险分级。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;招聘价值&lt;/strong&gt;：很高。因为你能直接对业务结果负责。&lt;/p&gt;
&lt;h3 id=&quot;第-4-层治理与可靠性能力高级门槛&quot;&gt;第 4 层：治理与可靠性能力（高级门槛）&lt;/h3&gt;
&lt;p&gt;真正让你从“会用 AI 的执行者”升级为“可托付的负责人”的，是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;成本治理（token 成本、缓存命中、模型路由）。&lt;/li&gt;
&lt;li&gt;风险治理（越权输出、事实幻觉、数据泄露）。&lt;/li&gt;
&lt;li&gt;质量治理（评测集、回归、线上监控）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;招聘价值&lt;/strong&gt;：顶级。因为企业最终买的是“可控的确定性”。&lt;/p&gt;
&lt;h2 id=&quot;三当前最值得掌握的-12-个-ai-工具相关技能&quot;&gt;三、当前最值得掌握的 12 个 AI 工具相关技能&lt;/h2&gt;
&lt;p&gt;下面这 12 项，我按“就业杠杆”排序，并给出为什么有用。&lt;/p&gt;
&lt;h3 id=&quot;1prompt-结构化设计&quot;&gt;1）Prompt 结构化设计&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重点：角色、目标、输入、约束、输出格式、验收标准。&lt;/li&gt;
&lt;li&gt;为什么有用：直接提升首次命中率，减少返工。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2模型路由与参数策略&quot;&gt;2）模型路由与参数策略&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重点：什么时候用快模型，什么时候用强模型，怎么降级。&lt;/li&gt;
&lt;li&gt;为什么有用：同时影响成本、速度和质量。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3rag-与知识接入&quot;&gt;3）RAG 与知识接入&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重点：文档切分、检索策略、上下文注入、来源标注。&lt;/li&gt;
&lt;li&gt;为什么有用：大多数企业场景都需要“基于私有知识回答”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4agent-工作流编排&quot;&gt;4）Agent 工作流编排&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重点：任务拆分、工具调用、状态管理、异常恢复。&lt;/li&gt;
&lt;li&gt;为什么有用：从“问答”升级到“任务完成”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5评测与回归体系&quot;&gt;5）评测与回归体系&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重点：构建标准样本集，定义通过阈值，自动回归。&lt;/li&gt;
&lt;li&gt;为什么有用：避免每次上线都靠人拍脑袋。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;6代码协作-aiclaude-code--copilot-等&quot;&gt;6）代码协作 AI（Claude Code / Copilot 等）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重点：探索-规划-实现-验证的协作节奏。&lt;/li&gt;
&lt;li&gt;为什么有用：研发岗位直接加速器。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;7自动化与脚本能力&quot;&gt;7）自动化与脚本能力&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重点：Python/Node 脚本、CLI 管道、批处理。&lt;/li&gt;
&lt;li&gt;为什么有用：把一次性效率变成可重复产能。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;8数据处理与分析能力&quot;&gt;8）数据处理与分析能力&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重点：SQL、Pandas、可视化、指标定义。&lt;/li&gt;
&lt;li&gt;为什么有用：没有数据闭环，AI 就无法持续优化。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;9ai-安全与合规意识&quot;&gt;9）AI 安全与合规意识&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重点：隐私、权限、审计、提示注入防护。&lt;/li&gt;
&lt;li&gt;为什么有用：企业落地最怕“出一次事故”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;10业务沟通与需求澄清&quot;&gt;10）业务沟通与需求澄清&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重点：把技术语言翻译为业务结果。&lt;/li&gt;
&lt;li&gt;为什么有用：决定你是否能从执行者走向负责人。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;11跨职能协作能力&quot;&gt;11）跨职能协作能力&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重点：产品、研发、运营、法务对齐。&lt;/li&gt;
&lt;li&gt;为什么有用：AI 项目天然跨部门。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;12持续学习机制&quot;&gt;12）持续学习机制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重点：每周复盘、每月更新、案例积累。&lt;/li&gt;
&lt;li&gt;为什么有用：AI 变化快，不学习就掉队。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;四岗位映射不同方向该优先学什么&quot;&gt;四、岗位映射：不同方向该优先学什么&lt;/h2&gt;
&lt;h3 id=&quot;a-前后端全栈工程师&quot;&gt;A. 前后端/全栈工程师&lt;/h3&gt;
&lt;p&gt;优先顺序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;代码协作 AI + 测试生成。&lt;/li&gt;
&lt;li&gt;模型 API 接入 + 路由策略。&lt;/li&gt;
&lt;li&gt;评测回归 + 监控告警。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;目标：你不只是“会写代码”，而是“会交付 AI 功能”。&lt;/p&gt;
&lt;h3 id=&quot;b-数据分析数据产品&quot;&gt;B. 数据分析/数据产品&lt;/h3&gt;
&lt;p&gt;优先顺序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数据清洗与特征理解。&lt;/li&gt;
&lt;li&gt;检索增强与报表自动化。&lt;/li&gt;
&lt;li&gt;指标看板与实验评估。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;目标：你不只是“做报表”，而是“驱动业务决策”。&lt;/p&gt;
&lt;h3 id=&quot;c-运营市场内容岗位&quot;&gt;C. 运营/市场/内容岗位&lt;/h3&gt;
&lt;p&gt;优先顺序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;内容生产工作流自动化。&lt;/li&gt;
&lt;li&gt;A/B 文案实验与反馈闭环。&lt;/li&gt;
&lt;li&gt;用户洞察与策略复盘。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;目标：你不只是“提高产量”，而是“提高转化质量”。&lt;/p&gt;
&lt;h3 id=&quot;d-产品经理项目经理&quot;&gt;D. 产品经理/项目经理&lt;/h3&gt;
&lt;p&gt;优先顺序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;需求建模与任务拆解。&lt;/li&gt;
&lt;li&gt;质量与风险治理。&lt;/li&gt;
&lt;li&gt;跨部门流程设计。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;目标：你不只是“写 PRD”，而是“推动 AI 能力落地并稳定运营”。&lt;/p&gt;
&lt;h2 id=&quot;五什么样的作品集最能打动招聘方&quot;&gt;五、什么样的作品集最能打动招聘方&lt;/h2&gt;
&lt;p&gt;简历里写“熟悉 AI 工具”几乎没有区分度。你需要的是&lt;strong&gt;可验证案例&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我建议至少准备 3 个项目：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一个效率类项目：例如“自动代码审查与修复建议流水线”。&lt;/li&gt;
&lt;li&gt;一个业务类项目：例如“客服知识库问答助手 + 人工兜底”。&lt;/li&gt;
&lt;li&gt;一个治理类项目：例如“模型评测平台（准确率/延迟/成本）”。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;每个项目都写清楚 6 件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;问题定义。&lt;/li&gt;
&lt;li&gt;技术方案。&lt;/li&gt;
&lt;li&gt;关键权衡。&lt;/li&gt;
&lt;li&gt;指标提升。&lt;/li&gt;
&lt;li&gt;风险与失败。&lt;/li&gt;
&lt;li&gt;下一步优化。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;面试官最喜欢的不是“完美项目”，而是你能说明白：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为什么这么做。&lt;/li&gt;
&lt;li&gt;为什么这么取舍。&lt;/li&gt;
&lt;li&gt;出问题时怎么修。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;六90-天提升计划可直接执行&quot;&gt;六、90 天提升计划（可直接执行）&lt;/h2&gt;
&lt;h3 id=&quot;第-1-30-天打基础建立可重复习惯&quot;&gt;第 1-30 天：打基础，建立可重复习惯&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;每天 30 分钟：练结构化提示词。&lt;/li&gt;
&lt;li&gt;每周 2 次：用 AI 工具完成真实工作任务并复盘。&lt;/li&gt;
&lt;li&gt;完成一个小工具：例如批量摘要/分类脚本。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;输出物：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提示词模板库。&lt;/li&gt;
&lt;li&gt;一份复盘日志。&lt;/li&gt;
&lt;li&gt;一个可运行仓库。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;第-31-60-天做系统形成端到端能力&quot;&gt;第 31-60 天：做系统，形成端到端能力&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;做一个完整 AI 小项目（有前后端或脚本链路）。&lt;/li&gt;
&lt;li&gt;接入至少一种模型 API（如 DeepSeek V4）。&lt;/li&gt;
&lt;li&gt;增加最小评测与回归机制。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;输出物：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;项目 README（含架构图、指标、截图）。&lt;/li&gt;
&lt;li&gt;Demo 视频（3 分钟以内）。&lt;/li&gt;
&lt;li&gt;面试讲解稿（5 分钟版本）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;第-61-90-天向岗位对齐形成求职战斗力&quot;&gt;第 61-90 天：向岗位对齐，形成求职战斗力&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;根据目标岗位重写简历和项目叙述。&lt;/li&gt;
&lt;li&gt;进行 5 次模拟面试（技术 + 业务 +行为）。&lt;/li&gt;
&lt;li&gt;持续迭代项目，补足安全与成本治理。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;输出物：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;岗位定制版简历。&lt;/li&gt;
&lt;li&gt;项目案例库。&lt;/li&gt;
&lt;li&gt;一页纸“我能带来的业务价值”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;七面试中最加分的回答框架&quot;&gt;七、面试中最加分的回答框架&lt;/h2&gt;
&lt;p&gt;当被问“你会哪些 AI 工具”时，避免只报工具名。建议用这个结构：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;我解决的业务问题是什么。&lt;/li&gt;
&lt;li&gt;我如何拆分任务并选择工具。&lt;/li&gt;
&lt;li&gt;我如何验证结果是否有效。&lt;/li&gt;
&lt;li&gt;我如何控制成本与风险。&lt;/li&gt;
&lt;li&gt;我沉淀了什么可复用资产。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;示例回答：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我在上一段实践里做了客服场景自动化，先用检索增强保证事实来源，再用模型生成回答，最后加人工兜底与反馈学习。上线后首次响应时间下降 40%，人工重复答复工时下降 30%。我把提示词模板、评测数据和回归脚本都沉淀到了仓库，后续新同学可以一周内接手。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这种回答，远比“我会很多 AI 工具”有说服力。&lt;/p&gt;
&lt;h2 id=&quot;八你真正要争取的是ai-时代的职业复利&quot;&gt;八、你真正要争取的，是“AI 时代的职业复利”&lt;/h2&gt;
&lt;p&gt;AI 不会只改变一个岗位，而是改变“价值如何被创造和分配”。&lt;/p&gt;
&lt;p&gt;如果你只把 AI 当“一个会聊天的软件”，你的成长会很快见顶；
如果你把 AI 当“可编排的生产力系统”，你的职业上限会被持续抬高。&lt;/p&gt;
&lt;p&gt;请记住这三句话：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;会用工具是起点，不是壁垒。&lt;/li&gt;
&lt;li&gt;能交付结果才有溢价。&lt;/li&gt;
&lt;li&gt;能稳定交付结果的人，才是企业真正想要的人。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;参考资料&quot;&gt;参考资料&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;World Economic Forum, The Future of Jobs Report 2025（Digest 与 Stories 页面）&lt;/li&gt;
&lt;li&gt;Microsoft Work Trend Index 2025: The year the Frontier Firm is born&lt;/li&gt;
&lt;li&gt;Microsoft WorkLab: The essential human skills for AI success? Focus on the 5Cs&lt;/li&gt;
&lt;li&gt;Coursera: 5 In-Demand Jobs Requiring AI Skills（用于岗位技能分类参考）&lt;/li&gt;
&lt;/ol&gt;</content:encoded><dc:creator>楓念</dc:creator><category>AI</category><category>求职</category><category>职业发展</category><category>技能地图</category><category>职场</category></item><item><title>Next.js 动漫风格博客系统</title><link>https://fengmic.pages.dev/post/nextjs%E5%8A%A8%E6%BC%AB%E9%A3%8E%E6%A0%BC%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F/</link><guid isPermaLink="true">https://fengmic.pages.dev/post/nextjs%E5%8A%A8%E6%BC%AB%E9%A3%8E%E6%A0%BC%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F/</guid><description>基于 Next.js 16 和 React 19 构建的现代化个人博客系统，采用动漫风格设计，支持 Markdown 文章、图片轮播、相册展示等功能</description><pubDate>Tue, 09 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;nextjs-动漫风格博客系统&quot;&gt;Next.js 动漫风格博客系统&lt;/h1&gt;
&lt;p&gt;一个充满动漫元素的现代化个人博客系统，采用最新的 Next.js 16 和 React 19 技术栈构建。&lt;/p&gt;
&lt;h2 id=&quot;-项目特色&quot;&gt;🎨 项目特色&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;动漫风格界面&lt;/strong&gt;：粉色主题，流星动画，充满少女心的视觉设计&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式布局&lt;/strong&gt;：完美适配桌面端和移动端&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流畅动画&lt;/strong&gt;：基于 Framer Motion 的丝滑交互体验&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown 支持&lt;/strong&gt;：完整的文章编写和渲染能力&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码高亮&lt;/strong&gt;：支持多种编程语言的语法高亮显示&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;-技术栈&quot;&gt;🚀 技术栈&lt;/h2&gt;
&lt;h3 id=&quot;核心框架&quot;&gt;核心框架&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Next.js 16.0.7&lt;/strong&gt;：采用最新的 App Router 架构和 Turbopack 构建工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;React 19.2.1&lt;/strong&gt;：最新的 React 版本，支持服务端组件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;：完整的类型支持，提升开发体验&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ui-与样式&quot;&gt;UI 与样式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tailwind CSS 3.4&lt;/strong&gt;：原子化 CSS 框架，快速构建界面&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Framer Motion 11&lt;/strong&gt;：强大的动画库，实现流畅的页面交互&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：移动端友好的自适应布局&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;内容处理&quot;&gt;内容处理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;gray-matter&lt;/strong&gt;：解析 Markdown 文件的 Front Matter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;remark &amp;#x26; remark-html&lt;/strong&gt;：Markdown 转 HTML&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;remark-gfm&lt;/strong&gt;：GitHub 风格的 Markdown 扩展&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;rehype-highlight&lt;/strong&gt;：代码语法高亮&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;工具库&quot;&gt;工具库&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;date-fns&lt;/strong&gt;：现代化的日期处理库&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;-功能模块&quot;&gt;📦 功能模块&lt;/h2&gt;
&lt;h3 id=&quot;1-首页动画&quot;&gt;1. 首页动画&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;50 颗星星的流动动画&lt;/li&gt;
&lt;li&gt;5 颗流星划过效果&lt;/li&gt;
&lt;li&gt;渐变背景和霓虹文字特效&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-博客文章系统&quot;&gt;2. 博客文章系统&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Markdown 文章编写&lt;/li&gt;
&lt;li&gt;文章列表展示（带随机名言）&lt;/li&gt;
&lt;li&gt;文章详情页面&lt;/li&gt;
&lt;li&gt;代码高亮显示&lt;/li&gt;
&lt;li&gt;标签分类&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-侧边栏功能&quot;&gt;3. 侧边栏功能&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;左侧边栏&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;个人头像（支持网络图片）&lt;/li&gt;
&lt;li&gt;用户信息展示&lt;/li&gt;
&lt;li&gt;社交链接&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;右侧边栏&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;动漫日历显示&lt;/li&gt;
&lt;li&gt;图片轮播展示&lt;/li&gt;
&lt;li&gt;相册集合&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-导航系统&quot;&gt;4. 导航系统&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;首页&lt;/li&gt;
&lt;li&gt;博客列表&lt;/li&gt;
&lt;li&gt;相册展示&lt;/li&gt;
&lt;li&gt;关于页面&lt;/li&gt;
&lt;li&gt;流畅的页面切换动画&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;️-使用方法&quot;&gt;🛠️ 使用方法&lt;/h2&gt;
&lt;h3 id=&quot;安装依赖&quot;&gt;安装依赖&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;开发环境运行&quot;&gt;开发环境运行&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问 &lt;a href=&quot;http://localhost:3000&quot;&gt;http://localhost:3000&lt;/a&gt; 查看效果。&lt;/p&gt;
&lt;h3 id=&quot;生产环境构建&quot;&gt;生产环境构建&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;️-添加文章&quot;&gt;✍️ 添加文章&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;posts/&lt;/code&gt; 目录下创建 &lt;code&gt;.md&lt;/code&gt; 文件：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;font-weight:bold&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;title: &quot;文章标题&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;date: &quot;2025-12-09&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;tags: [&quot;标签1&quot;, &quot;标签2&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;excerpt: &quot;文章简介&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;author: &quot;作者名&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;font-weight:bold&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;font-weight:bold&quot;&gt;# 文章内容&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;这里是正文内容...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;front-matter-字段说明&quot;&gt;Front Matter 字段说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;title&lt;/strong&gt;: 文章标题（必填）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;date&lt;/strong&gt;: 发布日期，格式 YYYY-MM-DD（必填）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tags&lt;/strong&gt;: 标签数组（必填）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;excerpt&lt;/strong&gt;: 文章摘要（必填）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;author&lt;/strong&gt;: 作者名称（必填）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;️-配置文件&quot;&gt;⚙️ 配置文件&lt;/h2&gt;
&lt;h3 id=&quot;dataconfigjson---基础配置&quot;&gt;&lt;code&gt;data/config.json&lt;/code&gt; - 基础配置&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;  &quot;userInfo&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;    &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;你的名字&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;    &quot;bio&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;个人简介&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;    &quot;avatar&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;头像图片 URL&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;    &quot;github&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;GitHub 链接&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;    &quot;email&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;邮箱地址&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;dataquotesjson---名言配置&quot;&gt;&lt;code&gt;data/quotes.json&lt;/code&gt; - 名言配置&lt;/h3&gt;
&lt;p&gt;存储首页和文章列表展示的随机名言。&lt;/p&gt;
&lt;h3 id=&quot;datacarouseljson---轮播图配置&quot;&gt;&lt;code&gt;data/carousel.json&lt;/code&gt; - 轮播图配置&lt;/h3&gt;
&lt;p&gt;配置右侧边栏的图片轮播内容。&lt;/p&gt;
&lt;h3 id=&quot;dataalbumsjson---相册配置&quot;&gt;&lt;code&gt;data/albums.json&lt;/code&gt; - 相册配置&lt;/h3&gt;
&lt;p&gt;配置相册页面的图片集合。&lt;/p&gt;
&lt;h2 id=&quot;-图片配置&quot;&gt;🌐 图片配置&lt;/h2&gt;
&lt;p&gt;项目支持外部图片链接，需在 &lt;code&gt;next.config.mjs&lt;/code&gt; 中配置允许的域名：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;images&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;  remotePatterns&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;      protocol: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&apos;https&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;      hostname: &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&apos;your-image-host.com&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;  ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;-项目亮点&quot;&gt;🎯 项目亮点&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;性能优化&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 Next.js 16 的 Turbopack 超快构建&lt;/li&gt;
&lt;li&gt;服务端组件减少客户端 JavaScript&lt;/li&gt;
&lt;li&gt;图片自动优化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;开发体验&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TypeScript 完整类型支持&lt;/li&gt;
&lt;li&gt;热模块替换（HMR）&lt;/li&gt;
&lt;li&gt;清晰的项目结构&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;用户体验&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;流畅的页面切换动画&lt;/li&gt;
&lt;li&gt;响应式设计适配多端&lt;/li&gt;
&lt;li&gt;代码块语法高亮&lt;/li&gt;
&lt;li&gt;可爱的动漫风格 UI&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;可扩展性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块化组件设计&lt;/li&gt;
&lt;li&gt;配置文件分离&lt;/li&gt;
&lt;li&gt;易于添加新功能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;-项目结构&quot;&gt;📂 项目结构&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── app/                    # Next.js App Router 页面&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── layout.tsx         # 根布局&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── page.tsx           # 首页（流星动画）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── home/              # 博客列表&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── post/[id]/         # 文章详情&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── albums/            # 相册页面&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── about/             # 关于页面&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── components/            # React 组件&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── Sidebar.tsx        # 左侧边栏&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── RightSidebar.tsx   # 右侧边栏&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── PostList.tsx       # 文章列表&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── data/                  # 配置文件&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── config.json        # 基础配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── quotes.json        # 名言&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   ├── carousel.json      # 轮播图&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── albums.json        # 相册&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── lib/                   # 工具函数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── posts.ts           # 文章处理&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── posts/                 # Markdown 文章&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── styles/                # 全局样式&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;└── public/                # 静态资源&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;-技术细节&quot;&gt;🔧 技术细节&lt;/h2&gt;
&lt;h3 id=&quot;性能优化&quot;&gt;性能优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;预渲染星星和流星位置，避免 SSR/CSR 不一致&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;useEffect&lt;/code&gt; 延迟加载客户端组件&lt;/li&gt;
&lt;li&gt;图片懒加载和自动格式转换&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;兼容性处理&quot;&gt;兼容性处理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修复 React 19 hydration 错误&lt;/li&gt;
&lt;li&gt;处理 Next.js 16 参数异步化&lt;/li&gt;
&lt;li&gt;配置图片远程域名白名单&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;-更新日志&quot;&gt;📝 更新日志&lt;/h2&gt;
&lt;h3 id=&quot;v010-2025-12-09&quot;&gt;v0.1.0 (2025-12-09)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ 升级到 Next.js 16.0.7 和 React 19.2.1&lt;/li&gt;
&lt;li&gt;✅ 修复所有 hydration 错误&lt;/li&gt;
&lt;li&gt;✅ 优化动画性能&lt;/li&gt;
&lt;li&gt;✅ 添加图标配置&lt;/li&gt;
&lt;li&gt;✅ 支持网络图片头像&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;-开发建议&quot;&gt;💡 开发建议&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;添加文章&lt;/strong&gt;：直接在 &lt;code&gt;posts/&lt;/code&gt; 目录创建 &lt;code&gt;.md&lt;/code&gt; 文件即可&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改配置&lt;/strong&gt;：编辑 &lt;code&gt;data/&lt;/code&gt; 目录下的 JSON 文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义样式&lt;/strong&gt;：修改 Tailwind 配置或组件内的 className&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;添加功能&lt;/strong&gt;：在 &lt;code&gt;components/&lt;/code&gt; 创建新组件并引入&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;-贡献&quot;&gt;🤝 贡献&lt;/h2&gt;
&lt;p&gt;欢迎提交 Issue 和 Pull Request！&lt;/p&gt;
&lt;h2 id=&quot;-许可证&quot;&gt;📄 许可证&lt;/h2&gt;
&lt;p&gt;MIT License&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Enjoy coding! 🎉&lt;/strong&gt;&lt;/p&gt;</content:encoded><dc:creator>Admin</dc:creator><category>代码</category><category>前端</category><category>技术</category></item><item><title>虚拟机使用操作（以及如何使用sbt工具打jar包）</title><link>https://fengmic.pages.dev/post/%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BD%BF%E7%94%A8%E6%93%8D%E4%BD%9C%E4%BB%A5%E5%8F%8A%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8sbt%E5%B7%A5%E5%85%B7%E6%89%93jar%E5%8C%85/</link><guid isPermaLink="true">https://fengmic.pages.dev/post/%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BD%BF%E7%94%A8%E6%93%8D%E4%BD%9C%E4%BB%A5%E5%8F%8A%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8sbt%E5%B7%A5%E5%85%B7%E6%89%93jar%E5%8C%85/</guid><description>打开虚拟机后默认登陆的用户为”feng”，但是hadoop,spark,scala等各种东西都安装在hadoop用户下，所以直接使用命令start-all.sh会发现报错找不到命令，feng用户是创建</description><pubDate>Fri, 21 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;虚拟机有个小问题需要解决&quot;&gt;虚拟机有个小问题需要解决&lt;/h2&gt;
&lt;h2 id=&quot;20250321之前复制的有这个问题在21号之后复制的我已经在虚拟机文件上解决了这个问题&quot;&gt;（2025.03.21之前复制的有这个问题，在21号之后复制的我已经在虚拟机文件上解决了这个问题）&lt;/h2&gt;
&lt;p&gt;打开虚拟机后默认登陆的用户为”feng”，但是hadoop,spark,scala等各种东西都安装在hadoop用户下，所以直接使用命令start-all.sh会发现报错找不到命令，feng用户是创建系统的时候搞的默认用户，现在用不到它了可以把他删除掉。&lt;/p&gt;
&lt;p&gt;打开虚拟机后会自动登陆到feng用户，先点击右上角的按钮，选择登出，然后切换成hadoop用户（所有有密码的东西密码都是123456）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-01.png&quot; alt=&quot;图片占位符 1&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-02.png&quot; alt=&quot;图片占位符 2&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;进入hadoop用户后，打开终端输入以下命令：sudo user -r feng&lt;/p&gt;
&lt;p&gt;来删除用户feng，密码是123456&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-03.png&quot; alt=&quot;图片占位符 3&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;正式开始本次的教程&quot;&gt;正式开始本次的教程&lt;/h2&gt;
&lt;h2 id=&quot;1hadoop的使用&quot;&gt;1.hadoop的使用&lt;/h2&gt;
&lt;p&gt;我已经将hadoop相关环境变量全部配置好了，所以hadoop相关的指令都可以直接使用：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;start-dfs.sh&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # 开启hdfs服务&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;start-yarn.sh&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # 开启yarn服务&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;start-all.sh&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # 开启全部hadoop服务&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;stop-all.sh&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;     # 关闭全部hadoop服务&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;（其它的命令也同样可以直接使用，这里不再赘述）&lt;/p&gt;
&lt;p&gt;hadoop的相关服务是拥有web可视化页面的，先使用命令：ifconfig 来查看自己本机的IP地址，然后在浏览器中输入 本机IP:9870，本机IP:8088，可分别进入到hdfs和YARN的管理页面。（如下图）&lt;/p&gt;
&lt;p&gt;(hadoop的相关服务启动后才能进入这些页面，在虚拟机或者windows主机的浏览器都可以打开，如果不能打开请检查自己windows电脑的防火墙设置)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-04.png&quot; alt=&quot;图片占位符 4&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-05.png&quot; alt=&quot;图片占位符 5&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-06.png&quot; alt=&quot;图片占位符 6&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;hdfs文件管理页面&quot;&gt;HDFS文件管理页面&lt;/h2&gt;
&lt;p&gt;HDFS的文件管理页面是我们常用的，所以说一下怎么进这个页面，在dfs管理页面中（IP:9870）点击上方菜单栏的Utilities然后选择第一个选项就进入HDFS文件管理页面了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-07.png&quot; alt=&quot;图片占位符 7&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-08.png&quot; alt=&quot;图片占位符 8&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2其它项目sparkscala使用方法&quot;&gt;2.其它项目（spark,scala）使用方法&lt;/h2&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;p&gt;（烙铁，spark命令行和scala代码怎么写都可以问AI的）&lt;/p&gt;
&lt;h2 id=&quot;3如何将scala代码打包成jar包&quot;&gt;3.如何将scala代码打包成jar包&lt;/h2&gt;
&lt;p&gt;此教程的主要目的来了，由于真的在终端中敲代码的话，比较麻烦（用vim写代码的都是大哥），所以我们在拥有可视化页面的IDEA中进行代码编写和打包（因为IDEA中有插件能很好的创建scala项目和编写scala代码）
关于如何创建scala项目，可以先去看我的另一篇博客（&lt;a href=&quot;https://fengmic.pages.dev/post/%E5%AE%89%E8%A3%85%E5%B9%B6%E7%BC%96%E5%86%99scala%E4%BB%A3%E7%A0%81%E5%9C%A8windows%E4%B8%AD&quot;&gt;安装并编写scala代码（在windows中）&lt;/a&gt;），这里不再说一遍了。&lt;/p&gt;
&lt;h2 id=&quot;不同之处&quot;&gt;不同之处&lt;/h2&gt;
&lt;p&gt;当看完另一篇教程后，你应该已经会创建scala项目了，此时我们再创建一个新的scala项目，创建的时候不再选择使用IntelliJ来构建系统，因为我们要打包，所以要使用sbt来构建项目，以便后续能直接在IDEA中使用sbt打包。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-09.png&quot; alt=&quot;图片占位符 9&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;构建系统选择sbt，Scala版本选择2.13.11（和虚拟机中的Spark版本兼容性好，同时虚拟机中用的scala版本也是这个）&lt;/p&gt;
&lt;p&gt;等待项目构建完成之后，会在左侧项目文件管理栏中有一个”build.bat”文件，它管理着项目的一些配置，我们更改它为下图中这样：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-10.png&quot; alt=&quot;图片占位符 10&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;ThisBuild&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; version &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;0.1.0-SNAPSHOT&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;ThisBuild&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scalaVersion &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;2.13.11&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;lazy&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; val&lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt; root&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; (project in file(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;  .settings(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    name &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;sbt_demo&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    libraryDependencies &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;++=&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; Seq&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;      &quot;org.apache.spark&quot;&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; %%&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;spark-core&quot;&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;3.4.4&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 根据你的 Spark 版本选择合适的依赖&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;      &quot;org.apache.spark&quot;&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; %%&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;spark-sql&quot;&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;3.4.4&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;  )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后点击悬浮的小按钮重新构建项目。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-11.png&quot; alt=&quot;图片占位符 11&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;重新构建完成后就可以进行scala代码的编写&quot;&gt;重新构建完成后就可以进行scala代码的编写&lt;/h2&gt;
&lt;p&gt;问AI代码怎么写，别问我。&lt;/p&gt;
&lt;p&gt;下面是AI写的代码：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; org&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;apache&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;spark&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;sql&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;SparkSession&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;object&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; HDFSLineCount&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;  def&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;Array&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; Unit&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // 创建 SparkSession&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;    val&lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt; spark&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; SparkSession&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;.builder&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;      .appName(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;HDFS Line Count&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;      .getOrCreate()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // 读取 HDFS 文件&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;    val&lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt; filePath&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;/user/hadoop/test.txt&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;    val&lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt; lines&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; spark.read.textFile(filePath)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // 统计行数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;    val&lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt; lineCount&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; lines.count()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    println(&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;test.txt文件的行数是: &lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;$lineCount&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 这行代码将结果输出到控制台&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // 停止 SparkSession&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    spark.stop()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-12.png&quot; alt=&quot;图片占位符 12&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;代码文件要在上图指示的这个目录下&lt;/p&gt;
&lt;p&gt;然后点击启动左下角的sbt工具的sbt shell，输入指令package进行打包。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-13.png&quot; alt=&quot;图片占位符 13&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;打包出来的jar包在target/scala2.13文件目录下。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-14.png&quot; alt=&quot;图片占位符 14&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;4使用spark运行jar包&quot;&gt;4.使用spark运行jar包&lt;/h2&gt;
&lt;p&gt;将jar包导入到虚拟机中（放在哪个目录都可以，只要自己能够找到就行）&lt;/p&gt;
&lt;p&gt;然后启动hadoop，因为要sparky运行依托于hadoop的YARN服务。&lt;/p&gt;
&lt;p&gt;然后执行下面的命令进行运行&lt;/p&gt;
&lt;p&gt;可以在打开hadoop服务后直接先运行这串指令试试，因为我已经在虚拟机中放了一个jar包。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;spark-submit&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;--class &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;HDFSLineCount&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;--master &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;yarn&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;--deploy-mode &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;cluster&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;--name &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;HDFS Line Count Application&quot;&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;--num-executors &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;--executor-memory &lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;2g&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;--executor-cores &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;/home/hadoop/sbt_demo_2.13-0.1.0-SNAPSHOT.jar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;参数说明&quot;&gt;参数说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--class HDFSLineCount&lt;/code&gt;&lt;/strong&gt;：指定包含 &lt;code&gt;main&lt;/code&gt; 方法的类名，即 &lt;code&gt;HDFSLineCount&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--master yarn&lt;/code&gt;&lt;/strong&gt;：指定使用 YARN 作为资源管理器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--deploy-mode cluster&lt;/code&gt;&lt;/strong&gt;：指定驱动程序在集群中运行（而不是在提交命令的机器上运行）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--name &quot;HDFS Line Count Application&quot;&lt;/code&gt;&lt;/strong&gt;：为应用程序指定一个名称，便于在 YARN 界面中识别。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--num-executors 3&lt;/code&gt;&lt;/strong&gt;：指定分配 3 个执行器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--executor-memory 2g&lt;/code&gt;&lt;/strong&gt;：为每个执行器分配 2GB 内存。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--executor-cores 2&lt;/code&gt;&lt;/strong&gt;：为每个执行器分配 2 个 CPU 核心。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/home/hadoop/sbt_demo_2.13-0.1.0-SNAPSHOT.jar&lt;/code&gt;&lt;/strong&gt;：指定 JAR 文件的路径。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-15.png&quot; alt=&quot;图片占位符 15&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;执行命令后的结果，程序的输出结果并不会在终端中显示，而是在YARN管理的日志中显示。&lt;/p&gt;
&lt;p&gt;打开浏览器输入 IP:8088 进入YARN管理页面，然后选择你刚刚运行的jar的应用ID号（在终端中输入显示的有），以本程序为例程序ID为：application_1742486156184_0002，注意，每一次程序运行后产生的程序ID号都不同（但其实也没必要太注意，因为这里的日志是缓存，会被自动清理掉，每次运行完程序可能这里就只有一两个日志）&lt;/p&gt;
&lt;p&gt;点击进入刚刚运行的jar包的程序运行信息中&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-16.png&quot; alt=&quot;图片占位符 16&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后滑到页面最下方，找到日志(logs)点击进入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-17.png&quot; alt=&quot;图片占位符 17&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;最后点击日志中的输出文件（stdout（标准输出））&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-18.png&quot; alt=&quot;图片占位符 18&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;可以看到程序的运行输出结果&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/vm-usage-and-sbt-jar/image-19.png&quot; alt=&quot;图片占位符 19&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>楓念</dc:creator><category>虚拟机</category><category>Hadoop</category><category>Spark</category><category>Scala</category><category>sbt</category><category>大数据</category></item><item><title>安装并编写scala代码（在windows中）</title><link>https://fengmic.pages.dev/post/%E5%AE%89%E8%A3%85%E5%B9%B6%E7%BC%96%E5%86%99scala%E4%BB%A3%E7%A0%81%E5%9C%A8windows%E4%B8%AD/</link><guid isPermaLink="true">https://fengmic.pages.dev/post/%E5%AE%89%E8%A3%85%E5%B9%B6%E7%BC%96%E5%86%99scala%E4%BB%A3%E7%A0%81%E5%9C%A8windows%E4%B8%AD/</guid><description>老师说过，在windows中和Linux中写scala作业都行，我推荐是在windows中写，因为写代码不用用vim一点一点敲了，还有代码提示，复制粘贴也更好用。在windows下写的scala代码可</description><pubDate>Fri, 14 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;这周日就截止scala大数据分析与内存计算课程的作业了但有些人赵某还没装scala所以写个简单教程&quot;&gt;这周日就截止scala（大数据分析与内存计算课程）的作业了，但有些人（赵某）还没装scala，所以写个简单教程&lt;/h2&gt;
&lt;p&gt;老师说过，在windows中和Linux中写scala作业都行，我推荐是在windows中写，因为写代码不用用vim一点一点敲了，还有代码提示，复制粘贴也更好用。在windows下写的scala代码可以直接把文件复制到linux中（需要装scala）直接运行的。&lt;/p&gt;
&lt;p&gt;（PS:此教程不需要事先装好JAVA JDK,scala SDK等，本教程中有安装这些的环节）&lt;/p&gt;
&lt;p&gt;（安装插件的过程受网络环境影响，会比较慢，让它自己在那下载就好，可以先去做其他事）&lt;/p&gt;
&lt;h2 id=&quot;1安装intellij-idea这个是写java代码的和pycharm是同一个公司制作的软件&quot;&gt;1.安装IntelliJ IDEA（这个是写java代码的，和pycharm是同一个公司制作的软件）&lt;/h2&gt;
&lt;p&gt;社区版（免费版）和专业版（付费版）都可以用，想省劲直接用社区版，想体验完整功能就去找专业版破解教程，这里不再讲述。&lt;/p&gt;
&lt;h2 id=&quot;2打开软件后进行项目的创建&quot;&gt;2.打开软件后进行项目的创建&lt;/h2&gt;
&lt;p&gt;我的IDEA是汉化过的，但是否是中文不影响后续操作，因此不再讲解怎么汉化。&lt;/p&gt;
&lt;p&gt;第一次打开IDEA就是这样一个页面，点击创建一个新项目。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/install-scala-on-windows/image-01.png&quot; alt=&quot;图片占位符 1&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;3安装scala插件&quot;&gt;3.安装scala插件&lt;/h2&gt;
&lt;p&gt;初始进行创建项目的时候，是没有创建scala项目的选项的，因此需要下载scala插件以便能够创建scala项目。&lt;/p&gt;
&lt;p&gt;点击左下角蓝色字体，跳转到插件商店页面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/install-scala-on-windows/image-02.png&quot; alt=&quot;图片占位符 2&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;选择”Marketplace”然后搜索scala，然后点击安装。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/install-scala-on-windows/image-03.png&quot; alt=&quot;图片占位符 3&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;4scala项目的初始化配置&quot;&gt;4.scala项目的初始化配置&lt;/h2&gt;
&lt;p&gt;安装完scala插件后回到刚刚的项目创建页面，选择和填写一个scala项目的初始化配置（如下图）。&lt;/p&gt;
&lt;p&gt;JAVA的JDK也可以直接在这里面下载，点击下拉菜单后可以选择用自己的JDK或者下载其它版本的JDK。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/install-scala-on-windows/image-04.png&quot; alt=&quot;图片占位符 4&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;不需要事先安装好scala SDK，在这里可以直接选择下载它默认推荐的scala SDK版本&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/install-scala-on-windows/image-05.png&quot; alt=&quot;图片占位符 5&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/install-scala-on-windows/image-06.png&quot; alt=&quot;图片占位符 6&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;配置完成后就可以点击确定创建scala项目了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/install-scala-on-windows/image-07.png&quot; alt=&quot;图片占位符 7&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;5测试运行scala代码&quot;&gt;5.测试运行scala代码&lt;/h2&gt;
&lt;p&gt;scala代码文件都在src/目录下，后续创建新的代码文件时记得也在这个文件夹下创建。&lt;/p&gt;
&lt;p&gt;在右上角选择到当前文件，然后就可以点击运行了。&lt;/p&gt;
&lt;p&gt;（第一次运行他会进行编译，会比较慢）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/install-scala-on-windows/image-08.png&quot; alt=&quot;图片占位符 8&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;程序正常运行，输出正常执行，教程结束。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/install-scala-on-windows/image-09.png&quot; alt=&quot;图片占位符 9&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>楓念</dc:creator><category>Scala</category><category>IntelliJ IDEA</category><category>大数据</category><category>教程</category></item><item><title>scrapy分布式爬虫</title><link>https://fengmic.pages.dev/post/scrapy%E5%88%86%E5%B8%83%E5%BC%8F%E7%88%AC%E8%99%AB/</link><guid isPermaLink="true">https://fengmic.pages.dev/post/scrapy%E5%88%86%E5%B8%83%E5%BC%8F%E7%88%AC%E8%99%AB/</guid><description>目前的scrapy分布式爬虫一般都是基于redis数据库的分布式爬虫。</description><pubDate>Tue, 10 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;做一下分布式爬虫的教程&quot;&gt;做一下分布式爬虫的教程&lt;/h2&gt;
&lt;p&gt;目前的scrapy分布式爬虫一般都是基于redis数据库的分布式爬虫。&lt;/p&gt;
&lt;p&gt;并且真正的分布式是在多台机器上运行同一个项目，但是应该没有富哥/富婆有多台机器（电脑）。&lt;/p&gt;
&lt;p&gt;所以还剩下两种方案：&lt;/p&gt;
&lt;p&gt;1.直接在你电脑主机上（windows系统）上写一个分布式项目，然后同时运行多次这个项目（相当于多进程）&lt;/p&gt;
&lt;p&gt;2.搞虚拟机来模拟多台机器&lt;/p&gt;
&lt;p&gt;由于我电脑硬盘空间十分滴宝贵（没空间了），所以我使用第一种方法。&lt;/p&gt;
&lt;h2 id=&quot;开始准备下载redis数据库&quot;&gt;开始准备：下载redis数据库&lt;/h2&gt;
&lt;p&gt;redis数据库是一种类似mongodb的非关系型数据库，优点就是实时性以及速度非常滴快，占用空间也很小。&lt;/p&gt;
&lt;p&gt;下面是下载链接：&lt;/p&gt;
&lt;p&gt;redis-2.8.9: &lt;a href=&quot;https://pan.baidu.com/s/1uRleT7jweEoays2yqekh-w?pwd=m9kw&quot;&gt;https://pan.baidu.com/s/1uRleT7jweEoays2yqekh-w?pwd=m9kw&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;只有redis数据库还是不够的，我们需要一个有操作界面的工具软件，类似mysql我们使用navicat来连接操控，毕竟没人喜欢用数据库自带的命令行一行一行的敲命令吧。&lt;/p&gt;
&lt;p&gt;Tiny RDM ：&lt;a href=&quot;https://pan.baidu.com/s/1eyDsKGwGEgv7E24qVEvpiw?pwd=e5a6&quot;&gt;https://pan.baidu.com/s/1eyDsKGwGEgv7E24qVEvpiw?pwd=e5a6&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;redis数据库下载后是一个压缩包，解压后会出现一堆.exe文件，因为我们只是简单使用，所以不需要修改redis的配置（conf文件），直接双击 redis-server.exe 文件就启动了redis数据库。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-01.png&quot; alt=&quot;图片占位符 1&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后就可以使用工具来连接redis数据库来看看数据库是否正常运行，Tiny RDM软件不需要安装，双击打开可以直接使用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-02.png&quot; alt=&quot;图片占位符 2&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;点击添加新连接。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-03.png&quot; alt=&quot;图片占位符 3&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;因为我们是在本地运行多个分布式爬虫项目,所以没有配置redis数据库的远程连接，并且每有配置密码，所以连接地址默认使用127.0.0.1本地回环，端口也是默认6379，密码不需要填写，只需要填写一个连接名就可以了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-04.png&quot; alt=&quot;图片占位符 4&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;这是连接成功后的界面，如果连接失败看看自己是不是把redis服务启动后弹出的终端窗口关闭了，这个终端窗口在redis运行期间是不能关闭的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;redis数据库配置完成目前我们还用不到它我们先去创建scrapy项目&quot;&gt;redis数据库配置完成，目前我们还用不到它，我们先去创建scrapy项目&lt;/h2&gt;
&lt;p&gt;在PyCharm中创建一个新的项目，然后在左下角找到终端按钮打开，然后安装scrapy的库：pip install scrapy&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-05.png&quot; alt=&quot;图片占位符 5&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-06.png&quot; alt=&quot;图片占位符 6&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后创建一个scrapy的项目：scrapy startproject douban&lt;/p&gt;
&lt;p&gt;然后进入scrapy项目的文件夹中：cd douban&lt;/p&gt;
&lt;p&gt;创建一个示例爬虫代码文件：scrapy genspider douban250 douban.com&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-07.png&quot; alt=&quot;图片占位符 7&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;先修改一下基础的示例代码文件，然后运行项目：scrapy crawl douban250&lt;/p&gt;
&lt;p&gt;测试一下是否能成功访问豆瓣250。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-08.png&quot; alt=&quot;图片占位符 8&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;我们可以发现返回的状态码为空（当状态码为200时才是成功访问），原因是因为我们还没有进行访问头user-agent的配置，所以豆瓣250禁止我们访问，我们需要去修改settings.py配置文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-09.png&quot; alt=&quot;图片占位符 9&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;USER_AGENT为访问头&lt;/p&gt;
&lt;p&gt;同时我们发现输出中有大量的DEBUG信息和INFO信息，但是这些信息只是日志信息，既不是报错，也不是我们需要的信息，所以使用LOG_LEVEL来设置日志等级，设置为”WARNING”即只有警告以及报错以上的信息才会提示你。&lt;/p&gt;
&lt;p&gt;同时我们可以顺便进行一下scrapy连接redis数据库的相关配置。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-10.png&quot; alt=&quot;图片占位符 10&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;以及把管道打开（把ITEM_PIPELINES前面的注释删除掉）,并且因为要使用scrapy-redis,所以还要把redis的管道加上&lt;/p&gt;
&lt;p&gt;REDIS_HOST：redis数据库的连接地址，因为在本地，所以使用127.0.0.1&lt;/p&gt;
&lt;p&gt;REDIS_PORT:为redis数据库服务用的端口号&lt;/p&gt;
&lt;p&gt;REDIS_DB：为要使用redis的哪个数据库（初始默认有15个数据库，这里使用7号数据库）&lt;/p&gt;
&lt;p&gt;REDIS_PASSWORD：redis数据库的密码，咱们没有配置密码，所以这一项可以不用添加&lt;/p&gt;
&lt;p&gt;下面三行是使用redis的调度器替换scrapy调度器列表的相关配置&lt;/p&gt;
&lt;h2 id=&quot;相关配置的文本&quot;&gt;相关配置的文本&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;LOG_LEVEL&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;WARNING&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Crawl responsibly by identifying yourself (and your website) on the user-agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;USER_AGENT&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &apos;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;DOWNLOAD_DELAY&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 设置请求之间的延迟为 2 秒&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# redis相关配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;REDIS_HOST&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &apos;127.0.0.1&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;REDIS_PORT&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; 6379&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;REDIS_DB&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; 7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# REDIS_PASSWORD = &apos;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# scrapy_redis相关配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;SCHEDULER&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &apos;scrapy_redis.scheduler.Scheduler&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;SCHEDULER_PERSIST&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 如果为真，则在关闭时自动保存请求信息&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;DUPEFILTER_CLASS&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &apos;scrapy_redis.dupefilter.RFPDupeFilter&apos;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 去重的逻辑,要使用redis的&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;ITEM_PIPELINES&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;    &apos;scrapy_redis.pipelines.RedisPipeline&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;301&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;    &quot;douban.pipelines.DoubanPipeline&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;不知道上面的配置文件怎么搞没事可以直接复制下面的完整文件覆盖掉你的settingspy文件&quot;&gt;不知道上面的配置文件怎么搞？没事，可以直接复制下面的完整文件覆盖掉你的settings.py文件&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Scrapy settings for douban project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# For simplicity, this file contains only settings considered important or&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# commonly used. You can find more settings consulting the documentation:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#     https://docs.scrapy.org/en/latest/topics/settings.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#     https://docs.scrapy.org/en/latest/topics/spider-middleware.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;BOT_NAME&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;douban&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;SPIDER_MODULES&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;douban.spiders&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;NEWSPIDER_MODULE&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;douban.spiders&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;LOG_LEVEL&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;WARNING&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Crawl responsibly by identifying yourself (and your website) on the user-agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;USER_AGENT&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &apos;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;DOWNLOAD_DELAY&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 设置请求之间的延迟为 2 秒&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Obey robots.txt rules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;ROBOTSTXT_OBEY&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Configure maximum concurrent requests performed by Scrapy (default: 16)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# CONCURRENT_REQUESTS = 32&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Configure a delay for requests for the same website (default: 0)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See also autothrottle settings and docs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# DOWNLOAD_DELAY = 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# The download delay setting will honor only one of:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# CONCURRENT_REQUESTS_PER_DOMAIN = 16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# CONCURRENT_REQUESTS_PER_IP = 16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Disable cookies (enabled by default)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# COOKIES_ENABLED = False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Disable Telnet Console (enabled by default)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# TELNETCONSOLE_ENABLED = False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Override the default request headers:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# DEFAULT_REQUEST_HEADERS = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#    &quot;Accept&quot;: &quot;text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#    &quot;Accept-Language&quot;: &quot;en&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Enable or disable spider middlewares&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SPIDER_MIDDLEWARES = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#    &quot;douban.middlewares.DoubanSpiderMiddleware&quot;: 543,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Enable or disable downloader middlewares&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# DOWNLOADER_MIDDLEWARES = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#    &quot;douban.middlewares.DoubanDownloaderMiddleware&quot;: 543,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Enable or disable extensions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/extensions.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# EXTENSIONS = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#    &quot;scrapy.extensions.telnet.TelnetConsole&quot;: None,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Configure item pipelines&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;ITEM_PIPELINES&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;    &apos;scrapy_redis.pipelines.RedisPipeline&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;301&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;    &quot;douban.pipelines.DoubanPipeline&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# redis相关配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;REDIS_HOST&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &apos;127.0.0.1&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;REDIS_PORT&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; 6379&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;REDIS_DB&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; 7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# REDIS_PASSWORD = &apos;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# scrapy_redis相关配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;SCHEDULER&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &apos;scrapy_redis.scheduler.Scheduler&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;SCHEDULER_PERSIST&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 如果为真，则在关闭时自动保存请求信息&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;DUPEFILTER_CLASS&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &apos;scrapy_redis.dupefilter.RFPDupeFilter&apos;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 去重的逻辑,要使用redis的&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Enable and configure the AutoThrottle extension (disabled by default)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/autothrottle.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# AUTOTHROTTLE_ENABLED = True&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# The initial download delay&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# AUTOTHROTTLE_START_DELAY = 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# The maximum download delay to be set in case of high latencies&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# AUTOTHROTTLE_MAX_DELAY = 60&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# The average number of requests Scrapy should be sending in parallel to&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# each remote server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Enable showing throttling stats for every response received:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# AUTOTHROTTLE_DEBUG = False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Enable and configure HTTP caching (disabled by default)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# HTTPCACHE_ENABLED = True&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# HTTPCACHE_EXPIRATION_SECS = 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# HTTPCACHE_DIR = &quot;httpcache&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# HTTPCACHE_IGNORE_HTTP_CODES = []&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# HTTPCACHE_STORAGE = &quot;scrapy.extensions.httpcache.FilesystemCacheStorage&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Set settings whose default value is deprecated to a future-proof value&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;TWISTED_REACTOR&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;twisted.internet.asyncioreactor.AsyncioSelectorReactor&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;FEED_EXPORT_ENCODING&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;utf-8&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;然后再回到爬虫代码&quot;&gt;然后再回到爬虫代码&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-11.png&quot; alt=&quot;图片占位符 11&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-12.png&quot; alt=&quot;图片占位符 12&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-13.png&quot; alt=&quot;图片占位符 13&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;由于我在代码中使用了scrapy自带的items的数据结构，所以要将items.py导入到代码文件中。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-14.png&quot; alt=&quot;图片占位符 14&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;右键scrapy项目”豆瓣”选择将其标记为源代码根目录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-15.png&quot; alt=&quot;图片占位符 15&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后在代码中导入items.py&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-16.png&quot; alt=&quot;图片占位符 16&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;前面忘了说了，还需要导入scrapy-redis的第三方库&lt;/p&gt;
&lt;p&gt;下载命令：pip install scrapy-redis&lt;/p&gt;
&lt;h2 id=&quot;完整的爬虫douban250py代码&quot;&gt;完整的爬虫douban250.py代码&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; douban.items &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; DoubanItem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy_redis.spiders &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; RedisSpider, RedisCrawlSpider&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; Douban250Spider&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;RedisSpider&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;):  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 换成RedisSpider&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    name &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;douban250&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    allowed_domains &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;douban.com&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # start_urls = [&quot;https://movie.douban.com/top250&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    redis_key &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;douban_start_url&quot;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 开始链接换成redis_key&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;    def&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; parse&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(self, response, &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;kwargs):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        # 进入电影详情页&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        lis &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; response.xpath(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;//ol[@class=&apos;grid_view&apos;]/li&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; li &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; lis:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;            href &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; li.xpath(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;./div/div[2]/div[1]/a/@href&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;).extract_first()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;            # 不用管是否重复，判断工作交给scrapy_redis完成&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;            yield&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy.Request(&lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;href, &lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt;callback&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;.parse_detail)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        # 继续爬取下一页电影详情页的url&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        next_page &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; response.xpath(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;//*[@id=&apos;content&apos;]/div/div[1]/div[2]/span[3]/a/@href&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;).extract_first()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;        yield&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy.Request(&lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;response.urljoin(next_page), &lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt;callback&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;.parse)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;    def&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; parse_detail&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(self, response, &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;kwargs):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        douban &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; DoubanItem()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        name &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; response.xpath(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;//*[@id=&apos;content&apos;]/h1/span[1]/text()&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;).extract_first()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        date &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; response.xpath(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;//*[@id=&apos;content&apos;]/h1/span[2]/text()&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;).extract_first()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        daoyan &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; response.xpath(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;//*[@id=&apos;info&apos;]/span[1]/span[2]/a/text()&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;).extract_first()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        bianjus &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; response.xpath(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;//*[@id=&apos;info&apos;]/span[2]/span[2]/a&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        bianju &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; bianjus:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;            test &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; i.xpath(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;./text()&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;).extract_first()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;            bianju &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; test &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;/&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        pingfen &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; response.xpath(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;//*[@id=&apos;interest_sectl&apos;]/div[1]/div[2]/strong/text()&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;).extract_first()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        pingjiarenshu &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; response.xpath(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;            &quot;//*[@id=&apos;interest_sectl&apos;]/div[1]/div[2]/div/div[2]/a/span/text()&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;).extract_first()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        douban[&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        douban[&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        douban[&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;daoyan&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; daoyan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        douban[&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;bianju&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; bianju&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        douban[&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;pingfen&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; pingfen&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        douban[&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;pingjiarenshu&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; pingjiarenshu&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;        yield&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; douban&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;完整的itemspy代码&quot;&gt;完整的items.py代码&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Define here the models for your scraped items&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See documentation in:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# https://docs.scrapy.org/en/latest/topics/items.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; DoubanItem&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;scrapy&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;Item&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # define the fields for your item here like:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    name &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy.Field()  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 电影名&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    date &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy.Field()  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 首映时间&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    daoyan &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy.Field()  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 导演&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    bianju &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy.Field()  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 编剧&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    pingfen &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy.Field()  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 豆瓣评分&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    pingjiarenshu &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy.Field()  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# 评价人数&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;开始启动项目&quot;&gt;开始启动项目&lt;/h2&gt;
&lt;p&gt;1.先启动redis数据库服务&lt;/p&gt;
&lt;p&gt;2.打开连接redis数据库的软件&lt;/p&gt;
&lt;p&gt;3.切换到7号数据库&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-17.png&quot; alt=&quot;图片占位符 17&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;4.使用终端启动多个scrapy爬虫项目&lt;/p&gt;
&lt;p&gt;先使用 cd douban 进入项目文件夹&lt;/p&gt;
&lt;p&gt;然后使用命令启动项目：scrapy crawl douban250&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-18.png&quot; alt=&quot;图片占位符 18&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-19.png&quot; alt=&quot;图片占位符 19&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;运行项目后你会发现终端里面一直是空白的，无论过多久都没有任何信息，这是正常的，因为爬虫还没有真正的开始运行，去查看一下代码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-20.png&quot; alt=&quot;图片占位符 20&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;可以看到爬虫的开始url被注释掉了，因为我们需要完成分布式的爬取，也就是说多台设备共同做一个爬虫任务，那么scrapy本身自带的调度器我们就通过redis将其“合并”到了一起，多台设备共用一个用于存取需要爬取的url的列表，这个列表位于redis的7号数据库中，目前这个列表是空的，所以爬虫任务不能开始。&lt;/p&gt;
&lt;p&gt;我们需要将第一个要爬的页面的url添加到调度器列表当中。&lt;/p&gt;
&lt;p&gt;键：douban_start_url&lt;/p&gt;
&lt;p&gt;元素：&lt;a href=&quot;https://movie.douban.com/top250&quot;&gt;https://movie.douban.com/top250&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-21.png&quot; alt=&quot;图片占位符 21&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;这是在分别查看两个终端，两个终端都开始输出爬取的电影信息，且不一样（代表着两个进程在爬取不同的电影，最后都会将爬取到的信息返回到redis数据库中，完成了分布式爬虫的目的）&lt;/p&gt;
&lt;p&gt;可以在redis的7号数据库中查看爬取到的电影信息&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-22.png&quot; alt=&quot;图片占位符 22&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-23.png&quot; alt=&quot;图片占位符 23&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;什么你报错了&quot;&gt;什么，你报错了？&lt;/h2&gt;
&lt;p&gt;那就对了，我也报错，报错内容如下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler/image-24.png&quot; alt=&quot;图片占位符 24&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;报错原因是因为scrapy-redis新版本中不用string了，推荐你使用json类型的数据，这里有三种解决办法：&lt;/p&gt;
&lt;p&gt;1.按照人家的推荐把url相关的数据换成json类型（气抖冷，居然不让我想用什么数据用什么数据，当然不能惯着你，我就不用json）&lt;/p&gt;
&lt;p&gt;2.先往redis中添加开始url，然后再启动项目（欸！官方代码更新了，但是没更新完全！先添加开始url再启动项目他就不报错正常运行了）&lt;/p&gt;
&lt;p&gt;3.使用老版本的scrapy库，先pip uninstall scrapy卸载&lt;/p&gt;
&lt;p&gt;然后再 pip install scrapy==2.90 下载老版本的库来使用（没办法，我跟着学的是21年的课程，那时候的库都是老版本，我只会些老版本的语法）&lt;/p&gt;
&lt;p&gt;推荐使用第二种方法，啥也不用管，换个顺序就行了&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;注意本文代码只适用于本爬虫项目你要照抄的话连项目名都不能改动要完全按照我的来不然很容易报错&quot;&gt;注意本文代码只适用于本爬虫项目，你要照抄的话，连项目名都不能改动，要完全按照我的来，不然很容易报错&lt;/h2&gt;</content:encoded><dc:creator>楓念</dc:creator><category>Python</category><category>Scrapy</category><category>爬虫</category><category>Redis</category><category>分布式</category></item><item><title>scrapy分布式爬虫-续</title><link>https://fengmic.pages.dev/post/scrapy%E5%88%86%E5%B8%83%E5%BC%8F%E7%88%AC%E8%99%AB-%E7%BB%AD/</link><guid isPermaLink="true">https://fengmic.pages.dev/post/scrapy%E5%88%86%E5%B8%83%E5%BC%8F%E7%88%AC%E8%99%AB-%E7%BB%AD/</guid><description>跟着上个教程走的同志们应该多少都会遇到这个警报信息。</description><pubDate>Tue, 10 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;此教程是上个教程的后续此教程中没有原理解释只对上个教程中出现的错误进行修正&quot;&gt;此教程是上个教程的后续，此教程中没有原理解释，只对上个教程中出现的错误进行修正&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;跟着上个教程走的同志们应该多少都会遇到这个警报信息。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler-2/image-01.png&quot; alt=&quot;图片占位符 1&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;经过百度，多方面讨论，询问老师，查询scrapy-redis的github项目帮助文档，甚至分析源码得出结论：&lt;/p&gt;
&lt;p&gt;爬取不到信息跟这个无关，因为就算你爬取到了信息它还是会显示的有这个警报。&lt;/p&gt;
&lt;p&gt;有的同学能爬取到信息，有的同学爬取不到，有的时能爬时不能爬，原因是：&lt;/p&gt;
&lt;p&gt;豆瓣网的反爬虫机制发力了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler-2/image-02.png&quot; alt=&quot;图片占位符 2&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;解决方案换个网站爬&quot;&gt;解决方案：换个网站爬&lt;/h2&gt;
&lt;p&gt;这里我找到了一个专门让你练习爬虫的网站，没有任何反爬限制，可以随便爬：
&lt;a href=&quot;http://books.toscrape.com/&quot;&gt;http://books.toscrape.com/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;那么开始构建scrapy分布式爬虫项目&quot;&gt;那么开始构建scrapy分布式爬虫项目：&lt;/h2&gt;
&lt;h2 id=&quot;1先创建项目scrapy-startproject-book&quot;&gt;1.先创建项目：scrapy startproject book&lt;/h2&gt;
&lt;h2 id=&quot;2创建实例爬虫文件scrapy-genspider-books-toscrapecom&quot;&gt;2.创建实例爬虫文件：scrapy genspider books toscrape.com&lt;/h2&gt;
&lt;p&gt;记得先要 cd book 进入项目文件夹内&lt;/p&gt;
&lt;h2 id=&quot;3修改settingspy文件不废话讲了直接贴完整代码&quot;&gt;3.修改settings.py文件，不废话讲了，直接贴完整代码&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Scrapy settings for book project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# For simplicity, this file contains only settings considered important or&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# commonly used. You can find more settings consulting the documentation:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#     https://docs.scrapy.org/en/latest/topics/settings.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#     https://docs.scrapy.org/en/latest/topics/spider-middleware.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;BOT_NAME&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;book&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;SPIDER_MODULES&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;book.spiders&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;NEWSPIDER_MODULE&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;book.spiders&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Crawl responsibly by identifying yourself (and your website) on the user-agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#USER_AGENT = &quot;book (+http://www.yourdomain.com)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;LOG_LEVEL&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;WARNING&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Obey robots.txt rules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;ROBOTSTXT_OBEY&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Configure maximum concurrent requests performed by Scrapy (default: 16)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#CONCURRENT_REQUESTS = 32&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Configure a delay for requests for the same website (default: 0)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See also autothrottle settings and docs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#DOWNLOAD_DELAY = 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# The download delay setting will honor only one of:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#CONCURRENT_REQUESTS_PER_DOMAIN = 16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#CONCURRENT_REQUESTS_PER_IP = 16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Disable cookies (enabled by default)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#COOKIES_ENABLED = False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Disable Telnet Console (enabled by default)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#TELNETCONSOLE_ENABLED = False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Override the default request headers:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#DEFAULT_REQUEST_HEADERS = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#    &quot;Accept&quot;: &quot;text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#    &quot;Accept-Language&quot;: &quot;en&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Enable or disable spider middlewares&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#SPIDER_MIDDLEWARES = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#    &quot;book.middlewares.BookSpiderMiddleware&quot;: 543,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Enable or disable downloader middlewares&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#DOWNLOADER_MIDDLEWARES = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#    &quot;book.middlewares.BookDownloaderMiddleware&quot;: 543,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Enable or disable extensions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/extensions.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#EXTENSIONS = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#    &quot;scrapy.extensions.telnet.TelnetConsole&quot;: None,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Configure item pipelines&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;ITEM_PIPELINES&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;   &apos;scrapy_redis.pipelines.RedisPipeline&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;301&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;   &quot;book.pipelines.BookPipeline&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# redis相关配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;REDIS_HOST&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &apos;127.0.0.1&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;REDIS_PORT&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; 6379&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;REDIS_DB&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# REDIS_PASSWORD = &apos;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# scrapy_redis相关配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;SCHEDULER&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &apos;scrapy_redis.scheduler.Scheduler&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;SCHEDULER_PERSIST&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 如果为真，则在关闭时自动保存请求信息&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;DUPEFILTER_CLASS&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &apos;scrapy_redis.dupefilter.RFPDupeFilter&apos;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 去重的逻辑,要使用redis的&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Enable and configure the AutoThrottle extension (disabled by default)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/autothrottle.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#AUTOTHROTTLE_ENABLED = True&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# The initial download delay&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#AUTOTHROTTLE_START_DELAY = 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# The maximum download delay to be set in case of high latencies&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#AUTOTHROTTLE_MAX_DELAY = 60&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# The average number of requests Scrapy should be sending in parallel to&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# each remote server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Enable showing throttling stats for every response received:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#AUTOTHROTTLE_DEBUG = False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Enable and configure HTTP caching (disabled by default)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#HTTPCACHE_ENABLED = True&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#HTTPCACHE_EXPIRATION_SECS = 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#HTTPCACHE_DIR = &quot;httpcache&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#HTTPCACHE_IGNORE_HTTP_CODES = []&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#HTTPCACHE_STORAGE = &quot;scrapy.extensions.httpcache.FilesystemCacheStorage&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Set settings whose default value is deprecated to a future-proof value&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;TWISTED_REACTOR&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;twisted.internet.asyncioreactor.AsyncioSelectorReactor&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;FEED_EXPORT_ENCODING&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;utf-8&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;4爬虫文件bookspy的完整代码&quot;&gt;4.爬虫文件books.py的完整代码&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy_redis.spiders &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; RedisSpider&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; BooksSpider&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt;RedisSpider&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    name &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;books&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    allowed_domains &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&quot;toscrape.com&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # start_urls = [&quot;http://books.toscrape.com/&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;    redis_key &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt; &quot;books_start_url&quot;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  # 开始链接换成redis_key&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;    def&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; parse&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(self, response, &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;args, &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;kwargs):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        next_page_url2 &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; response.xpath(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;            &apos;//*[@id=&quot;default&quot;]/div/div/div/div/section/div[2]/div/ul/li[2]/a/@href&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;).extract_first()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        next_page_url3 &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; response.xpath(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;            &apos;//*[@id=&quot;default&quot;]/div/div/div/div/section/div[2]/div/ul/li[3]/a/@href&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;).extract_first()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; next_page_url2 &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;is&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; None&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;            yield&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy.Request(&lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;response.urljoin(next_page_url2), &lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt;callback&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;.parse)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;        elif&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; next_page_url3 &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;is&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt; None&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;            yield&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy.Request(&lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;response.urljoin(next_page_url3), &lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt;callback&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;.parse)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        lis &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; response.xpath(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&apos;//*[@id=&quot;default&quot;]/div/div/div/div/section/div[2]/ol/li&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; li &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; lis:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;            href &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; li.xpath(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&apos;./article/h3/a/@href&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;).extract_first()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;            yield&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; scrapy.Request(&lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;response.urljoin(href), &lt;/span&gt;&lt;span style=&quot;color:#E36209&quot;&gt;callback&lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;.parse_detail)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;    def&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; parse_detail&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(self, response, &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;args, &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;kwargs):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        name &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; response.xpath(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&apos;//*[@id=&quot;content_inner&quot;]/article/div[1]/div[2]/h1/text()&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;).extract_first()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        jiage &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; response.xpath(&lt;/span&gt;&lt;span style=&quot;color:#032F62&quot;&gt;&apos;//*[@id=&quot;content_inner&quot;]/article/div[1]/div[2]/p[1]/text()&apos;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;).extract_first()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        dic &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;            &quot;书籍名称&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: name,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62&quot;&gt;            &quot;书籍价格&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;: jiage&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;        yield&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; dic&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;5管道pipelinespy文件完整代码&quot;&gt;5.管道pipelines.py文件完整代码&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-light&quot; style=&quot;background-color:#fff;color:#24292e; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Define your item pipelines here&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Don&apos;t forget to add your pipeline to the ITEM_PIPELINES setting&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# useful for handling different item types with a single interface&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; itemadapter &lt;/span&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; ItemAdapter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; BookPipeline&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;    def&lt;/span&gt;&lt;span style=&quot;color:#6F42C1&quot;&gt; process_item&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(self, item, spider):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5&quot;&gt;        print&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt;(item)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#24292E&quot;&gt; item&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这次为了简便，item数据类型都不用了，查看这次的配置文件可以发现，这次没整反爬，请求头user-agent以及爬取延时都没做，对了，数据库换成了redis的4号数据库&lt;/p&gt;
&lt;h2 id=&quot;多个终端进入项目文件夹后使用命令&quot;&gt;多个终端进入项目文件夹后使用命令：&lt;/h2&gt;
&lt;h2 id=&quot;scrapy-crawl-books&quot;&gt;scrapy crawl books&lt;/h2&gt;
&lt;h2 id=&quot;启动项目&quot;&gt;启动项目&lt;/h2&gt;
&lt;h2 id=&quot;然后在数据库连接软件中切换到4号数据库将初始网页链接添加进去&quot;&gt;然后在数据库连接软件中切换到4号数据库，将初始网页链接添加进去&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler-2/image-03.png&quot; alt=&quot;图片占位符 3&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;键：books_start_url&lt;/p&gt;
&lt;p&gt;元素：&lt;a href=&quot;http://books.toscrape.com/&quot;&gt;http://books.toscrape.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后可以在软件中查看爬取到的信息&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/scrapy-distributed-crawler-2/image-04.png&quot; alt=&quot;图片占位符 4&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;轻轻松松的爬取到了全部的1000条数据（2分钟）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;这次就应该没问题了。&lt;/p&gt;
&lt;p&gt;有问题可以在下方评论区反馈，不用注册登录也能评论的。&lt;/p&gt;</content:encoded><dc:creator>楓念</dc:creator><category>Python</category><category>Scrapy</category><category>爬虫</category><category>Redis</category><category>分布式</category></item><item><title>五一假期无聊，各位推荐点电影，动漫</title><link>https://fengmic.pages.dev/post/%E4%BA%94%E4%B8%80%E5%81%87%E6%9C%9F%E6%97%A0%E8%81%8A%E5%90%84%E4%BD%8D%E6%8E%A8%E8%8D%90%E7%82%B9%E7%94%B5%E5%BD%B1%E5%8A%A8%E6%BC%AB/</link><guid isPermaLink="true">https://fengmic.pages.dev/post/%E4%BA%94%E4%B8%80%E5%81%87%E6%9C%9F%E6%97%A0%E8%81%8A%E5%90%84%E4%BD%8D%E6%8E%A8%E8%8D%90%E7%82%B9%E7%94%B5%E5%BD%B1%E5%8A%A8%E6%BC%AB/</guid><description>如标题所说，作业早写完了，求推荐点电影和动漫。</description><pubDate>Tue, 30 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如标题所说，作业早写完了，求推荐点电影和动漫。&lt;/p&gt;
&lt;p&gt;电影整点搞笑的，或者是名著改编的，其它的也行，不要超级英雄和鸡汤。&lt;/p&gt;
&lt;p&gt;动漫别整厕纸就行（高质量的黄金厕纸可以考虑）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fengmic.pages.dev/images/posts/holiday-movie-anime-recommendations/image-01.png&quot; alt=&quot;图片占位符 1&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>楓念</dc:creator><category>闲聊</category><category>电影</category><category>动漫</category></item></channel></rss>