python

Python 爬虫实战:从 API 请求到浏览器模拟的全链路探索

2026-07-01 #python#爬虫#数据采集#数据分析#requests#DrissionPage#JSONP解析#XML解析#反爬策略#浏览器模拟#数据包监听#Cookie认证

本文基于四个真实爬虫项目——淘宝商品评论、B站视频弹幕、B站视频评论区、京东商品评论,从代码实现到运行结果,系统梳理了 Python 爬虫开发的核心技术与实战踩坑经验。


1. 项目概览

本文涉及的四个爬虫项目覆盖了从简单 API 请求到复杂浏览器模拟的全链路技术栈:

项目 目标平台 核心技术 数据格式 反爬难度
淘宝商品评论 淘宝 H5 API requests + JSONP 解析 CSV ⭐⭐⭐⭐⭐
B站视频弹幕 B站 API + XML requests + lxml + pandas CSV + 词云图 ⭐⭐
B站视频评论区 B站 WBI API requests + Cookie 认证 JSON ⭐⭐⭐
京东商品评论 京东 Web API DrissionPage 浏览器模拟 JSON ⭐⭐⭐⭐

2. 爬虫技术分类与选型

2.1 两大技术路线

根据目标网站的防护强度,爬虫技术大致分为两条路线:

路线 A:轻量级 API 请求

直接通过 requests 库向目标网站的公开/半公开 API 发送 HTTP 请求,获取 JSON/XML 格式的结构化数据。适用于反爬机制较弱的平台(如 B站弹幕接口)。

1
2
3
import requests
response = requests.get(url, headers=headers)
data = response.json()

路线 B:浏览器模拟(Browser Automation)

通过 DrissionPageSelenium 等工具启动真实浏览器,模拟用户操作(点击、翻页),同时监听浏览器与服务器之间的网络数据包,截取 API 响应。适用于反爬机制极强的平台(如京东、淘宝)。

1
2
3
4
5
6
from DrissionPage import ChromiumPage
dp = ChromiumPage()
dp.listen.start('https://api.m.jd.com/...')
dp.get(url)
dp.ele('css:#detail > div.tab-main.large > ul > li:nth-child(5)').click()
json_data = dp.listen.wait().response.body

2.2 选型决策树

1
2
3
4
5
6
7
8
9
目标网站是否有强签名/加密参数?
├── 否 → 路线 A(requests 直调)
│ └── 数据是否需要 JS 执行才能获取?
│ ├── 否 → requests + 正则/JSON解析
│ └── 是 → 仍可尝试 API 逆向
└── 是 → 路线 B(浏览器模拟)
└── 是否需要大量并发?
├── 否 → 单线程 DrissionPage
└── 是 → 多线程 DrissionPage + ThreadPoolExecutor

3. 淘宝商品评论爬虫——JSONP 解析与反爬对抗

3.1 技术背景

淘宝的移动端 H5 API(h5api.m.taobao.com)返回商品评论数据,但格式为 JSONP——即在标准 JSON 外面包裹一层回调函数名:

1
mtopjsonp14({"api":"mtop.taobao.rate.detaillist.get","data":{...}})

这种格式是为浏览器跨域请求设计的,但给爬虫解析带来了额外的处理步骤。

3.2 JSONP 解析核心代码

1
2
3
4
5
6
7
8
9
import re
import json

# 使用正则表达式去除 JSONP 包装,提取纯 JSON 字符串
match = re.search(r'mtopjsonp\d+\((.*)\)', response, re.S)
if match:
json_str = match.group(1)
data = json.loads(json_str)
rateList = data["data"]["rateList"]

关键点:

  • re.S 标志使 . 匹配换行符,因为 JSONP 数据可能跨多行
  • \d+ 匹配回调函数名中的数字部分(如 mtopjsonp14),应对不同回调名
  • (.*) 提取括号内的 JSON 数据

3.3 反爬困境与应对

淘宝 API 的请求 URL 中包含了多个签名参数:

1
?jsv=2.7.4&appKey=12574478&t=1759197367103&sign=e9f8bf5ab8b1d56e790015b88a2fb02a

