使用 Rstudio 基于 div id 进行网页抓取

问题描述 投票:0回答:1

我正在尝试从网站上抓取政府数据。但是,该网站没有表类,内容显示为 div id。网站网址是:

https://nreganarep.nic.in/netnrega/all_lvl_details_dashboard_new.aspx?Fin_Year=2023-2024&Digest=WJEEpOm1k0Ptz2KJJGSoqA

我附上了该页面的照片。

我尝试过的代码知道它是不正确的:

url = "https://nreganarep.nic.in/netnrega/all_lvl_details_dashboard_new.aspx?Fin_Year=2023-2024&Digest=WJEEpOm1k0Ptz2KJJGSoqA"
url_read = read_html(url)
url_ex = url_read %>% html_element(".someTable")

url_ex = url_read %>% html_element("cotainer")
url_ex = url_read %>% html_element("cotainer")
r web-scraping rvest rselenium
1个回答
0
投票

表格位于iframe中,源自

national_dashboard_detail.aspx
,在不提供任何参数的情况下,它似乎可以毫无问题地返回所有状态的结果:

library(rvest)

"https://nreganarep.nic.in/netnrega/national_dashboard_detail.aspx" %>% 
  read_html() %>% 
  html_element("table.table") %>% 
  html_table()
#> # A tibble: 46 × 7
#>    National                National National National National National National
#>    <chr>                   <chr>    <chr>    <chr>    <chr>    <chr>    <chr>   
#>  1 1.Total No. of Distric… 739      739      739      739      739      739     
#>  2 2.Total No. of Blocks   7,172    7,172    7,172    7,172    7,172    7,172   
#>  3 3.Total No. of GPs      2,69,650 2,69,650 2,69,650 2,69,650 2,69,650 2,69,650
#>  4 I             Job Card  I      … I      … I      … I      … I      … I      …
#>  5 4.Total No. of Job Car… 14.88    14.88    14.88    14.88    14.88    14.88   
#>  6 5.Total No. of Workers… 26.31    26.31    26.31    26.31    26.31    26.31   
#>  7 6.Total No. of Active … 9.74     9.74     9.74     9.74     9.74     9.74    
#>  8 7.Total No. of Active … 14.43    14.43    14.43    14.43    14.43    14.43   
#>  9 8.(i)SC worker against… 19.75    19.75    19.75    19.75    19.75    19.75   
#> 10 9.(ii)ST worker agains… 16.24    16.24    16.24    16.24    16.24    16.24   
#> # ℹ 36 more rows

对于过滤,您可以从表单源或浏览器开发工具的请求列表中选择正确的值,例如为
州 : 果阿 地区 : 北果阿 街区 : SATARI Panchayat : MAUXI
,这应该有效:

https://nreganarep.nic.in/netnrega/all_lvl_details_new.aspx?panchayat_code=1001005054&block_code=1001005&district_code=1001&state_code=10&page=p&fin_year=2023-2024&Digest=123

只有

*_code
参数似乎有影响;
Digest
有点奇怪,跳过它会触发某种“URL Tampered”事件,但任何随机值似乎都有效。

或者您可以通过

rvest
会话来解决此问题,方法是填写并提交搜索表单并提取更新的 iframe 源 URL。

对于果阿来说,它看起来像这样:

# open session
dashboard_url <- "https://nreganarep.nic.in/netnrega/all_lvl_details_dashboard_new.aspx"
s <- session(dashboard_url)

# form options for ddl_state:
s %>% html_elements("#ddl_state option") %>% print(max_n = 10)
#> {xml_nodeset (35)}
#>  [1] <option selected value="ALL">ALL</option>\n
#>  [2] <option value="02">ANDHRA PRADESH</option>\n
#>  [3] <option value="03">ARUNACHAL PRADESH</option>\n
#>  [4] <option value="04">ASSAM</option>\n
#>  [5] <option value="05">BIHAR</option>\n
#>  [6] <option value="33">CHHATTISGARH</option>\n
#>  [7] <option value="10">GOA</option>\n
#>  [8] <option value="11">GUJARAT</option>\n
#>  [9] <option value="12">HARYANA</option>\n
#> [10] <option value="13">HIMACHAL PRADESH</option>\n
#> ...

s %>% 
  # extract (1st) from
  html_form() %>% 
  getElement(1) %>% 
  # set ddl_state to "10" (value for Goa)
  html_form_set(ddl_state = "10") %>% 
  # submit form
  session_submit(s, form = .) %>% 
  # iframe src location is now updated with parameters, 
  # extract it and prepend with https://nreganarep.nic.in/netnrega/
  html_element("iframe") %>% 
  html_attr("src") %>% 
  # fetch page inside same rvest session, extract and parse table
  paste(dirname(dashboard_url), ., sep = "/") %>% 
  session_jump_to(x = s, url = .) %>% 
  html_element("table.table") %>% 
  html_table()

果阿结果表 (ddl_state 10):

#> # A tibble: 45 × 7
#>    `State    : GOA`           `State    : GOA` `State    : GOA` `State    : GOA`
#>    <chr>                      <chr>            <chr>            <chr>           
#>  1 Total No. of Districts     2                2                2               
#>  2 Total No. of Blocks        12               12               12              
#>  3 Total No. of GPs           191              191              191             
#>  4 I             Job Card     I             J… I             J… I             J…
#>  5 Total No. of JobCards iss… 0.39             0.39             0.39            
#>  6 Total No. of Workers[In L… 0.51             0.51             0.51            
#>  7 Total No. of Active Job C… 0.07             0.07             0.07            
#>  8 Total No. of Active Worke… 0.08             0.08             0.08            
#>  9 (i)SC worker against acti… 2.49             2.49             2.49            
#> 10 (ii)ST worker against act… 42.65            42.65            42.65           
#> # ℹ 35 more rows
#> # ℹ 3 more variables: `State    : GOA` <chr>, `State    : GOA` <chr>,
#> #   `As on 09-08-2023` <chr>

详细的过滤可能会有点棘手,因为每个下拉列表的选项只有在提交前一个下拉列表中的选择后才会提供。换句话说,如果您想从有效选项列表中为每个过滤器选择一个值,则必须提交 4 次表单。

创建于 2023-08-09,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.