Skip to content

Commit e83b242

Browse files
committed
feat: 支持playwright通过cdp协议连接本地chrome浏览器
docs: 增加uv来管理python依赖的文档
1 parent fbc9788 commit e83b242

File tree

10 files changed

+991
-52
lines changed

10 files changed

+991
-52
lines changed

README.md

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
目前能抓取小红书、抖音、快手、B站、微博、贴吧、知乎等平台的公开信息。
2222

2323
原理:利用[playwright](https://playwright.dev/)搭桥,保留登录成功后的上下文浏览器环境,通过执行JS表达式获取一些加密参数
24-
通过使用此方式,免去了复现核心加密JS代码,逆向难度大大降低
24+
通过使用此方式,免去了复现核心加密JS代码,逆向难度大大降低
2525

2626
# 功能列表
2727
| 平台 | 关键词搜索 | 指定帖子ID爬取 | 二级评论 | 指定创作者主页 | 登录态缓存 | IP代理池 | 生成评论词云图 |
@@ -52,36 +52,38 @@
5252
# 安装部署方法
5353
> 开源不易,希望大家可以Star一下MediaCrawler仓库!!!!十分感谢!!! <br>
5454
55-
## 创建并激活 python 虚拟环境
56-
> 如果是爬取抖音和知乎,需要提前安装nodejs环境,版本大于等于:`16`即可 <br>
57-
> 新增 [uv](https://github.com/astral-sh/uv) 来管理项目依赖,使用uv来替代python版本管理、pip进行依赖安装,更加方便快捷
58-
```shell
59-
# 进入项目根目录
60-
cd MediaCrawler
61-
62-
# 创建虚拟环境
63-
# 我的python版本是:3.9.6,requirements.txt中的库是基于这个版本的,如果是其他python版本,可能requirements.txt中的库不兼容,自行解决一下。
64-
python -m venv venv
65-
66-
# macos & linux 激活虚拟环境
67-
source venv/bin/activate
55+
## 前置依赖
6856

69-
# windows 激活虚拟环境
70-
venv\Scripts\activate
57+
### uv 安装
58+
> 在进行下一步操作之前, 请确保电脑上已经安装了uv,[uv安装地址](https://docs.astral.sh/uv/getting-started/installation)
59+
>
60+
> uv是否安装成功的验证, 终端输入命令:uv --version 如果正常显示版本好,那证明已经安装成功
61+
>
62+
> 强力安利 uv 给大家使用,简直是最强的python包管理工具
63+
>
7164
72-
```
65+
### nodejs安装
66+
项目依赖nodejs,安装地址:https://nodejs.org/en/download/
67+
> 如果要用python的原生venv来管理环境的话,可以参考: [原生环境管理文档](docs/原生环境管理文档.md)
7368
74-
## 安装依赖库
69+
### python包安装
7570

76-
```shell
77-
pip install -r requirements.txt
78-
```
71+
```shell
72+
# 进入项目目录
73+
cd MediaCrawler
7974

80-
## 安装 playwright浏览器驱动
75+
# 使用 uv sync 命令来保证python版本和相关依赖包的一致性
76+
uv sync
77+
```
8178

82-
```shell
83-
playwright install
84-
```
79+
### 浏览器驱动安装
80+
```shell
81+
# 安装浏览器驱动
82+
playwright install
83+
```
84+
> MediaCrawler目前已经支持使用playwright连接你本地的Chrome浏览器了,一些因为Webdriver导致的问题迎刃而解了。
85+
>
86+
> 目前开放了 xhs 和 dy 这两个使用 cdp 的方式连接本地浏览器,如有需要,查看config/base_config.py中的配置项。
8587
8688
## 运行爬虫程序
8789

@@ -90,24 +92,26 @@
9092
### 一些其他支持项,也可以在config/base_config.py查看功能,写的有中文注释
9193

9294
# 从配置文件中读取关键词搜索相关的帖子并爬取帖子信息与评论
93-
python main.py --platform xhs --lt qrcode --type search
95+
uv run main.py --platform xhs --lt qrcode --type search
9496

9597
# 从配置文件中读取指定的帖子ID列表获取指定帖子的信息与评论信息
96-
python main.py --platform xhs --lt qrcode --type detail
98+
uv run main.py --platform xhs --lt qrcode --type detail
9799

98100
# 打开对应APP扫二维码登录
99101

100102
# 其他平台爬虫使用示例,执行下面的命令查看
101-
python main.py --help
102-
```
103+
uv run main.py --help
104+
```
103105

104106
## 数据保存
105107
- 支持关系型数据库Mysql中保存(需要提前创建数据库)
106108
- 执行 `python db.py` 初始化数据库数据库表结构(只在首次执行)
107109
- 支持保存到csv中(data/目录下)
108110
- 支持保存到json中(data/目录下)
109111

110-
112+
# 项目微信交流群
113+
[加入微信交流群](https://nanmicoder.github.io/MediaCrawler/%E5%BE%AE%E4%BF%A1%E4%BA%A4%E6%B5%81%E7%BE%A4.html)
114+
111115

112116
# 其他常见问题可以查看在线文档
113117
>
@@ -120,10 +124,7 @@
120124
121125
[作者的知识付费栏目介绍](https://nanmicoder.github.io/MediaCrawler/%E7%9F%A5%E8%AF%86%E4%BB%98%E8%B4%B9%E4%BB%8B%E7%BB%8D.html)
122126

123-
# 项目微信交流群
124127

125-
[加入微信交流群](https://nanmicoder.github.io/MediaCrawler/%E5%BE%AE%E4%BF%A1%E4%BA%A4%E6%B5%81%E7%BE%A4.html)
126-
127128
# 感谢下列Sponsors对本仓库赞助支持
128129
<a href="https://www.swiftproxy.net/?ref=nanmi">
129130
<img src="docs/static/images/img_5.png">

base/base_crawler.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from abc import ABC, abstractmethod
1313
from typing import Dict, Optional
1414

15-
from playwright.async_api import BrowserContext, BrowserType
15+
from playwright.async_api import BrowserContext, BrowserType, Playwright
1616

1717

1818
class AbstractCrawler(ABC):
@@ -43,6 +43,19 @@ async def launch_browser(self, chromium: BrowserType, playwright_proxy: Optional
4343
"""
4444
pass
4545

46+
async def launch_browser_with_cdp(self, playwright: Playwright, playwright_proxy: Optional[Dict],
47+
user_agent: Optional[str], headless: bool = True) -> BrowserContext:
48+
"""
49+
使用CDP模式启动浏览器(可选实现)
50+
:param playwright: playwright实例
51+
:param playwright_proxy: playwright代理配置
52+
:param user_agent: 用户代理
53+
:param headless: 无头模式
54+
:return: 浏览器上下文
55+
"""
56+
# 默认实现:回退到标准模式
57+
return await self.launch_browser(playwright.chromium, playwright_proxy, user_agent, headless)
58+
4659

4760
class AbstractLogin(ABC):
4861
@abstractmethod

config/base_config.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,33 @@
4545
# 是否保存登录状态
4646
SAVE_LOGIN_STATE = True
4747

48+
# ==================== CDP (Chrome DevTools Protocol) 配置 ====================
49+
# 是否启用CDP模式 - 使用用户现有的Chrome/Edge浏览器进行爬取,提供更好的反检测能力
50+
# 启用后将自动检测并启动用户的Chrome/Edge浏览器,通过CDP协议进行控制
51+
# 这种方式使用真实的浏览器环境,包括用户的扩展、Cookie和设置,大大降低被检测的风险
52+
ENABLE_CDP_MODE = False
53+
54+
# CDP调试端口,用于与浏览器通信
55+
# 如果端口被占用,系统会自动尝试下一个可用端口
56+
CDP_DEBUG_PORT = 9222
57+
58+
# 自定义浏览器路径(可选)
59+
# 如果为空,系统会自动检测Chrome/Edge的安装路径
60+
# Windows示例: "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
61+
# macOS示例: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
62+
CUSTOM_BROWSER_PATH = ""
63+
64+
# CDP模式下是否启用无头模式
65+
# 注意:即使设置为True,某些反检测功能在无头模式下可能效果不佳
66+
CDP_HEADLESS = False
67+
68+
# 浏览器启动超时时间(秒)
69+
BROWSER_LAUNCH_TIMEOUT = 30
70+
71+
# 是否在程序结束时自动关闭浏览器
72+
# 设置为False可以保持浏览器运行,便于调试
73+
AUTO_CLOSE_BROWSER = True
74+
4875
# 数据保存类型选项配置,支持三种类型:csv、db、json, 最好保存到DB,有排重的功能。
4976
SAVE_DATA_OPTION = "json" # csv or db or json
5077

0 commit comments

Comments
 (0)