少女祈祷中...

Why MediaCrawler

大家好!又是我==,本人最近忙得要死,没有精力去撰写 AUTOGEN 的 blog 了,虽然我也很想哈:),奈何时间实在不允许,有空大伙自己学学吧。今天要介绍的是 MediaCrawler 项目!

背景

最近啊,我忙啥呢?只能说我在和 Prof. He 合作做一个学术项目,需要从小红书上获取大量公开数据。但你知道的,小红书的防爬机制那叫一个严!

传统的爬虫方法,比如 requestsscrapyselenium 等,根本吃不开。复杂的动态加载、加密参数让我摸爬滚打好一阵子。最终还有万能验证码劝退,简直是造孽。

最后,我选择了 MediaCrawler Pro 版本,成功解决了数据抓取的技术难题,并支持 MySQL 数据存储、多账号代理,非常好用!不过 Pro 版本价格不菲,学习成本高,并且需要本地部署后进一步修改。
所以本文的分享仅限于开源版本的mediacrawler 普通版本!

本文将分享如何部署这个神器,并介绍如何通过延迟优化让爬虫更加稳健,不被反爬秒封!✨


部署 MediaCrawler 的完整流程

1. 准备 Python 环境

首先,确保安装以下环境:

  • Python 版本 >= 3.9
  • Node.js 版本 >= 16(部分功能需要)

然后,克隆项目并进入项目目录:

1
2
3
# 克隆项目代码
git clone https://github.com/NanmiCoder/MediaCrawler.git
cd MediaCrawler

创建并激活虚拟环境:

1
2
3
4
5
6
7
8
# 创建虚拟环境
python -m venv venv

# 激活虚拟环境(根据系统选择命令)
# macOS/Linux
source venv/bin/activate
# Windows
venv\Scripts\activate

2. 安装依赖

安装项目所需的依赖:

1
pip install -r requirements.txt

3. 安装 Playwright 浏览器驱动

安装 Playwright 驱动:

1
playwright install

4. 启动爬虫

以下是几个常见的操作示例:

  • 关键词搜索

    1
    python main.py --platform xhs --lt qrcode --type search
  • 指定帖子抓取

    1
    python main.py --platform xhs --lt qrcode --type detail
  • 获取帮助

    1
    python main.py --help

5. 数据存储选项

根据需求选择存储方式:

  • MySQL:推荐将数据存入 MySQL 数据库。

    1
    python db.py  # 初始化数据库表结构
  • CSV/JSON:测试环境可直接保存到本地文件,路径为 data/ 文件夹。


基础配置说明

以下是一些基础的配置代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 基础配置
PLATFORM = "xhs" # 平台选择,例如小红书
KEYWORDS = "编程副业,编程兼职" # 关键词搜索,多个关键词用英文逗号分隔
LOGIN_TYPE = "qrcode" # 登录方式,可选 qrcode(二维码登录)、phone 或 cookie
COOKIES = "" # 如果使用 cookie 登录,可以在此填写
SORT_TYPE = "popularity_descending" # 排序方式,根据平台支持的选项设置
CRAWLER_TYPE = "search" # 爬取类型:关键词搜索、帖子详情或创作者主页数据
UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36' # 自定义 User Agent

# 数据存储类型,支持 csv、db 或 json
SAVE_DATA_OPTION = "json"

# 并发爬取数量
MAX_CONCURRENCY_NUM = 1

# 是否开启代理和图片、评论爬取
ENABLE_IP_PROXY = False
ENABLE_GET_IMAGES = False
ENABLE_GET_COMMENTS = True

# 爬取数量限制
CRAWLER_MAX_NOTES_COUNT = 200
CRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES = 10

# 爬取的起始页数
START_PAGE = 1

以上配置提供了灵活性,可以根据项目需求进行调整。


如何优化延迟,避免账号封禁

爬虫最怕啥?就是被封号!为了减少被目标网站发现的风险,我针对源码增加了随机延迟,效果显著。

文件路径

E:\MediaCrawler-main\media_platform\xhs\core.py

修改内容

1. 在 get_note_detail_async_task 方法中加入延迟

找到以下代码段:

1
2
3
4
5
6
if not note_detail_from_html:
note_detail_from_html = (
await self.xhs_client.get_note_by_id_from_html(
note_id, xsec_source, xsec_token, enable_cookie=False
)
)

在该段代码之后,插入以下延迟代码:

1
2
3
# 添加随机延迟,模拟用户行为
delay = random.uniform(1, 3) # 随机延迟 1 到 3 秒
time.sleep(delay)

修改后代码如下:

1
2
3
4
5
6
7
8
9
if not note_detail_from_html:
note_detail_from_html = (
await self.xhs_client.get_note_by_id_from_html(
note_id, xsec_source, xsec_token, enable_cookie=False
)
)
# 添加随机延迟,模拟用户行为
delay = random.uniform(1, 3) # 随机延迟 1 到 3 秒
time.sleep(delay)

2. 在 get_comments 方法中加入延迟

找到以下代码段:

1
2
3
4
5
6
7
await self.xhs_client.get_note_all_comments(
note_id=note_id,
xsec_token=xsec_token,
crawl_interval=crawl_interval,
callback=xhs_store.batch_update_xhs_note_comments,
max_count=CRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES,
)

在代码执行前,加入延迟:

1
2
3
# 添加随机延迟,防止评论请求过于频繁
delay = random.uniform(2, 5) # 随机延迟 2 到 5 秒
time.sleep(delay)

修改后代码如下:

1
2
3
4
5
6
7
8
9
10
11
# 添加随机延迟,防止评论请求过于频繁
delay = random.uniform(2, 5) # 随机延迟 2 到 5 秒
time.sleep(delay)

await self.xhs_client.get_note_all_comments(
note_id=note_id,
xsec_token=xsec_token,
crawl_interval=crawl_interval,
callback=xhs_store.batch_update_xhs_note_comments,
max_count=CRAWLER_MAX_COMMENTS_COUNT_SINGLENOTES,
)

3. 在 fetch_creator_notes_detail 方法中加入延迟

找到以下代码段:

1
note_details = await asyncio.gather(*task_list)

在代码之前加入延迟:

1
2
3
# 为每个任务列表添加延迟,避免触发反爬机制
delay = random.uniform(1, 4) # 随机延迟 1 到 4 秒
time.sleep(delay)

修改后代码如下:

1
2
3
4
5
# 为每个任务列表添加延迟,避免触发反爬机制
delay = random.uniform(1, 4) # 随机延迟 1 到 4 秒
time.sleep(delay)

note_details = await asyncio.gather(*task_list)

声明

⚠️ 声明:

本代码及其优化仅供学习和研究目的使用。使用者需严格遵守以下原则:

  1. 不得用于商业用途
  2. 合理控制请求频率,避免对目标平台造成运营干扰。
  3. 遵守目标平台的使用条款和 robots.txt 规则

通过以上部署和优化,你的爬虫将更加稳定并降低被封禁的风险。希望这些经验对你有所帮助!🤗