### **代码功能概述**
这段代码的功能是使用 Playwright 框架爬取一个动态渲染的电影信息网站,分为以下几个步骤:
1. 爬取列表页,获取每部电影的详情页链接。
2. 爬取详情页,提取电影的详细信息(如名称、类型、评分等)。
3. 支持并发爬取,限制最大并发数。
4. 对爬取失败的详情页链接进行重试。
---
### **实现逻辑**
#### **1. 主函数 `main`**
- **功能**:
- 启动浏览器,创建上下文和标签页。
- 调用爬取列表页的函数,获取所有详情页链接。
- 并发爬取详情页数据。
- 对失败的详情页链接进行重试。
- 关闭浏览器上下文和浏览器。
- **调用逻辑**:
- 调用 `scrape_index` 爬取列表页。
- 调用 `parse_index` 解析列表页,获取详情页链接。
- 调用 `process_detail` 并发爬取详情页。
- 调用 `retry_failed_urls` 重试失败的详情页。
---
#### **2. 通用爬取函数 `scrape_page`**
- **功能**:
- 打开指定的 URL,并等待页面加载完成。
- 显式等待指定的元素加载完成。
- **调用逻辑**:
- 被 `scrape_index` 和 `scrape_detail` 调用,用于通用的页面加载和等待。
---
#### **3. 爬取列表页 `scrape_index`**
- **功能**:
- 根据页码构造列表页 URL。
- 调用 `scrape_page` 打开列表页并等待加载完成。
- **调用逻辑**:
- 被 `main` 调用,用于爬取每一页的电影列表。
---
#### **4. 解析列表页 `parse_index`**
- **功能**:
- 从列表页中提取每部电影的详情页链接。
- 使用 `query_selector_all` 获取所有电影链接的元素。
- 使用 `get_attribute('href')` 获取链接地址,并拼接为完整的 URL。
- **调用逻辑**:
- 被 `main` 调用,用于解析列表页并返回详情页链接列表。
---
#### **5. 爬取详情页 `scrape_detail`**
- **功能**:
- 打开详情页 URL,并等待页面加载完成。
- 调用 `scrape_page` 实现通用的页面加载和等待。
- **调用逻辑**:
- 被 `process_detail` 调用,用于加载详情页。
---
#### **6. 解析详情页 `parse_detail`**
- **功能**:
- 从详情页中提取电影的详细信息,包括名称、类型、评分、描述和上映地区。
- 使用 `query_selector` 和 `query_selector_all` 获取页面元素。
- 使用 `text_content()` 提取文本内容,并使用 `strip()` 去除多余的空格和换行符。
- **调用逻辑**:
- 被 `process_detail` 调用,用于解析详情页并返回电影信息。
---
#### **7. 处理详情页 `process_detail`**
- **功能**:
- 使用信号量限制并发数。
- 调用 `scrape_detail` 加载详情页。
- 调用 `parse_detail` 提取详情页数据。
- 捕获异常并记录失败的 URL。
- **调用逻辑**:
- 被 `main` 和 `retry_failed_urls` 调用,用于并发处理详情页。
---
#### **8. 重试失败的详情页 `retry_failed_urls`**
- **功能**:
- 对爬取失败的详情页链接重新尝试爬取。
- 调用 `process_detail` 重新处理失败的链接。
- **调用逻辑**:
- 被 `main` 调用,用于处理失败的详情页链接。
---
### **函数调用关系图**
```
main
├── scrape_index
│ └── scrape_page
├── parse_index
├── process_detail
│ ├── scrape_detail
│ │ └── scrape_page
│ └── parse_detail
└── retry_failed_urls
└── process_detail
```
---
### **代码执行流程**
1. **启动浏览器**:
- 在 `main` 中启动浏览器,创建上下文和标签页。
2. **爬取列表页**:
- 调用 `scrape_index` 打开每一页的列表页。
- 调用 `parse_index` 提取每页的详情页链接。
3. **爬取详情页**:
- 调用 `process_detail` 并发爬取详情页。
- 在 `process_detail` 中调用 `scrape_detail` 加载详情页,并调用 `parse_detail` 提取数据。
4. **处理失败的详情页**:
- 调用 `retry_failed_urls` 对失败的详情页链接重新爬取。
5. **关闭浏览器**:
- 在 `main` 中关闭浏览器上下文和浏览器。
点击空白处退出提示
评论