如何将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
相关产品推荐
相关产品推荐

