网页抓取目录 - R

Web scraping directory - R

我是网络抓取的新手,我正在尝试提取该网站上公司的信息: http://apps.asiainsurancereview.com/IDA/Asp/CompanyList.aspx?company=&type=&jobType=&country=&search=company

我要提取的信息如下面的link(这是第一个link中第一个在table中列出的公司):

http://apps.asiainsurancereview.com/IDA/Asp/IDA_CompanyDetails.aspx?person=&designation=&company=&country=&search=company&comslno=272

我正在尝试提取第一个 link 中列出的每个公司的详细信息(phone 号码、电子邮件、网站等),然后将它们导出到一个 .csv 文件中。

但是,问题是网站URL中的数字没有顺序,例如第一家公司的信息URL如上,以"comslno=272"结尾,但第二家公司的 URL 以 "comslno=1824"

结尾

我试过如下的R代码(我知道这可能不可行)

library(rvest)
library(dplyr)

directory <- lapply(paste0('http://apps.asiainsurancereview.com/IDA/Asp/IDA_CompanyDetails.aspx?person=&designation=&company=&country=&search=company&comslno=', 1:9999999),
                    function(url){
                      url %>% read_html() %>% 
                        html_nodes("tr td") %>% 
                        html_text()
                    })

write.csv(directory, file = "directory.csv")

但是,它不起作用,因为 URL 不适用于 1:9999999 之间的所有数字。

例如以"comslno=1"和"comslno=2"结尾的URL存在,但"comslno=3"不存在

有没有办法让 R 忽略那些不存在的 URL 并继续这个过程?或者还有其他更简单的方法吗?

您可以使用 tryCatch.

library(rvest)

directory <- lapply(paste0('http://apps.asiainsurancereview.com/IDA/Asp/IDA_CompanyDetails.aspx?person=&designation=&company=&country=&search=company&comslno=', 
                           c(2:5, 1)),
                    function(url) {
                      tryCatch(
                        url %>% read_html() %>%
                          html_nodes("tr td") %>% 
                          html_text(),
                        error = function(e) NULL
                        )
                    })

write.csv(do.call(rbind, directory), file = "directory.csv")

如果您只想要第一页(或者您需要为其他页面合并一个循环),您可以使用 css 选择器来定位 DOM 中的适当节点并提取这些匹配节点的适当属性将为您提供连接到基数 url 上所需的数字。我展示了两个不同的例子。不加注释的应该会更快。

library(rvest)
library(magrittr)

base = 'http://apps.asiainsurancereview.com/IDA/Asp/IDA_CompanyDetails.aspx?person=&designation=&company=&country=&search=company&comslno='
p <- read_html('http://apps.asiainsurancereview.com/IDA/Asp/CompanyList.aspx?company=&type=&jobType=&country=&search=company')
#urls <- paste0(base, p %>% html_nodes('#tableList tr[id]') %>% html_attr('id'))
urls <- paste0(base, p %>% html_nodes('.select') %>% html_attr('value'))

您可以简单地计算要循环的页数

t <- p %>% html_node('#MainContent_pagination li:last-child') %>% html_text() %>% trimws()
total_results <- as.numeric(tail(str_split(t,' ')[[1]],1))
results_per_page = 15
num_pages = ceiling(total_results / results_per_page)

与尝试从 1 到 9,999,999 相比,使用从 1 循环到 num_pages、收集实际 ID 然后循环最后一组 url 的策略,您将发出更少的请求。