【问题标题】:R / Rvest / RSelenium: scrape data from JS SitesR / Rvest / RSelenium:从 JS 站点抓取数据
【发布时间】:2020-09-13 10:13:18
【问题描述】:

我是 R 和 Rvest 网络抓取主题的新手。使用 rvest,您可以抓取静态 HTML,但我发现 rvest 正在努力从基于 JS 的繁重站点中抓取数据。

我发现了一些文章或博客文章,但它们似乎被贬低了 https://awesomeopensource.com/project/yusuzech/r-web-scraping-cheat-sheet

在我的情况下,我想从体育博彩网站上获取赔率,但由于 JS,我认为使用 rvest 和 SelectorGadget 是不可能的。

2018 年有一篇关于从 PaddyPower(https://www.r-bloggers.com/how-to-scrape-data-from-a-javascript-website-with-r/) 中抓取 Odds 的文章,但这也已经过时了,因为 PhantomJS 不再可用。 RSelenium 似乎是一种选择,但 repo 有很多问题https://github.com/ropensci/RSelenium

那么是否可以在当前状态下使用 RSelenium,或者我有什么选择来代替 RSelenium?

亲切的问候

【问题讨论】:

  • Docker 安装 RSelenium 为我工作了这篇文章:towardsdatascience.com/…。请注意,在某些网站上,您可能会遇到 anti-bot Captcha
  • 将尝试。希望它不要复杂...
  • 您好,教皇。请注意不要通过抓取数据来违反体育博彩网站的条款和条件。我认为大多数此类网站都会在其条款和条件中明确禁止这样做

标签: r web-scraping rvest httr rselenium


【解决方案1】:

wdman 包的帮助下,我在使用RSelenium 时没有遇到任何问题,这让我不必为Docker 烦恼。 wdman 还会获取您需要的所有二进制文件(如果它们尚不可用)。这是一个很好的魔法。
这是一个使用 Chrome 启动 Selenium 实例的简单脚本,打开一个站点,以 xml 格式获取内容,然后再次将其全部关闭。

library(wdman)
library(RSelenium)
library(xml2)

# start a selenium server with wdman, running the latest chrome version
selServ <- wdman::selenium(
  port = 4444L,
  version = 'latest',
  chromever = 'latest'
)

# start your chrome Driver on the selenium server
remDr <- remoteDriver(
  remoteServerAddr = 'localhost',
  port = 4444L,
  browserName = 'chrome'
)

# open a selenium browser tab
remDr$open()

# navigate to your site
remDr$navigate(some_url)

# get the html contents of that site as xml tree
page_xml <- xml2::read_html(remDr$getPageSource()[[1]])

# do your magic
# ... check doc at `?remoteDriver` to see what your remDr object can help you do.

# clean up after you
remDr$close()
selServ$stop()

【讨论】:

  • 谢谢。工作正常,但我怎么说浏览器用接受或启用的 JS 加载网站?
  • 也许我还没有完全理解你。 Selenium 托管的 Chrome 是一个成熟的浏览器实例,实际上它甚至应该在您的机器上打开一个窗口,您可以在其中观看它的运行情况。这个浏览器支持 JS,就像你的“普通”chrome 一样。您在 JS 执行方面是否遇到任何不同的行为或问题?从理论上讲,page_xml 应该在站点脚本构建之后为您提供页面内容
  • 这是问题所在。该站点未加载到 chrome 驱动程序中。在我的 chrome 浏览器中,它的负载是正确的。如果我在浏览器中停用 js,那么浏览器中也会出现同样的问题,网站不会加载。所以我认为远程驱动程序似乎尝试在没有 JS 的情况下加载站点。
  • 嘿,亚历克斯,当然。我想从 Bookie 网站上获取赔率。例如,来自bet365.com/?nr=1#/AC/B1/U^92591234 的主场、平局、客场赔率
  • 好吧,那么在 Selenium 中执行 JS 不是问题,只是您的自动浏览器被 bookie 站点阻止了。如果你用谷歌搜索,你会发现关于这个问题的讨论,also some on SO。这违反了他们的服务条款,因此我认为您会发现在这里很难获得任何明确的帮助。您会发现一些倾向于这个大方向的建议:查看here 以了解如何将其他配置命令传递到 Chrome 网络驱动程序。亚历克斯出来:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 2019-08-17
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多