使用R搜索搜索后面的asp javascript分页表

Ant*_*ico 11 javascript r web-scraping rselenium rvest

我试图拉内容https://www.askebsa.dol.gov/epds/default.asp用两种rvestRSelenium但当JavaScript页面开始搜索框没有找到指导?将所有这些内容整合到一个简单的CSV文件中会很棒.

之后,从https://www.askebsa.dol.gov/mewaview/View/Index/6219这样的个别文件中提取数据似乎是可能的..但我也很感激这样做的干净建议.谢谢

t.m*_*dam 1

为了获得结果,您必须填写表格并提交。您可以通过检查 html 找到 url 和字段名称。

url <- "https://www.askebsa.dol.gov/epds/m1results.asp"

post_data <- list(
    m1year = 'ALL',         # Year
    m1company = '',         # Name of MEWA (starts with)
    m1ein = '',             # EIN
    m1state = 'ALL',        # State of MEWA Headquarters
    m1coverage = 'ALL',     # State(s) where MEWA offers coverage
    m1filingtype = 'ALL',   # Type of filing
    cmdSubmitM1 = 'Search',
    # hidden fields
    auth = 'Y', 
    searchtype = 'Q', 
    sf = 'EIN', 
    so = 'A'
)
Run Code Online (Sandbox Code Playgroud)

现在我们可以提交表单并收集链接。我们可以用这个选择器抓取链接table.table.table-condensed td a

html <- read_html(POST(url, body = post_data, encode = "form"))
links <- html_nodes(html, 'table.table.table-condensed td a') %>% html_attr("href") 
links <- paste0("https://www.askebsa.dol.gov", links) 
Run Code Online (Sandbox Code Playgroud)

这会产生第一页的所有链接。

检查 HTTP 流量时,我注意到下一页是通过提交带有一些额外字段(m1formid、allfilings、page)的相同表单来加载的。我们可以通过循环增加页面值来获取下一页。

library(httr)
library(rvest)

url <- "https://www.askebsa.dol.gov/epds/m1results.asp"
post_data <- list(
    m1year='ALL', m1company='', m1ein='', m1state='all', 
    m1coverage='all', m1filingtype='ALL', cmdSubmitM1 = 'Search',
    auth='Y', searchtype='Q', sf='EIN', so='A', 
    m1formid='', allfilings='', page=1
)
links = list()

while (TRUE) {
    html <- read_html(POST(url, body = post_data, encode = "form"))
    page_links <- html_nodes(html, 'table.table.table-condensed td a') %>% html_attr("href") %>% paste0("https://www.askebsa.dol.gov/", .) 
    links <- c(links, page_links)
    last <- html_text(tail(html_nodes(html, 'div.textnorm > a'), n=2)[1])
    if (last != 'Last') {
        break
    }
    post_data['page'] <- post_data[['page']] + 1
}

print(links)
Run Code Online (Sandbox Code Playgroud)

对于问题的第二部分,我假设目标是选择表单项及其值。您可以通过选择所有div.question-inline标签以及每个项目的下一个code标签来做到这一点。

library(rvest)

url <- "https://www.askebsa.dol.gov/mewaview/View/Index/6219"
nodes <- html_nodes(read_html(url), 'div.question-inline, div.question')
data <- list()

for (i in nodes) {
    n = trimws(html_text(html_node(i, xpath='./text()')))

    if (length(html_nodes(i, 'code')) == 0) {
        text <- html_nodes(i, xpath = '../address/code/text()')
        v <- paste(trimws(text), collapse = '\r\n')
    } else {
        v <- html_text(html_nodes(i, 'code'))
    }
    data[[n]] = v
}

print(data)
Run Code Online (Sandbox Code Playgroud)

此代码生成包含所有表单项的命名列表,但可以修改以生成嵌套列表或更合适的结构。
在这一点上,我必须说我对 R 的经验很少,因此这段代码可能不是一个好的编码示例。非常欢迎任何提示或其他评论。