其中 sign 是基于时间戳 t 和 Token 动态计算的签名,_m_h5_tk_m_h5_tk_enc 也是通过 Cookie 传递的动态令牌。这意味着:

  1. 签名参数无法静态构造——每次请求都需要根据当前时间戳和 Token 重新计算
  2. Token 会过期——Cookie 中的 _m_h5_tk 有时效性,过期后请求会被拒绝

实际应对策略:由于签名算法难以逆向,项目最终采用了一种务实的做法——将一次成功请求的真实响应数据保存为字符串变量,直接解析:

1
2
3
# 爬下来的淘宝商品真实的评论JSONP响应数据
# 因为后面这里被反爬了,所以只能把真实的数据粘贴在这里,然后再进行解析
response = 'mtopjsonp14({"api":"mtop.taobao.rate.detaillist.get","data":{...}})'

3.4 数据解析与 CSV 存储

从评论数据中提取了 18 个维度的字段:

1
2
3
4
5
6
fieldnames = [
'评论ID', '用户昵称', '信用等级', '用户星级', '评论内容',
'评论日期', '创建时间', '时间间隔', '机身颜色', '网络类型',
'版本类型', '套餐类型', '存储容量', '点赞数', '评论数',
'阅读数', '图片数量', '是否回头客'
]

运行结果示例(CSV 文件内容):

评论ID 用户昵称 评论内容 评论日期 机身颜色 点赞数 是否回头客
1284684257912 天**质 非常不错,很流畅,不卡顿 2025年9月26日 黑旋风 0
1284620079018 雅**8 过些天就带回去给奶奶用了 2025年9月25日 乳白色 1

3.5 单条评论数据结构详解

通过手动创建的单条评论 JSON 文件,可以清晰地看到淘宝评论 API 返回的完整数据结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"id": "1284684257912",
"feedback": "非常不错,很流畅,不卡顿,刷视频也很方便",
"feedbackDate": "2025年9月26日",
"userNick": "天**质",
"creditLevel": "11",
"userStar": "9",
"skuMap": {
"机身颜色": "黑旋风 【i16 PRO MAX免费试用-质保5年】",
"网络类型": "5G全网通",
"存储容量": "16GB+1024GB"
},
"interactInfo": {
"likeCount": "0",
"commentCount": "1",
"readCount": "129"
},
"repeatBusiness": "true",
"feedPicList": []
}

踩坑记录:淘宝的 skuMap 是一个非常实用的字段,它将评论与具体的商品规格关联起来,使得评论分析可以按颜色、容量等维度分组统计。


4. B站视频弹幕爬虫——XML 解析与数据可视化

4.1 技术背景

B站的弹幕数据通过 XML 格式返回,每个弹幕是一个 <d> 元素,其 p 属性包含了弹幕的元信息:

1
<d p="1.469,5,25,16777215,1758369281,0,85ccfef9,1940101167245884928">寄明月?(关注点错误)</d>

p 属性的 8 个字段依次为:出现时间、弹幕类型、字体大小、颜色值、发送时间戳、弹幕池、用户哈希、弹幕ID。

4.2 两步获取流程

B站弹幕的获取分为两步:

第一步:获取视频分 P 的 cid

1
2
3
4
cid_api = f"https://api.bilibili.com/x/player/pagelist?bvid={BVID}&jsonp=jsonp"
response = requests.get(cid_api, headers=HEADERS)
cid_data = response.json()
pages = cid_data['data'] # 每个元素对应一个分 P

第二步:根据 cid 获取弹幕 XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
danmu_url = f"https://comment.bilibili.com/{cid}.xml"
xml_response = requests.get(danmu_url, headers=HEADERS)
root = etree.fromstring(xml_text.encode('utf-8'))
for d in root.xpath("//d"):
p_attr = d.attrib["p"].split(",")
danmus.append({
"time_in_video": float(p_attr[0]), # 弹幕出现时间(秒)
"mode": int(p_attr[1]), # 弹幕类型(1=滚动, 4=底部, 5=顶部)
"font_size": int(p_attr[2]), # 字体大小
"color": int(p_attr[3]), # 颜色RGB值
"send_time": p_attr[4], # 发送时间戳
"user_hash": p_attr[6], # 用户哈希
"content": d.text # 弹幕文本
})

4.3 代码演进:从脚本到函数化

项目中可以看到明显的代码演进过程:

Demo001 版——脚本式写法,所有逻辑平铺在主流程中:

