You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:40:05