rvest: не может заставить follow_link () или jump_to перейти к неупорядоченному списку ссылок - PullRequest
0 голосов
/ 12 января 2020

Я перебираю URL-адрес веб-сайта <- "<a href="https://www.rsaconference.com/usa/expo-and-sponsors" rel="nofollow noreferrer">https://www.rsaconference.com/usa/expo-and-sponsors"

Этот веб-сайт содержит ссылки на алфавиты, например, AB C D .... Z. Вот здесь html код скопирован с сайта. Если я хочу перейти по ссылке, например, на букву 'B' или 'L', как лучше всего использовать пакет rvest?

        <ul class="search-a-z" data-field-id="search__filter-letter">
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter search-a-z__filter--disabled" href="#search-a-z" title="Filter results by  "> </a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by #">#</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by A">A</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by B">B</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by C">C</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by D">D</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by E">E</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by F">F</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by G">G</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by H">H</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by I">I</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by J">J</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by K">K</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by L">L</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by M">M</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by N">N</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by O">O</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter search-a-z__filter--disabled" href="#search-a-z" title="Filter results by &#216;">&#216;</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by P">P</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by Q">Q</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by R">R</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by S">S</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by T">T</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by U">U</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by V">V</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by W">W</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by X">X</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by Y">Y</a></li>
        <li class="search-a-z__item"><a class="link link--default search-a-z__filter " href="#search-a-z" title="Filter results by Z">Z</a></li>
<li class="search-a-z__item search-a-z__item--clear">
    <a class="link link--default search-a-z__clear" href="#search-a-z" title="Clear filter">Clear Filter</a>
</li>

Я попробовал следующее, но сразу потерпел неудачу:

s <- html_session(url)     
s %>% follow_link(i="Filter results by B")

Ошибка: нет ссылок с текстом 'Фильтровать результаты по B'

Я также пробовал,

s %>% html_node(".search-a-z__item:nth-child(4)") %>% follow_link()

Ошибка в follow_link (.): is.session (x) не является ИСТИННЫМ

Моя цель состоит в том, чтобы l oop через каждую из ссылок от А до Я и вычищать названия компаний на каждой странице.

Я искал много вопросов по stackoverflow, например, Цикл по списку веб-страниц с rvest follow_link и Как очистить эти ссылки с follow_link в R? , но не могу разобраться это.

1 Ответ

1 голос
/ 13 января 2020

Когда вы нажимаете на каждую букву на странице, javascript отправляет запрос xhr POST на другой URL-адрес на сервере и кодирует запрос как вложенный JSON. Плохая новость заключается в том, что вам нужно будет сделать то же самое, чтобы очистить данные. Хорошая новость заключается в том, что вы можете получить все данные за один прием, если правильно напишите запрос.

Вам понадобится пакет Rcurl или httr, чтобы обеспечить этот уровень контроля над запросами http.

# We'll use httr and tidyverse
library(tidyverse)
library(httr)

# This is the actual url that sends the JSON data
url <- "https://www.rsaconference.com/api/Search/FilteredSearch"

# These are the parameters we want to post. Note I have left the searchFilterLetter
# field blank so it sends us everything.
params <- list(defaultFilterContentType = "Exhibitor",
               searchInput = "",
               searchFilterLetter = "",
               exhibitorLocation = "none",
               exhibitorType = "none",
               filterTopicsTypeahead = "",
               filterTopics = "",
               searchSort = "alpha",
               filterRegion = "USA",
               filterConferenceYear = "2020")

# A complicating factor is that the above parsmeters are wrapped inside another
# parameter called formDsta, along with two other parameters. Note I want all
# exhibitors so I set resultsPerPage to 1000
body <- list(page = 1, resultsPerPage = 1000, formData = params)

# Now we post the form to the url and read the parsed JSON response.
# I have selected two fields from the resulting list.
POST(url, body = body, encode = "json")                     %>%
content("parsed")                                           %>%
`[[`("results")                                             %>%
lapply(function(x) data.frame(name = x$title, url = x$url)) %>%
{do.call("rbind", .)}                                       %>%
as_tibble                                                    ->
all_exhibitors

А вот и ваши результаты ...

print(all_exhibitors)
#> # A tibble: 635 x 2
#>    name                     url                                                 
#>    <fct>                    <fct>                                               
#>  1 1TOUCH.io                /usa/expo-and-sponsors/1touchio                     
#>  2 360 Group                /usa/expo-and-sponsors/360-security-group           
#>  3 Abnormal Security        /usa/expo-and-sponsors/abnormal-security-corporation
#>  4 Acalvio Technologies     /usa/expo-and-sponsors/acalvio-technologies         
#>  5 Accedian                 /usa/expo-and-sponsors/accedian-networks            
#>  6 achelos GmbH             /usa/expo-and-sponsors/achelos-gmbh                 
#>  7 ACID Technologies        /usa/expo-and-sponsors/acid-technologies            
#>  8 Active Defense Institute /usa/expo-and-sponsors/active-defense-institute-ltd 
#>  9 Acunetix                 /usa/expo-and-sponsors/acunetix                     
#> 10 Adaptiva                 /usa/expo-and-sponsors/adaptiva                     
#> # ... with 625 more rows
...