如何使用polite的bow、map与scrape批量抓取IMDB剧集数据?
批量抓取IMDB剧集数据的实现方案
问题说明
需要批量抓取IMDB不同剧集的剧集列表数据,目标URL结构为https://www.imdb.com/title/[剧集代码]/episodes/,希望通过polite包的bow建立会话,结合purrr::map和scrape完成批量抓取。
修正后的代码实现
原代码的核心问题是URL拼接方式错误:scrape的query参数用于添加URL查询参数(即?后的内容),但IMDB的剧集页面是路径拼接形式,而非查询参数。以下是可运行的修正版本:
# 加载依赖包 library(rvest) library(tidyverse) library(polite) # 1. 建立礼貌爬虫会话,指向IMDB的title根路径 session <- bow( url = "https://www.imdb.com/title/", user_agent = "你的联系邮箱" # 建议设置合法标识,避免触发反爬机制 ) # 2. 定义需要抓取的剧集代码列表(修正原示例中少写的0,匹配目标URL结构) show_codes <- c("tt0903747", "tt5491994") # 3. 批量发起抓取请求 results <- map(show_codes, function(code) { # 拼接完整的剧集页面路径 episode_path <- paste0(code, "/episodes/") # 从会话中抓取目标页面 scrape(session, path = episode_path) }) # 4. 解析抓取到的页面(示例:提取每集标题与IMDB评分) parsed_episodes <- map_dfr(results, function(page) { page %>% # 提取剧集标题(CSS选择器需根据IMDB页面结构调整) html_elements(".ipc-title__text") %>% html_text() %>% enframe(name = "episode_order", value = "title") %>% mutate( # 提取对应评分 rating = page %>% html_elements(".ipc-rating-star--imdb") %>% html_text() %>% as.numeric(), # 添加所属剧集代码 show_code = str_extract(page %>% html_element("link[rel='canonical']") %>% html_attr("href"), "tt\\d+") ) }) print(parsed_episodes)
关键细节说明
- 礼貌爬虫规范:
polite包会自动遵守网站robots.txt规则,设置user_agent是合规爬取的必要操作,建议填写自己的邮箱,方便网站管理员联系。 - 路径拼接逻辑:IMDB剧集页面的URL是在
title/后追加[剧集代码]/episodes/,因此必须用scrape的path参数完成拼接,而非query。 - 页面结构适配:IMDB页面CSS选择器可能会更新,若解析失败,可通过浏览器开发者工具重新获取元素的选择器。
- 批量数据合并:
map_dfr可直接将多个页面的解析结果合并为一个数据框,便于后续分析处理。
内容的提问来源于stack exchange,提问作者MLEN
相关产品推荐
相关产品推荐