1
2
3
4
5
6
7
# 直接发送请求
response = requests.get(cid_api, headers=HEADERS)
cid_data = response.json()
pages = cid_data['data']
# 直接遍历
for page in pages:
...

公孙田浩版——函数化重构,增加异常处理和超时控制:

1
2
3
4
5
6
7
8
9
10
11
12
13
def fetch_cid_list(bvid):
"""根据 BV 号获取所有分 P 的 cid 列表"""
try:
response = requests.get(cid_api, headers=headers, timeout=10)
response.raise_for_status()
return response.json()['data']
except requests.exceptions.RequestException as e:
print("请求 cid 列表失败:", str(e))
raise

def fetch_danmu_for_cid(cid, page_index):
"""根据 cid 获取指定分 P 的弹幕数据"""
...

数据标注版——集成弹幕 + 评论 + 词云的完整工作流:

1
2
3
4
# 主流程包含 7 个步骤
if __name__ == "__main__":
# 步骤1: 获取CID → 步骤2: 获取弹幕 → 步骤3: 保存CSV
# 步骤4: 获取评论 → 步骤5: 保存JSON → 步骤6: 生成弹幕词云 → 步骤7: 生成评论词云

4.4 运行结果示例

弹幕 CSV 文件输出(BV1wbpRzaEhz 视频):

page time_in_video mode send_time content
1 1.469 5 1758369281 寄明月?(关注点错误)
1 27.593 5 1758388834 赛博坦音效绷不住
1 177.851 1 1758374485 “兄弟们”
1 278.327 1 1758372852 法律真的要严了

踩坑记录:Windows CMD 下输出中文弹幕容易遇到 UnicodeEncodeError,解决方案是用 gbk 编码做 fallback:item.encode('gbk', errors='replace').decode('gbk')

4.5 数据可视化——词云生成

数据标注版项目集成了词云分析功能,使用 jieba 分词 + WordCloud 生成可视化词云:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from wordcloud import WordCloud
import jieba

# 使用 jieba 分词
text = ' '.join(text_list)
words = jieba.cut(text)
word_string = ' '.join(words)

# 创建词云
wordcloud = WordCloud(
font_path='simhei.ttf', # 中文字体(黑体)
width=1920,
height=1080,
background_color='white',
max_words=200,
).generate(word_string)

plt.savefig(output_path, dpi=300, bbox_inches='tight')

关键注意点:

  • font_path 必须指定中文字体文件,否则中文词云会显示为方块
  • simhei.ttf 是 Windows 系统自带的黑体字体,位于 C:\Windows\Fonts\ 目录
  • 输出 DPI 设为 300,确保高清词云图

5.1 技术背景

B站评论区使用了 WBI 签名机制(w_rid + wts),这是 B站较新的反爬措施。API URL 中包含了签名参数:

1
2
https://api.bilibili.com/x/v2/reply/wbi/main?oid=...&type=1&mode=3
&w_rid=f3f3779e36f2e7dee6095fd18cd0b3b6&wts=1774276504

5.2 基础版 vs 优化版

基础版(B站视频评论爬虫.py):

1
2
3
4
5
6
7
8
9
10
11
12
13
import json
import random
import requests

# 随机选择 User-Agent
headers = {
'User-Agent': random.choice(user_agents),
'Cookie': '...'
}
response = requests.get(url=Url, headers=headers)
jsonData = response.json()
with open('b站评论.json', 'w', encoding='utf-8') as f:
json.dump(jsonData, f, ensure_ascii=False, indent=4)

特点:代码简洁直接,但缺少错误处理和灵活性。

AI 优化版(B站视频评论爬虫AI优化.py):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 从环境变量中读取配置(避免硬编码敏感信息)
api_url = os.getenv('BILIBILI_API_URL', '默认URL')
cookie = os.getenv('BILIBILI_COOKIE', '默认Cookie')

try:
response = requests.get(url=api_url, headers=headers)
if response.status_code == 200:
jsonData = response.json()
timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
filename = f'b站评论_{timestamp}.json'
with open(filename, 'w', encoding='utf-8') as f:
json.dump(jsonData, f, ensure_ascii=False, indent=4)
except requests.RequestException as e:
print(f"请求过程中发生错误: {e}")
except json.JSONDecodeError as e:
print(f"JSON解析失败: {e}")

