代码功能概述
这段代码的功能是使用 Playwright 框架爬取一个动态渲染的电影信息网站,分为以下几个步骤:
- 爬取列表页,获取每部电影的详情页链接。
- 爬取详情页,提取电影的详细信息(如名称、类型、评分等)。
- 支持并发爬取,限制最大并发数。
- 对爬取失败的详情页链接进行重试。
实现逻辑
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
代码执行流程
-
启动浏览器:
- 在
main
中启动浏览器,创建上下文和标签页。
- 在
-
爬取列表页:
- 调用
scrape_index
打开每一页的列表页。 - 调用
parse_index
提取每页的详情页链接。
- 调用
-
爬取详情页:
- 调用
process_detail
并发爬取详情页。 - 在
process_detail
中调用scrape_detail
加载详情页,并调用parse_detail
提取数据。
- 调用
-
处理失败的详情页:
- 调用
retry_failed_urls
对失败的详情页链接重新爬取。
- 调用
-
关闭浏览器:
- 在
main
中关闭浏览器上下文和浏览器。
- 在
总结
-
核心功能:
- 爬取列表页,获取详情页链接。
- 并发爬取详情页,提取电影信息。
- 支持失败重试,确保数据完整性。
-
并发控制:
- 使用
asyncio.Semaphore
限制并发数,避免过高的并发导致资源耗尽。
- 使用
-
异常处理:
- 捕获请求异常,记录失败的 URL,并在后续重试。
-
代码结构清晰:
- 各个功能模块分离,便于扩展和维护。
源码请移至链接:https://download.csdn.net/download/xingyuzhongxuan/90571181
有网络运维、网络设备安全设备调试需求,以及python爬虫需求可以私信我或联系邮箱2452916129@qq.com