在 macOS High Sierra (10.13.6) 上使用 R (v3.6.0) 中的 PhantomJS 进行 Webscraping Javascript 表返回部分表

Posted

技术标签:

【中文标题】在 macOS High Sierra (10.13.6) 上使用 R (v3.6.0) 中的 PhantomJS 进行 Webscraping Javascript 表返回部分表【英文标题】:Using PhantomJS in R (v3.6.0) on macOS High Sierra (10.13.6) for Webscraping Javascript Table Returns Partial Table 【发布时间】:2020-03-12 17:30:42 【问题描述】:

我是编程新手,没有网络抓取经验。我在 macOS High Sierra (10.13.6) 上运行 R 版本 3.6.0。

作为研究项目的一部分,我试图从Forbes website 中抓取包含 2,000 个观察值的表,并将其保存为 R 中的数据框。在this video 的指导下,我能够提取前十个2,000 行表的行。我不确定为什么只收集前 10 行,虽然我浏览了许多博客和教程,但我似乎无法找到解决此问题的方法。

注意:网页表格每十行(1-10、ad、11-20、ad、...)都有一个广告横幅。这是否会提示 PhantomJS 停止抓取表格?

就像我说的,我是网络抓取的新手,对移动部件不太确定。您可以建议或提供的任何见解或资源都将意义重大!

这是我正在使用的代码,它成功提取了前 10 行,但没有提取完整的 2,000 行:

 ## Install packages if necessary:

install.packages("rvest")
install.packages("stringr")
install.packages("plyr")
install.packages("dplyr")
install.packages("ggvis")
install.packages("knitr")

## Load them:

library("rvest")
library("stringr")
library("plyr")
library("dplyr")
library("ggvis")
library("knitr")

### At this point I downloaded and moved PhantomJS to my working directory.

## Establish connections

url <- ("https://www.forbes.com/global2000/list/")
connection <- "forbes_list.js"

## Extract content

writeLines(sprintf("var page = require('webpage').create();
                   page.open('%s', function() 
                   console.log(page.content); //page source
                   phantom.exit();
                   )", url), con = connection)

system_input <- "./phantomjs forbes_list.js>forbes_list.html"

system(system_input)

## Read in html

html <- "forbes_list.html"
pg <- read_html(html)

## Extract Table

table <- pg %>%html_nodes(xpath = '(//*[@id="the_list"])') %>% html_table()

我得到以下结果:

> table
[[1]]
      Rank                    Company Country/Territory    Sales
1  NA   #1                       ICBC             China $175.9 B
2  NA   #2             JPMorgan Chase     United States $132.9 B
3  NA   #3    China Construction Bank             China $150.3 B
4  NA   #4 Agricultural Bank of China             China $137.5 B
5  NA   #5            Bank of America     United States $111.9 B
6  NA   #6                      Apple     United States $261.7 B
7  NA   #7    Ping An Insurance Group             China $151.8 B
8  NA   #8              Bank of China             China $126.7 B
9  NA   #9          Royal Dutch Shell       Netherlands $382.6 B
10 NA  #10                Wells Fargo     United States $101.5 B
   Profits     Assets Market Value
1  $45.2 B $4,034.5 B     $305.1 B
2  $32.7 B $2,737.2 B     $368.5 B
3  $38.8 B $3,382.4 B       $225 B
4  $30.9 B $3,293.1 B       $197 B
5  $28.5 B $2,377.2 B     $287.3 B
6  $59.4 B   $373.7 B     $961.3 B
7  $16.3 B $1,038.3 B     $220.2 B
8  $27.5 B $3,097.6 B       $143 B
9  $23.3 B   $399.2 B     $264.9 B
10 $23.1 B $1,887.8 B     $214.7 B

所以效果很好!但还不够好……:/

再次感谢任何帮助!

【问题讨论】:

欢迎来到 Stack Overflow!您的抓取有问题,因为页面在您滚动时动态加载内容。如果您搜索 scrape "infinite scroll" 或“无尽滚动”,您会找到一些资源,或者可以集中您的问题以获得更好的答案。 Fwiw,我发现 WebScraper Chrome 扩展更容易进行快速分析。我使用过 PhantomJS 和 CasperJS,但用于更自动化的生产用途。 不幸的是,我无法让它在 PhantomJS 上工作。不过,感谢 @ravic_ 对 Chrome WebScaper 的推荐。像魅力一样工作! 【参考方案1】:

我已经能够使用以下代码访问表的前 100 行:

library(RSelenium)
library(XML)
library(RCurl)
shell('docker run -d -p 4445:4444 selenium/standalone-firefox')
remDr <- remoteDriver(remoteServerAddr = "localhost", port = 4445L, browserName = "firefox")
remDr$open()
remDr$navigate('https://www.forbes.com/lists/global2000/#8cc3b3e5ac04')

remDr$executeScript("scroll(0, 5000)")
remDr$executeScript("scroll(0, 15000)")
Sys.sleep(4)

remDr$screenshot(display = TRUE, useViewer = TRUE) 

page_Content <- remDr$getPageSource()[[1]]
table <- readHTMLTable(page_Content)[[1]]
table

现在,要进入下一页,您可以使用以下代码获取接下来的 100 个值:

web_Obj_Next_Page <- remDr$findElement("xpath", "//*[@id='row-4']/div/ul/li/div/div/div[2]/div/div/ul/li[11]/a")
web_Obj_Next_Page$clickElement()                 
page_Content <- remDr$getPageSource()[[1]]
table <- readHTMLTable(page_Content)[[1]]
table

您可以使用 for 循环来获取所有 2000 个值。

【讨论】:

以上是关于在 macOS High Sierra (10.13.6) 上使用 R (v3.6.0) 中的 PhantomJS 进行 Webscraping Javascript 表返回部分表的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 macOS Sierra/High Sierra 上创建 PPTP *** 连接?

markdown 在macOS High Sierra上安装多个Java版本

markdown 在macOS High Sierra上安装多个Java版本

markdown 在High Sierra上安装Windows 10(macOS 10.13.2)

macos high sierra 删除多余的管理员的步骤

在 OS X 10.11 El Capitan、macOS 10.12 Sierra、macOS 10.13 High Sierra (< 10.13.3) 上安装 pecl 和 pear