【问题标题】:Reading the content of a Javascript-rendered webpage into R将 Javascript 呈现的网页内容读入 R
【发布时间】:2021-04-18 11:46:49
【问题描述】:

我正在尝试将以下网页的内容(如浏览器的 Inspect Element 工具中所示)读入 R:

Etoro Discover People

由于内容显然是 Javascript 渲染的,因此无法通过使用常见的网络抓取功能(如来自 xml2 包的 read_html)来检索内容。我遇到以下建议使用 rvestV8 包的帖子,但我无法解决我的问题:

https://datascienceplus.com/scraping-javascript-rendered-web-content-using-r/

我在 Stack Overflow 上也看到了非常相似的问题(如 thisthis),但这些问题的答案(隐藏的 api 解决方案和网络选项卡中的请求 URL)对我不起作用。

对于初学者,我有兴趣阅读列表中人员的公共 ID(div.user-nickname 节点)。我的猜测是,要么我错误地指定了节点,要么网站根本不允许网络抓取。

任何帮助将不胜感激。

【问题讨论】:

  • 查看提供的链接时,我没有看到该课程。你能给出一个要检索的页面中的示例 id 吗?
  • @QHarr 非常感谢您的回复。例如,列表中第二个人的 ID 是“brandnew300”。

标签: javascript r web-scraping


【解决方案1】:

数据来自返回 json 的 API 调用。您可以发出相同的 GET 请求,然后提取用户名。将x$UserNamex$CustomerId 交换为ID。

library(jsonlite)

data <- jsonlite::read_json('https://www.etoro.com/sapi/rankings/rankings/?activeweeksmin=24&blocked=false&bonusonly=false&copiersmax=5000&copyblock=false&copyinvestmentpctmax=0&copytradespctmax=0&dailyddmin=-10&displayfullname=true&gainmax=100&gainmin=5&hasavatar=true&highleveragepctmax=10&isfund=false&istestaccount=false&lastactivitymax=14&longpospctmax=80&lowleveragepctmin=50&maxdailyriskscoremax=5&maxmonthlyriskscoremax=5&maxmonthlyriskscoremin=1&optin=true&page=1&pagesize=20&period=OneYearAgo&profitableweekspctmin=50&sort=-gain&tradesmin=20&verified=true&weeklyddmin=-20&winratiomax=85')

users <- lapply(data$Items, function(x) {x$UserName})

【讨论】:

  • 非常感谢!当我将您提供的 json 复制粘贴到我的浏览器中时,我可以看到它的内容,但我无法在 R 中读取它。当我运行代码的第二行时,我收到以下错误消息:打开时出错.connection(con, "rb") : 无法打开连接另外:警告消息:在 open.connection(con, "rb") 中:无法打开 URL ''[...]":HTTP 状态为 '403 Forbidden ' 我该如何解决这个问题?我的第二个问题是你是如何从原始 URL 中获得这个新 URL(json 那个)的?真的很抱歉,我在网络抓取方面缺乏经验。
  • 在网页上按 F12 打开开发工具,转到网络选项卡,按 F5 观察网络流量显示为页面更新。查看以https://www.etoro.com/sapi/rankings/rankings/?activeweeksmin开头的请求的网络流量(在 xhr 上过滤)
  • 抱歉,我还有一个问题。似乎我为给定的人员列表检索的每个 json 仅包含 20 个项目(而不是列表中的所有人员)。例如,您提供的 json 包含 20 人,而原始列表(在我的原始 URL 中)包含 30 人。我在另一个列表(2207 人)上尝试了您的解决方案,并得到了 76 个 json,每个包含 20 人(我向下滚动以加载整个人员列表,然后从开发工具中提取 json URL)。有没有办法可以检索列表中所有人的姓名(1 个 json 或多个)?
  • 检查 url 中的参数。是否有限制和/或分页?
  • 是的,每个 URL 中都有一个“pagesize=20”和一个“page=n”(具有不同的 n)。这是与包含 2207 人的列表相关联的 76 个 URL 之一:etoro.com/sapi/rankings/rankings/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多