优化点总结:

改进项 基础版 优化版
配置管理 硬编码在代码中 os.getenv 环境变量
错误处理 三层 try-except
文件命名 固定名称 动态时间戳命名
状态码检查 if response.status_code == 200

5.3 运行结果

评论区 JSON 文件包含了丰富的结构化数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"code": 0,
"data": {
"cursor": {
"all_count": 933,
"is_end": false,
"next": 391
},
"replies": [
{
"rpid": 250253274320,
"member": {
"uname": "书星尘"
},
"content": { "message": "..." },
"like": 0,
"rcount": 0,
"ctime": 1734746355
}
]
}
}

踩坑记录:B站评论 API 的 oid 参数需要传视频的 cid(而非 aid),需要先通过分 P 接口获取 cid 再拼接评论 URL。这一点在数据标注版项目中已经正确处理。

5.4 User-Agent 随机轮换

两个版本都使用了 User-Agent 池来降低被封风险:

1
2
3
4
5
6
7
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0.4472.124',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Chrome/91.0.4472.114',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/605.1.15',
...
]
headers = {'User-Agent': random.choice(user_agents)}

这是一种低成本的反爬对策,比单一固定 User-Agent 更难被识别为机器人流量。


6. 京东商品评论爬虫——浏览器模拟与数据包监听

6.1 为什么选择浏览器模拟

京东商品评论 API 具有极强的反爬保护:

  • API URL 中包含复杂的加密参数
  • 需要 JavaScript 执行才能生成正确的请求签名
  • 评论数据只在用户点击”评价”标签后才加载

因此,简单的 requests 直调方案无法工作,必须走浏览器模拟路线。

6.2 DrissionPage 简介

DrissionPage 是一个国产的浏览器自动化库,相比 Selenium 有以下优势:

  • 内置数据包监听:可以直接截获浏览器与服务器之间的 API 响应,无需再解析页面 HTML
  • 更简洁的 API:元素定位和操作更加直观
  • 更快的执行速度:无需通过 WebDriver 中间层

6.3 核心技术:数据包监听

这是本项目最关键的技术点——不解析页面 DOM,而是监听浏览器发出的网络请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
from DrissionPage import ChromiumPage

dp = ChromiumPage()
# 指定要监听的 API URL
dp.listen.start('https://api.m.jd.com/?appid=item-v3&functionId=pc_club_productPageComments')

# 访问商品页面并点击评论标签
dp.get(Url)
dp.ele('css:#detail > div.tab-main.large > ul > li:nth-child(5)').click()

# 等待监听到数据包,直接获取响应 JSON
resp = dp.listen.wait()
json_data = resp.response.body

工作原理:

1
2
3
浏览器加载页面 → 用户点击评论标签 → 触发 AJAX 请求

DrissionPage 监听到匹配的请求 → 截获响应体 → 直接获取 JSON 数据

这种方式的优势在于:

  1. 绕过签名参数——浏览器自己生成了正确的请求参数,爬虫只需截获结果
  2. 数据格式干净——直接获取 API 返回的 JSON,无需从 HTML 中提取
  3. 操作自然——模拟真实用户行为,点击翻页按钮触发数据加载

6.4 翻页与多页爬取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
while current_page < max_pages:
resp = dp.listen.wait()
json_data = resp.response.body
# 解析评论数据
all_comments.extend(data['comments'])

# 查找并点击"下一页"按钮
next_button = dp.ele('css:#comment-0 > div.com-table-footer > div > div > a.ui-pager-next')
if next_button and not next_button.attr('class').find('disabled') != -1:
next_button.click()
time.sleep(2)
current_page += 1
else:
break

6.5 多线程加速版本

项目中还开发了多线程版本,使用 ThreadPoolExecutor 并行爬取多个页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from concurrent.futures import ThreadPoolExecutor, as_completed

def fetch_comments(page_number):
dp = ChromiumPage()
dp.listen.start('https://api.m.jd.com/...')
dp.get(Url)
# 跳转到指定页数
if page_number > 1:
for _ in range(page_number - 1):
next_button.click()
time.sleep(2)
resp = dp.listen.wait()
# ... 解析数据
dp.close()
return all_comments

