<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title><![CDATA[yuzhiblue 开发博客]]></title>
    <link>https://7tec.cn/blog</link>
    <description><![CDATA[开发笔记与技术思考：Windows 自动化、Python / PySide6、Astro 建站与独立产品开发经验。]]></description>
    <language>zh-CN</language>
    <lastBuildDate>Sun, 13 Sep 2026 08:01:42 GMT</lastBuildDate>
    <atom:link href="https://7tec.cn/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title><![CDATA[Playwright的launch_persistent_context，AI编程巨坑]]></title>
      <link>https://7tec.cn/blog/playwright-launch-persistent-context-pitfalls</link>
      <guid isPermaLink="true">https://7tec.cn/blog/playwright-launch-persistent-context-pitfalls</guid>
      <pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[在今年3月份之前，我只听过playwright并没有实际用过。 直到最近一个项目需要操控网页，我才真正体验了一把。 总的来说，方便是挺方便，但是坑也是真的坑。 尤其是在AI编程的大环境下。如果你对于playwright不熟悉，贸然用play]]></description>
    </item>
    <item>
      <title><![CDATA[桌面自动化pywinauto/pyautogui要不要添加资源管理器检测+重启？]]></title>
      <link>https://7tec.cn/blog/pywinauto-explorer-restart-watchdog</link>
      <guid isPermaLink="true">https://7tec.cn/blog/pywinauto-explorer-restart-watchdog</guid>
      <pubDate>Fri, 09 Jan 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[结论先说：非常有必要把「资源管理器卡死」纳入你的桌面自动化程序的异常处理逻辑 ，而且是「必做项」，不是可选项 你的程序基于 pywinauto + pyautogui 做桌面自动化，资源管理器（explorer.exe）卡死，对你的程序是「]]></description>
    </item>
    <item>
      <title><![CDATA[Rust学习笔记以及我的一点想法]]></title>
      <link>https://7tec.cn/blog/rust-learning-notes</link>
      <guid isPermaLink="true">https://7tec.cn/blog/rust-learning-notes</guid>
      <pubDate>Thu, 21 Aug 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[小马过河，不试一下怎么知道 学习rust就像小马过河一样，有人觉得太难了，有人觉得一点也不难。到底难不难只有自己试了才知道，因为每个人的水平、理解力、学习环境和心态都是不一样的。 就目前来说，我确实感觉到难，但是并没有网上说的那么难，因为所]]></description>
    </item>
    <item>
      <title><![CDATA[除了DLL注入，还有没有其它注入方案？]]></title>
      <link>https://7tec.cn/blog/dll-injection-alternatives</link>
      <guid isPermaLink="true">https://7tec.cn/blog/dll-injection-alternatives</guid>
      <pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[如果你不想编写DLL文件，仍然有其他方法可以进行注入，尤其是在Python中。你可以尝试直接通过代码注入（不需要编写DLL）来操控目标进程。这种方法通常通过直接操作进程内存，或者利用现有的工具和库来达到注入的效果。 以下是几种常见的替代方案]]></description>
    </item>
    <item>
      <title><![CDATA[如何获得目标函数的地址？]]></title>
      <link>https://7tec.cn/blog/get-target-function-address</link>
      <guid isPermaLink="true">https://7tec.cn/blog/get-target-function-address</guid>
      <pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[要详细讲如何获得目标函数的地址，实际上是逆向工程和调试中的一个核心环节。不同情况下方法有所差异，下面我系统性介绍几种常用方法，帮你理解和操作。 如何获得目标函数的地址 1\. 静态分析：使用反汇编工具 工具示例 \ IDA Pro \ Gh]]></description>
    </item>
    <item>
      <title><![CDATA[内存注入如何获取并调用内存中的内部函数？]]></title>
      <link>https://7tec.cn/blog/memory-injection-call-internal-function</link>
      <guid isPermaLink="true">https://7tec.cn/blog/memory-injection-call-internal-function</guid>
      <pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[使用内存注入的方式来获取并调用目标进程中的内部函数是完全可行的。这种方法通常需要你注入代码并且执行特定的操作来获取目标函数的地址，然后通过该地址调用函数。这通常涉及到以下几个步骤： 1\. 获取目标进程的内存地址 你首先需要找到目标函数在内]]></description>
    </item>
    <item>
      <title><![CDATA[python实现dll注入的技术示例]]></title>
      <link>https://7tec.cn/blog/python-dll-injection-example</link>
      <guid isPermaLink="true">https://7tec.cn/blog/python-dll-injection-example</guid>
      <pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[使用Python实现DLL注入是一项比较复杂的任务，通常涉及到调用操作系统底层的API。因此，我们通常使用Python的ctypes库或pywin32库来进行此类操作。以下是一个简单的示例，展示如何在Windows系统上使用Python通过]]></description>
    </item>
    <item>
      <title><![CDATA[一段Python代码示范如何获取模块基址，再结合已知偏移计算目标函数地址]]></title>
      <link>https://7tec.cn/blog/python-module-base-address-offset</link>
      <guid isPermaLink="true">https://7tec.cn/blog/python-module-base-address-offset</guid>
      <pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[下面是一个示范代码，展示了如何使用Python结合psutil和ctypes来获取目标进程的模块基址，并且计算目标函数的地址。代码主要利用了Windows API。 步骤： 1. 获取目标进程的ID（psutil） 2. 列出目标进程的模块]]></description>
    </item>
    <item>
      <title><![CDATA[dll注入是什么意思？]]></title>
      <link>https://7tec.cn/blog/what-is-dll-injection</link>
      <guid isPermaLink="true">https://7tec.cn/blog/what-is-dll-injection</guid>
      <pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[DLL注入（Dynamic Link Library Injection）是一种技术，它允许在一个正在运行的进程中插入一个动态链接库（DLL）。通过这种方式，注入的DLL可以访问和修改该进程的内存、函数、变量等资源。这种技术通常被用于调试、]]></description>
    </item>
    <item>
      <title><![CDATA[如何在电视上播放家里电脑上的视频？]]></title>
      <link>https://7tec.cn/blog/play-pc-video-on-tv</link>
      <guid isPermaLink="true">https://7tec.cn/blog/play-pc-video-on-tv</guid>
      <pubDate>Thu, 08 May 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[对于一个全职宝爸来说，有时候想安安静静地坐在电脑旁学点东西真的太难太难了。 把小宝宝放到客厅自己玩耍，你要时刻担心他自己在外面做什么，让他和你一块坐在电脑旁，结果才坐了一分钟就开始坐不住了。不是上桌子就是拍键盘，不是拍屏幕就是大声嚷嚷，压根]]></description>
    </item>
    <item>
      <title><![CDATA[那300兆和1000兆宽带理论下载速度大概多少？]]></title>
      <link>https://7tec.cn/blog/300mbps-vs-1000mbps-speed</link>
      <guid isPermaLink="true">https://7tec.cn/blog/300mbps-vs-1000mbps-speed</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[宽带的理论下载速度可以通过以下公式计算： \text{下载速度 MB/s} = \frac{\text{带宽 Mbps}}{8} 这里将 Mbps（兆比特每秒） 转换为 MB/s（兆字节每秒） ，因为 1 字节 = 8 比特。 1\. 30]]></description>
    </item>
    <item>
      <title><![CDATA[可否同时使用异步与线程？]]></title>
      <link>https://7tec.cn/blog/async-and-threads-together</link>
      <guid isPermaLink="true">https://7tec.cn/blog/async-and-threads-together</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[是的，异步编程 和多线程 可以同时使用，这种组合通常被称为 "异步 + 线程池" 或 "异步 + 多线程" 。这种模式结合了异步编程的高效 I/O 处理能力和多线程的并行计算能力，适用于同时需要高并发 I/O 操作和 CPU 密集型任务的场]]></description>
    </item>
    <item>
      <title><![CDATA[单线程异步如何控制并发量呢？]]></title>
      <link>https://7tec.cn/blog/async-concurrency-control</link>
      <guid isPermaLink="true">https://7tec.cn/blog/async-concurrency-control</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[在单线程异步编程中（如使用 Python 的 asyncio），控制并发量是通过信号量（Semaphore） 或任务队列 来实现的。信号量是一种同步原语，用于限制同时运行的异步任务数量。 以下是具体实现方法和示例代码： 1\. 使用信号量（]]></description>
    </item>
    <item>
      <title><![CDATA[10核20线程cpu使用单线程异步的话通常设置并发量多少合适？]]></title>
      <link>https://7tec.cn/blog/async-concurrency-limit-for-10c20t-cpu</link>
      <guid isPermaLink="true">https://7tec.cn/blog/async-concurrency-limit-for-10c20t-cpu</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[在 10 核 20 线程 的 CPU 上使用单线程异步编程时，设置并发量的合适值需要综合考虑以下因素： 1\. 单线程异步的特点 单线程运行 ：所有任务都在一个线程中运行，无法利用多核 CPU。 高效 I/O 处理 ：异步编程适合 I/O]]></description>
    </item>
    <item>
      <title><![CDATA[使用异步提高并发，是否意味着使用的库必须支持异步才行？drissionpage支持异步吗？]]></title>
      <link>https://7tec.cn/blog/async-library-support-drissionpage</link>
      <guid isPermaLink="true">https://7tec.cn/blog/async-library-support-drissionpage</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[是的，使用异步提高并发的前提是所使用的库必须支持异步 。如果库本身是同步的（如 requests），即使你在异步函数中调用它，也无法实现真正的并发，因为同步操作会阻塞事件循环。 1\. 异步库的要求 异步 I/O ：库必须基于异步 I/O]]></description>
    </item>
    <item>
      <title><![CDATA[单线程异步与多线程异步在下载大批量文件时效率是不是一样的？]]></title>
      <link>https://7tec.cn/blog/async-vs-multithread-bulk-download</link>
      <guid isPermaLink="true">https://7tec.cn/blog/async-vs-multithread-bulk-download</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[单线程异步和多线程异步在下载大批量文件时的效率并不一定相同 ，它们的性能表现取决于具体的场景和硬件条件。以下是详细的分析： 1\. 单线程异步 特点 ： 使用事件循环（如 asyncio）管理多个异步任务。 适合 I/O 密集型任务（如下载]]></description>
    </item>
    <item>
      <title><![CDATA[如何使用asyncio和aiohttp实现大批量pdf文件的爬取任务？并控制并发量为200]]></title>
      <link>https://7tec.cn/blog/asyncio-aiohttp-bulk-pdf-crawler</link>
      <guid isPermaLink="true">https://7tec.cn/blog/asyncio-aiohttp-bulk-pdf-crawler</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[使用 asyncio 和 aiohttp 实现大批量 PDF 文件的爬取任务，并控制并发量为 200，可以通过以下步骤实现： 1\. 实现思路 异步爬取 ：使用 aiohttp 发起异步 HTTP 请求，下载 PDF 文件。 并发控制 ：使]]></description>
    </item>
    <item>
      <title><![CDATA[并发与线程的区别在哪里]]></title>
      <link>https://7tec.cn/blog/concurrency-vs-threading</link>
      <guid isPermaLink="true">https://7tec.cn/blog/concurrency-vs-threading</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[并发 和线程 是两个相关但不同的概念，它们描述了程序执行任务的方式。以下是它们的区别和联系： 1\. 并发（Concurrency） 定义 ：并发是指多个任务在同一时间段内交替执行，但不一定是同时执行。它强调的是任务的逻辑同时性 。 实现方]]></description>
    </item>
    <item>
      <title><![CDATA[如果1个网站每秒请求数限制为100，那么我爬虫的并发量多少合适？]]></title>
      <link>https://7tec.cn/blog/crawler-concurrency-for-100-rps-limit</link>
      <guid isPermaLink="true">https://7tec.cn/blog/crawler-concurrency-for-100-rps-limit</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[如果目标网站的请求速率限制为 每秒 100 次请求（100 RPS） ，那么你需要根据这个限制来合理设置爬虫的并发量。以下是具体的分析和建议： 1\. 理解请求速率限制 100 RPS ：表示目标网站允许每秒最多处理 100 个请求。 限制]]></description>
    </item>
    <item>
      <title><![CDATA[我要爬取并下载网页的pdf文件，如何利用分布式爬虫呢？]]></title>
      <link>https://7tec.cn/blog/distributed-crawler-for-pdf-download</link>
      <guid isPermaLink="true">https://7tec.cn/blog/distributed-crawler-for-pdf-download</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[利用分布式爬虫爬取并下载网页的PDF文件可以显著提升效率，尤其适合大规模任务。以下是实现分布式爬虫的基本步骤和关键技术： 1\. 系统架构设计 主节点（Master） ：负责任务调度、URL管理和节点协调。 工作节点（Worker） ：执行]]></description>
    </item>
    <item>
      <title><![CDATA[分布式爬虫是布曙到多个电脑的吗？]]></title>
      <link>https://7tec.cn/blog/distributed-crawler-multi-machine</link>
      <guid isPermaLink="true">https://7tec.cn/blog/distributed-crawler-multi-machine</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[是的，分布式爬虫通常部署在多个电脑或服务器上，目的是提升爬取效率和扩展性。具体来说： 1. 多节点部署 ：爬虫任务分散到多个节点（电脑或服务器）上执行，每个节点负责一部分任务。 2. 任务协调 ：通过中央调度器或分布式消息队列（如Kafka]]></description>
    </item>
    <item>
      <title><![CDATA[然后主节点和工作节点如何通信的呢？]]></title>
      <link>https://7tec.cn/blog/distributed-crawler-node-communication</link>
      <guid isPermaLink="true">https://7tec.cn/blog/distributed-crawler-node-communication</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[在分布式爬虫系统中，主节点和工作节点之间的通信通常通过消息队列 或分布式任务队列 来实现。以下是常见的通信方式和实现方法： 1\. 通信方式 消息队列 ：主节点将任务（如URL）放入消息队列，工作节点从队列中获取任务并执行。 分布式任务队列]]></description>
    </item>
    <item>
      <title><![CDATA[如何动态调整并发量呢？]]></title>
      <link>https://7tec.cn/blog/dynamic-concurrency-tuning</link>
      <guid isPermaLink="true">https://7tec.cn/blog/dynamic-concurrency-tuning</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[动态调整并发量是指在程序运行过程中，根据当前的任务负载、系统资源或外部条件，实时增加或减少并发任务的数量。在单线程异步编程中（如使用 Python 的 asyncio），可以通过以下方法实现动态调整并发量： 1\. 使用信号量动态调整并发量]]></description>
    </item>
    <item>
      <title><![CDATA[如何查看网站的响应头]]></title>
      <link>https://7tec.cn/blog/how-to-view-http-response-headers</link>
      <guid isPermaLink="true">https://7tec.cn/blog/how-to-view-http-response-headers</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[查看网站的响应头是了解服务器行为的重要步骤，尤其是获取速率限制、缓存策略、内容类型等信息。以下是几种常用的方法来查看网站的响应头： 1\. 使用浏览器的开发者工具 现代浏览器（如 Chrome、Firefox、Edge）都内置了开发者工具，]]></description>
    </item>
    <item>
      <title><![CDATA[目标服务器对单个ip的请求速率有限制，这个请求速率是什么？怎么衡量？]]></title>
      <link>https://7tec.cn/blog/http-request-rate-limit-basics</link>
      <guid isPermaLink="true">https://7tec.cn/blog/http-request-rate-limit-basics</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[目标服务器对单个 IP 的请求速率限制是指服务器在单位时间内允许从一个 IP 地址发起的请求数量的上限。这种限制通常用于防止恶意爬虫或滥用行为，保护服务器的稳定性和资源。 1\. 请求速率的定义 请求速率 ：单位时间内允许的请求数量，通常以]]></description>
    </item>
    <item>
      <title><![CDATA[我电脑有10核心20线程，最大支持多少并发量？]]></title>
      <link>https://7tec.cn/blog/max-concurrency-10c20t</link>
      <guid isPermaLink="true">https://7tec.cn/blog/max-concurrency-10c20t</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[你的电脑有 10 核心 20 线程 ，这意味着它有较强的多任务处理能力。Scrapy 的并发量取决于多个因素，包括硬件资源（CPU、内存、网络带宽）、爬虫的配置以及目标网站的限制。以下是关于如何最大化并发量的分析和建议： 1\. 理论上的最]]></description>
    </item>
    <item>
      <title><![CDATA[我要爬取并下载网页的pdf文件，也需要用数据库吗？]]></title>
      <link>https://7tec.cn/blog/pdf-crawler-database-need</link>
      <guid isPermaLink="true">https://7tec.cn/blog/pdf-crawler-database-need</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[是否需要使用数据库取决于你的具体需求和项目规模。以下是一些考虑因素： 1\. 项目规模 小规模项目 ：如果只需爬取少量PDF文件，且无需长期存储或复杂管理，可以直接将文件保存到本地或云存储，无需数据库。 大规模项目 ：如果需要爬取大量PDF]]></description>
    </item>
    <item>
      <title><![CDATA[如何看请求速率是以秒为单位还是以分钟为单位？]]></title>
      <link>https://7tec.cn/blog/request-rate-unit-seconds-or-minutes</link>
      <guid isPermaLink="true">https://7tec.cn/blog/request-rate-unit-seconds-or-minutes</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[要判断目标服务器的请求速率限制是以秒 为单位还是以分钟 为单位，可以通过以下几种方法来确定： 1\. 查看响应头 许多服务器会在响应头中明确返回速率限制的时间单位。常见的字段包括： \ XRateLimitLimit：允许的最大请求数。 \]]></description>
    </item>
    <item>
      <title><![CDATA[scrapy 都有哪些命令？]]></title>
      <link>https://7tec.cn/blog/scrapy-commands-cheatsheet</link>
      <guid isPermaLink="true">https://7tec.cn/blog/scrapy-commands-cheatsheet</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[Scrapy 提供了丰富的命令行工具，用于创建、运行和管理爬虫项目。以下是一些常用的 Scrapy 命令及其用途： 1\. 全局命令 这些命令可以在任何目录下运行。 命令 | 用途 | scrapy startproject <projec]]></description>
    </item>
    <item>
      <title><![CDATA[用Scrapy怎么写分布式爬虫呢？]]></title>
      <link>https://7tec.cn/blog/scrapy-distributed-crawler-guide</link>
      <guid isPermaLink="true">https://7tec.cn/blog/scrapy-distributed-crawler-guide</guid>
      <pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[使用 Scrapy 实现分布式爬虫时，通常需要结合 Scrapy 的爬虫框架和分布式任务队列（如 Redis ）来实现主节点和工作节点的通信。以下是具体实现步骤和代码示例。 1\. 系统架构 主节点 ：负责生成初始任务（URL）并放入任务队]]></description>
    </item>
  </channel>
</rss>