如何使用R语言爬取JavaScript渲染的网站?

4

我想问一下,有没有好的方法可以爬取以下网站? https://list.jd.com/list.html?cat=737,794,798&page=1&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main

基本上,我想要获取所有产品的名称和价格。然而,价格信息存储在一些 JQuery 脚本中。

Selenium 是唯一的解决方案吗?想过使用 V8 / Jsonlite,但它们似乎不适用。如果你能提供一些 R 中的替代方案就太好了。(我的电脑禁止访问 exe 文件,因此我无法使用 Selenium / PhantomJS)

1个回答

3

找不到任何robots.txt或禁止爬取的条款/条件(如果有人发现,请在评论中标记,以便我删除答案):

library(rvest)
library(V8)
library(tidyverse)

pg <- read_html("https://list.jd.com/list.html?cat=737,794,798&page=1&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main")

将问题标记为V8是个好主意。

ctx <- v8()

我们需要添加两个缺失的全局变量,然后评估JavaScript代码:
paste0(
  c("var window = {}, SEARCH = {};",
    html_nodes(pg, "script")[[1]] %>%
      html_text()
  ),
  collapse = "\n"
) %>%
  ctx$eval()
## [1] "[object Object]"

现在开始获取一些数据:

ctx$get("aosList") %>%
  bind_rows(.id = "id") %>%
  tbl_df()
## # A tibble: 175 x 3
##    id      n                     v         
##    <chr>   <chr>                 <chr>     
##  1 1429810 39-45英寸             244_110017
##  2 1429810 全高清(1920×1080)   3613_77848
##  3 1429810 3级                   1200_1656 
##  4 4286570 39-45英寸             244_110017
##  5 4286570 高清(1366×768)      3613_93579
##  6 4286570 3级                   1200_1656 
##  7 4609652 55英寸                244_1486  
##  8 4609652 4k超高清(3840×2160) 3613_77847
##  9 4609652 3级                   1200_1656 
## 10 4609660 65英寸                244_58269 
## # ... with 165 more rows

另外,还有更多的数据:

ctx$get("attrList") %>%
  bind_rows(.id = "id") %>%
  tbl_df()
## # A tibble: 60 x 15
##    id      IsSam    cw factoryShip isCanUseDQ isJDexpress  isJX isOverseaPurchase mcat3Id soldOS  tssp venderType xgzs 
##    <chr>   <int> <int>       <int>      <int>       <int> <int>             <int>   <int>  <int> <int> <chr>      <chr>
##  1 1429810     0     1           0          0           0     0                 0     798     -1     0 0          7.3  
##  2 4286570     0     1          NA          0           0     0                 0     798     -1     0 0          6.2  
##  3 4609652     0     1          NA          0           0     0                 0     798     -1     0 0          7.5  
##  4 4609660     0     1          NA          0           0     0                 0     798     -1     0 0          8.8  
##  5 4620979     0     1          NA          0           0     0                 0     798     -1     0 0          6.4  
##  6 4751739     0     1          NA          1           0     0                 0     798     -1     0 0          8.9  
##  7 4902977     0     1          NA         NA           0     0                 0     798     -1     0 0          9.5  
##  8 5010925     0     1          NA          1           0     0                 0     798     -1     0 0          8.6  
##  9 5102214     0     1          NA          0           0     0                 0     798     -1     0 0          7.8  
## 10 5218185     0     1          NA          1           0     0                 0     798     -1     0 0          <NA> 
## # ... with 50 more rows, and 2 more variables: isFzxp <int>, shipFareTmplId <int>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接