<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>爬虫 on Fanssen Notes</title>
    <link>https://makismkuous-bot.github.io/tags/%E7%88%AC%E8%99%AB/</link>
    <description>Recent content in 爬虫 on Fanssen Notes</description>
    <image>
      <title>Fanssen Notes</title>
      <url>https://makismkuous-bot.github.io/</url>
      <link>https://makismkuous-bot.github.io/</link>
    </image>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sat, 23 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://makismkuous-bot.github.io/tags/%E7%88%AC%E8%99%AB/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>MediaCrawler：小红书数据采集实战</title>
      <link>https://makismkuous-bot.github.io/posts/mediacrawler-practice/</link>
      <pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate>
      <guid>https://makismkuous-bot.github.io/posts/mediacrawler-practice/</guid>
      <description>&lt;h2 id=&#34;为什么需要爬取小红书数据&#34;&gt;为什么需要爬取小红书数据&lt;/h2&gt;
&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;h2 id=&#34;选型考量为什么是-mediacrawler&#34;&gt;选型考量：为什么是 MediaCrawler&lt;/h2&gt;
&lt;p&gt;爬虫工具其实不少，但针对小红书这种有反爬机制的平台，开箱即用的不多。&lt;/p&gt;
&lt;p&gt;我之前试过自己写 requests 加代理池的方案，听起来很酷，实际跑起来全是坑。小红书的风控做得很细，光是登录这一关就能折腾一整天。好不容易爬上去了，发几个请求就被封了。维护成本太高，不适合做长期的数据收集。&lt;/p&gt;
&lt;p&gt;后来在 GitHub 上看到了 MediaCrawler，试用了一下，感觉最大的优势是：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;多平台支持&lt;/strong&gt;。它不只能爬小红书，还支持抖音、B 站、微博。同一个工具，改一下参数就能切换平台。对我这种可能以后要做多平台内容的人来说，学一个工具就够了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;登录和 Cookie 管理已经处理好了&lt;/strong&gt;。MediaCrawler 通过浏览器模拟登录，把登录状态持久化。我只需要第一次手动扫码登录，后续的请求都会自动携带有效的 Cookie。这部分是很多爬虫工具没有做好的地方。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据输出格式规范&lt;/strong&gt;。数据以 JSONL 格式输出，每行一个完整的 JSON 对象。后续无论是做统计分析还是训练模型，处理起来都很方便。&lt;/p&gt;
&lt;h2 id=&#34;部署和配置的全过程&#34;&gt;部署和配置的全过程&lt;/h2&gt;
&lt;p&gt;说回到部署，其实过程不算复杂，但有几个坑值得记下来。&lt;/p&gt;
&lt;h3 id=&#34;环境准备&#34;&gt;环境准备&lt;/h3&gt;
&lt;p&gt;MediaCrawler 基于 Python，依赖管理用的是 pip。我是在 macOS 上跑的，步骤大概是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/NanmiCoder/MediaCrawler.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd MediaCrawler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install -r requirements.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;依赖比较多，建议用虚拟环境。我一开始直接在全局环境装，结果跟已有的包版本冲突了，折腾了半天。后来用 conda 新建了一个环境，一步到位。&lt;/p&gt;
&lt;h3 id=&#34;浏览器驱动的配置&#34;&gt;浏览器驱动的配置&lt;/h3&gt;
&lt;p&gt;MediaCrawler 需要配合浏览器驱动来模拟登录。如果你机器上已经装了 Chrome，它会自动检测。但有些 macOS 用户会遇到 chromedriver 版本不匹配的问题。&lt;/p&gt;
&lt;p&gt;解决方法也不复杂，去 Chrome 的关于页面看一下当前版本，然后到 chromedriver 官网下载对应的版本，放到 &lt;code&gt;/usr/local/bin&lt;/code&gt; 下就行。&lt;/p&gt;
&lt;h3 id=&#34;首次登录&#34;&gt;首次登录&lt;/h3&gt;
&lt;p&gt;第一次运行需要扫码登录。执行爬虫命令后，终端会弹出一个浏览器窗口，你打开小红书，扫一下二维码，登录成功后窗口会自动关闭，之后的请求就会一直保持登录状态。&lt;/p&gt;
&lt;p&gt;这一步要注意的是：&lt;strong&gt;不要中途关闭浏览器窗口&lt;/strong&gt;。我第一次跑的时候以为登录完就可以关了，结果爬虫报错说找不到登录状态。后来才知道，程序要等到浏览器自动关闭才算完整走完登录流程。&lt;/p&gt;
&lt;h2 id=&#34;使用过程中遇到的坑和解决方案&#34;&gt;使用过程中遇到的坑和解决方案&lt;/h2&gt;
&lt;h3 id=&#34;浏览器的缓存问题&#34;&gt;浏览器的缓存问题&lt;/h3&gt;
&lt;p&gt;这是我在使用过程中遇到的第一个坑，也是最容易忽略的一个。&lt;/p&gt;
&lt;p&gt;每次修改关键词或者筛选条件之后，需要清理浏览器的缓存数据。如果不清理，爬虫仍然会使用上次的缓存，抓回来的数据跟没换关键词之前一样。&lt;/p&gt;</description>
    </item>
    <item>
      <title>对比了几款网页爬虫，我选了 Crawl4AI</title>
      <link>https://makismkuous-bot.github.io/posts/crawl4ai-experience/</link>
      <pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate>
      <guid>https://makismkuous-bot.github.io/posts/crawl4ai-experience/</guid>
      <description>&lt;h2 id=&#34;爬虫工具的选择&#34;&gt;爬虫工具的选择&lt;/h2&gt;