with ThreadPoolExecutor(max_workers=5) as executor:
future_to_page = {executor.submit(fetch_comments, page): page
for page in range(1, max_pages + 1)}
for future in as_completed(future_to_page):
comments = future.result()
all_comments.extend(comments)

注意事项:多线程浏览器模拟意味着同时开启多个 Chrome 实例,内存消耗较大。max_workers=5 是一个合理的折中值。

6.6 运行结果

京东评论 JSON 数据的字段非常丰富,包含 30+ 个维度:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"id": 20344226115,
"content": "发货很快,格子很大,气质很软,纸张也厚...",
"creationTime": "2024-01-09 13:43:37",
"score": 5,
"usefulVoteCount": 17,
"replyCount": 2,
"imageCount": 7,
"productColor": "...",
"productSize": "...",
"nickname": "...",
"plusAvailable": 201,
"userClient": 4,
"location": "..."
}

6.7 浏览器配置

使用前需要指定 Chrome 浏览器路径:

1
2
3
from DrissionPage import ChromiumOptions
path = r'C:\Program Files\Google\Chrome\Application\chrome.exe'
ChromiumOptions().set_browser_path(path).save()

这是一次性配置,保存后后续运行无需重复设置。


7. 数据存储策略对比

四个项目使用了不同的数据存储格式,各有适用场景:

7.1 CSV 格式(淘宝评论、B站弹幕)

优点:

  • 人类可读,可用 Excel 直接打开
  • 结构化表格数据,适合字段固定的场景
  • utf-8-sig 编码确保 Excel 打开中文不乱码
