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

如何将R的{polite}包与jsonlite结合实现礼貌网页爬取?

正确集成{polite}与jsonlite实现Instagram礼貌爬取

核心问题解析

你之前的错误在于直接将polite::bow()返回的会话对象传给jsonlite::fromJSON(),而fromJSON()需要的是JSON文本内容,不是会话对象。正确流程是:建立礼貌会话 → 爬取响应内容 → 提取JSON文本 → 解析JSON。

步骤1:加载依赖包

library(polite)
library(jsonlite)
library(purrr) # 批量处理分页请求时需加载

步骤2:初始请求的正确实现

# 初始URL
url_ini <- "https://www.instagram.com/instagram/?__a=1&__d=11"

# 建立礼貌会话(自定义User-Agent是避免被封的核心)
session <- bow(
  url = url_ini,
  user_agent = "你的姓名 <你的邮箱@example.com>", # 替换为真实信息,网站会验证合法性
  delay = 2 # 每次请求间隔2秒,可根据情况调整为3-5秒
)

# 爬取响应并解析JSON
response_ini <- scrape(session)
document_ini <- fromJSON(content(response_ini, "text"))

# 提取关键信息(与原有代码逻辑一致)
id <- document_ini$graphql$user$id
end_cursor <- document_ini$graphql$user$edge_owner_to_timeline_media$page_info$end_cursor

步骤3:分页请求的礼貌实现

方式1:复用初始会话(推荐,保持会话一致性)

# 构造分页URL
n1 <- 'https://www.instagram.com/graphql/query/?query_hash=e769aa130647d2354c40ea6a439bfc08&variables={"id":"'
n2 <- '","first":12,"after":"'
n3 <- '"}'
url_page <- paste0(n1, id, n2, end_cursor, n3)

# 复用初始会话,更新目标URL
session_page <- nod(session, url = url_page)

# 爬取并解析分页内容
response_page <- scrape(session_page)
document_page <- fromJSON(content(response_page, "text"))

方式2:单独建立会话

如果不需要复用会话,也可以直接对分页URL重新建立会话:

session_page <- bow(
  url = url_page,
  user_agent = "你的姓名 <你的邮箱@example.com>",
  delay = 2
)
response_page <- scrape(session_page)
document_page <- fromJSON(content(response_page, "text"))

关键注意事项

  • 自定义User-Agent:必须填写真实的姓名和邮箱,这是网站判断你是否为合法爬取的重要依据,能大幅降低被封禁的概率。
  • 延迟设置:bow()中的delay参数会自动在请求前等待指定秒数,避免短时间内高频请求。建议设置为3-5秒,更稳妥。
  • 遵守robots.txt:polite包会自动检查目标网站的robots.txt规则,确保你爬取的内容是被允许的,不要强行爬取禁止访问的路径。
  • 接口稳定性:Instagram的未公开API(如__a=1、graphql/query)可能随时变更,若出现解析失败,需检查URL结构或query_hash是否失效。

内容的提问来源于stack exchange,提问作者RxT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:00:55