&lt;p&gt;写爬虫的需求大多数人都会遇到——想从某个网站上抓取一些内容做分析。&lt;/p&gt;
&lt;p&gt;传统的爬虫工具大致分两类。一类是 Scrapy 这样的完整框架，功能强大，但配置复杂。写一个简单的抓取任务可能需要定义 Item、Pipeline、Middleware 等多个组件。另一类是 Requests + BeautifulSoup 的组合，上手简单，但遇到 JavaScript 渲染的页面就无能为力了。&lt;/p&gt;
&lt;p&gt;Crawl4AI 的出现填补了两者之间的空白。它的定位是&amp;quot;专为 LLM 时代设计的爬虫工具&amp;quot;。&lt;/p&gt;
&lt;h2 id=&#34;为什么选-crawl4ai&#34;&gt;为什么选 Crawl4AI&lt;/h2&gt;
&lt;p&gt;最大的理由是它对 JavaScript 渲染的支持。现在的网页大部分是前后端分离的，数据通过异步请求加载，页面最终内容由 JavaScript 渲染生成。如果用传统爬虫去抓取这类网站，拿到的是空的 HTML 骨架，真正的数据根本不在这里。&lt;/p&gt;
&lt;p&gt;Crawl4AI 内置了浏览器引擎，会自动执行页面上的 JavaScript，等页面完全渲染后再提取内容。这意味着你不必为了一个需要 JS 渲染的页面去额外配置 Selenium 或 Playwright。&lt;/p&gt;
&lt;p&gt;另外，它的默认输出格式是 Markdown。这个细节在实际使用中很实用——抓取到的内容可以直接喂给 LLM 做分析，省去了格式转换的步骤。&lt;/p&gt;
&lt;h2 id=&#34;安装和基本使用&#34;&gt;安装和基本使用&lt;/h2&gt;
&lt;p&gt;Crawl4AI 的安装很简单，一行命令搞定：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install crawl4ai
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;装完之后跑一个小例子试试：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; crawl4ai &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; WebCrawler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crawler &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; WebCrawler()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; crawler&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;run(url&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://example.com&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(result&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;markdown)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;默认输出就是 Markdown，干净整洁。如果你需要原始 HTML，也可以拿到：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(result&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;html)        &lt;span style=&#34;color:#75715e&#34;&gt;# 原始 HTML&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(result&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;extracted_content)  &lt;span style=&#34;color:#75715e&#34;&gt;# 提取后的内容&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;更高级的抓取配置&#34;&gt;更高级的抓取配置&lt;/h2&gt;
&lt;p&gt;实际项目里，一条 URL 裸跑往往不够。Crawl4AI 提供了丰富的配置选项，这里分享几个常用的场景。&lt;/p&gt;
&lt;h3 id=&#34;设置超时和等待&#34;&gt;设置超时和等待&lt;/h3&gt;
&lt;p&gt;有的页面加载很慢，尤其是那些带大量图片和图表的网站。可以给爬虫指定最长等待时间：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; crawler&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;run(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    url&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://example.com/slow-page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    wait_until&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;networkidle&amp;#34;&lt;/span&gt;,   &lt;span style=&#34;color:#75715e&#34;&gt;# 等待网络请求空闲&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    timeout&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;                  &lt;span style=&#34;color:#75715e&#34;&gt;# 最长等 30 秒&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;wait_until&lt;/code&gt; 参数有几个选项：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