1
2
3
4
5
6
7
8
9
10
# 淘宝评论:使用 DictWriter 写入结构化数据
with open(csv_filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for rate in rate_list:
writer.writerow(row_data)

# B站弹幕:使用 pandas DataFrame 快速导出
df = pd.DataFrame(danmus)
df.to_csv(OUTPUT_CSV, index=False, encoding="utf-8-sig")

7.2 JSON 格式(B站评论、京东评论)

优点:

  • 保留原始数据层级结构
  • 适合嵌套字段(如评论中的图片列表、回复列表)
  • ensure_ascii=False + indent=4 使中文可读且格式美观
1
2
with open(filename, 'w', encoding='utf-8') as f:
json.dump(jsonData, f, ensure_ascii=False, indent=4)

7.3 选择建议

场景 推荐格式 原因
扁平数据(评论列表) CSV 表格直观,Excel 可直接分析
层级数据(嵌套评论+图片) JSON 保留完整结构,便于二次处理
时序数据(弹幕出现时间) CSV 便于按时间排序和统计
最终展示/分享 JSON 格式美观,语义完整

8. 反爬机制与应对策略总结

8.1 四大反爬手段

反爬类型 实例 难度
动态签名 淟宝 _m_h5_tk + sign 极高
WBI 签名 B站 w_rid + wts
Cookie 认证 B站 SESSDATA
JS 动态渲染 京东评论页面

8.2 应对策略矩阵

策略 适用场景 项目实例
Cookie + User-Agent 模拟 低防护 API B站弹幕、评论区
JSONP 正则剥离 JSONP 格式响应 淘宝评论
浏览器数据包监听 JS 加密签名 京东评论
数据快照保存 无法持续请求 淘宝评论(硬编码响应)
多线程并发加速 大量数据爬取 京东评论多线程版
请求间隔控制 避免频率封禁 数据标注版 time.sleep(1)

8.3 实战经验

  1. 先抓包再写代码:使用浏览器 DevTools 的 Network 面板分析真实请求,比直接猜 API 参数高效得多
  2. Cookie 会过期:所有涉及 Cookie 的爬虫都需要定期更新,建议通过环境变量注入而非硬编码
  3. 签名参数是最大障碍:淘宝的 sign、B站的 w_rid 等动态签名是爬虫的核心难点,浏览器模拟是最可靠的绕过方式
  4. 不要一味追求完美:淘宝评论项目最终采用了”数据快照”策略——虽然无法实时爬取,但至少完成了数据解析和存储的完整流程

9. 数据分析与可视化

9.1 词云分析

数据标注版项目展示了从原始弹幕数据到可视化词云的完整流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 步骤 1: jieba 中文分词
text = ' '.join(danmu_texts)
words = jieba.cut(text)
word_string = ' '.join(words)

# 步骤 2: WordCloud 生成词云
wordcloud = WordCloud(
font_path='simhei.ttf',
width=1920, height=1080,
max_words=200,
).generate(word_string)

# 步骤 3: matplotlib 渲染保存
plt.figure(figsize=(19.2, 10.8))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.savefig(output_path, dpi=300, bbox_inches='tight')

9.2 评论数据的多维分析

淘宝评论 CSV 数据支持按 SKU 维度分组分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd

df = pd.read_csv('taobao_reviews_20250930_104357.csv')

# 按机身颜色分组统计平均阅读数
color_stats = df.groupby('机身颜色')['阅读数'].mean()

# 统计回头客比例
repeat_rate = df['是否回头客'].value_counts(normalize=True)

# 评论内容长度分布
df['评论长度'] = df['评论内容'].str.len()
length_stats = df['评论长度'].describe()

9.3 弹幕时序分析

B站弹幕的 time_in_video 字段支持按视频播放时间线分析弹幕密度:

1
2
3
4
5
6
7
8
9
df = pd.read_csv('BV1wbpRzaEhz_danmu.csv')

# 按视频时间区间统计弹幕密度
df['time_bucket'] = pd.cut(df['time_in_video'], bins=20)
density = df.groupby('time_bucket').size()

# 按弹幕类型统计比例
mode_dist = df['mode'].value_counts()
# mode=1(滚动), mode=4(底部), mode=5(顶部)

10. 技术演进路线与最佳实践

10.1 从这四个项目看到的演进轨迹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Level 1: 纯 API 请求 + 简单解析
(B站弹幕 Demo001, B站评论基础版)

Level 2: 函数化重构 + 异常处理
(B站弹幕 公孙田浩版, B站评论 AI优化版)

Level 3: 浏览器模拟 + 数据包监听
(京东评论爬虫)

Level 4: 完整工作流 + 数据可视化
(B站数据标注版: 弹幕+评论+词云)

Level 5: 多线程并发 + 大规模数据
(京东评论多线程版)

10.2 最佳实践清单

  1. 永远先抓包——用 DevTools 或 Fiddler 分析真实请求,搞清楚 URL、参数、响应格式
  2. 配置外置——Cookie、URL 等敏感配置通过环境变量注入,避免硬编码和泄露
  3. 错误处理三层防护——网络层(RequestException)、解析层(JSONDecodeError/XMLSyntaxError)、业务层(字段缺失/格式异常)
  4. 数据存储选格式——扁平数据用 CSV,嵌套数据用 JSON,始终用 utf-8-sig/utf-8 编码
  5. 请求频率控制——time.sleep() 加间隔,避免触发频率封禁
  6. User-Agent 轮换——维护一个 UA 池,每次请求随机选择
  7. 数据包监听优于 DOM 解析——在浏览器模拟场景中,监听 API 响应比解析 HTML 更高效更稳定
  8. 中文编码兜底——Windows 环境下输出中文时做好 gbk fallback,文件存储用 utf-8
  9. 词云要用中文字体——WordCloudfont_path 必须指定中文字体文件
  10. 浏览器路径配置一次即可——DrissionPage 的 ChromiumOptions 设置后 save() 即持久化

10.3 依赖库清单

1
2
3
4
5
6
7
8
# 基础爬虫
pip install requests lxml pandas

# 浏览器模拟
pip install DrissionPage

# 数据可视化
pip install wordcloud matplotlib jieba

结语

这四个项目覆盖了 Python 爬虫开发的主要技术栈和常见挑战。从简单的 API 请求到复杂的浏览器模拟,从 JSONP/XML 解析到词云可视化,每一层都有独特的技术细节和实战踩坑点。

爬虫的本质不是”黑科技”,而是理解目标系统的数据流转机制——数据从哪里来、通过什么格式传输、有哪些保护措施。搞清楚这三点,剩下的就是选择合适的技术路线和写出健壮的代码。


本文基于以下真实项目代码编写:

  • 淘宝商品评论爬虫重建版(淘宝商品评论爬虫重建.py
  • B站视频弹幕 Demo001、公孙田浩版、数据标注版
  • B站视频评论爬虫基础版与 AI 优化版
  • 京东商品评论爬虫普通版与多线程版
评论
分享