Каталог веб-скребков - R - PullRequest
       7

Каталог веб-скребков - R

0 голосов
/ 10 апреля 2020

Я новичок в веб-поиске здесь и пытаюсь извлечь информацию о компаниях на этом сайте: http://apps.asiainsurancereview.com/IDA/Asp/CompanyList.aspx?company=&type=&jobType=&country=&search=company

И информация, которую я хочу извлечь, выглядит как ссылка ниже (это первая компания, которая указана в таблице из первой ссылки выше):

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

Я пытаюсь извлечь детали каждой из компаний (номер телефона, адрес электронной почты, веб-сайт и т. д.), перечисленных в первой ссылке, затем экспортируйте их в файл .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.

Например, URL, заканчивающийся на «comslno = 1» и «comslno = 2», существует, но «comslno = 3» не существует.

Есть ли способ заставить R игнорировать эти несуществующий URL и продолжить процесс? Или есть другие более простые способы сделать это?

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Если вам нужна только первая страница (или вам нужно будет включить все oop для других страниц), вы можете использовать селектор 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'))

Вы можете вычислить количество страниц до l oop просто

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 до num_pages, собирая фактические идентификаторы и затем зацикливая последний набор URL, чем вы пытаетесь от 1 до 9,999,999.

0 голосов
/ 10 апреля 2020

Вы можете использовать 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")
...