Выдать страницу очистки с помощью кнопки «Загрузить еще» с помощью команды rvest. - PullRequest
3 голосов
/ 13 мая 2019

Я хочу получить ссылки на банкоматы, указанные на этой странице: https://coinatmradar.com/city/345/bitcoin-atm-birmingham-uk/

Нужно ли мне что-то сделать с кнопкой «загрузить еще» внизу страницы?

Я использовал инструмент выбора, который вы можете загрузить для chrome, чтобы выбрать путь CSS.

Я написал приведенный ниже блок кода, и кажется, что он возвращает только первые десять ссылок.

library(rvest)

base <- "https://coinatmradar.com/city/345/bitcoin-atm-birmingham-uk/"
base_read <- read_html(base)
atm_urls <- html_nodes(base_read, ".place > a")
all_urls_final <- html_attr(atm_urls, "href" )
print(all_urls_final)

Я ожидал, что смогу получить все ссылки на банкоматы, перечисленные в этой области, но мой код R этого не сделал.

Любая помощь будет великолепна. Извините, если это действительно простой вопрос.

Ответы [ 2 ]

5 голосов
/ 14 мая 2019

Вы должны попробовать RSelenium . Я могу получить ссылки со следующим кодом:

# install.packages("RSelenium")
library(RSelenium)
library(rvest)

# Download binaries, start driver, and get client object.
rd <- rsDriver(browser = "firefox", port = 4444L)
ffd <- rd$client

# Navigate to page.
ffd$navigate("https://coinatmradar.com/city/345/bitcoin-atm-birmingham-uk/")

# Find the load button and assign, then send click event.
load_btn <- ffd$findElement(using = "css selector", ".load-more .btn")
load_btn$clickElement()

# Wait for elements to load.
Sys.sleep(2)

# Get HTML data and parse
html_data <- ffd$getPageSource()[[1]]
html_data %>% 
    read_html() %>% 
    html_nodes(".place a:not(.operator-link)") %>% 
    html_attr("href")

#### OUTPUT ####

#  [1] "/bitcoin_atm/5969/bitcoin-atm-shitcoins-club-birmingham-uk-bitcoin-embassy/"                   
#  [2] "/bitcoin_atm/7105/bitcoin-atm-general-bytes-northampton-costcutter/"                           
#  [3] "/bitcoin_atm/4759/bitcoin-atm-general-bytes-birmingham-uk-costcutter/"                         
#  [4] "/bitcoin_atm/2533/bitcoin-atm-general-bytes-birmingham-uk-londis-# convenience/"                 
#  [5] "/bitcoin_atm/5458/bitcoin-atm-general-bytes-coventry-agg-african-restaurant/"                  
#  [6] "/bitcoin_atm/711/bitcoin-atm-general-bytes-coventry-bigs-barbers/"                             
#  [7] "/bitcoin_atm/5830/bitcoin-atm-general-bytes-telford-bpred-lion-service-station/"               
#  [8] "/bitcoin_atm/5466/bitcoin-atm-general-bytes-nottingham-24-express-off-licence/"                
#  [9] "/bitcoin_atm/4615/bitcoin-atm-general-bytes-northampton-costcutter/"                           
# [10] "/bitcoin_atm/4841/bitcoin-atm-lamassu-worcester-computer-house/"                               
# [11] "/bitcoin_atm/3150/bitcoin-atm-bitxatm-leicester-keshs-wines-and-newsagents-braustone/"         
# [12] "/bitcoin_atm/2948/bitcoin-atm-bitxatm-coventry-nisa-local/"                                    
# [13] "/bitcoin_atm/4742/bitcoin-atm-bitxatm-birmingham-uk-custcutter-coventry-road-hay-mills/"       
# [14] "/bitcoin_atm/4741/bitcoin-atm-bitxatm-derby-michaels-drink-store-alvaston/"                    
# [15] "/bitcoin_atm/4740/bitcoin-atm-bitxatm-birmingham-uk-nisa-local-crabtree-# hockley/"              
# [16] "/bitcoin_atm/4739/bitcoin-atm-bitxatm-birmingham-uk-nisa-local-subway-boldmere/"               
# [17] "/bitcoin_atm/4738/bitcoin-atm-bitxatm-birmingham-uk-ashtree-convenience-store/"                
# [18] "/bitcoin_atm/4737/bitcoin-atm-bitxatm-birmingham-uk-nisa-local-finnemore-road-bordesley-green/"
# [19] "/bitcoin_atm/3160/bitcoin-atm-bitxatm-birmingham-uk-costcutter/" 
3 голосов
/ 14 мая 2019

Когда вы нажимаете Показать больше, страница отправляет запрос XHR POST для получения дополнительных результатов, используя смещение 10 (предполагается, что результаты поступают партиями по 10) из текущего набора. Вы можете имитировать это, пока у вас есть следующие параметры в теле поста (я подозреваю, что необходимы только нижние 3)

'direction' : 1
'sort' : 1
'offset' : 10
'pagetype' : 'city'
'pageid' : 345

И требуется следующий заголовок запроса (по крайней мере, в реализациях Python)

'X-Requested-With' : 'XMLHttpRequest'

Вы отправите это правильно и получите ответ, содержащий дополнительный контент. Примечание: содержимое упаковано в ! [CDATA []] как указание на то, что содержимое не должно интерпретироваться как xml - вам необходимо учитывать это, извлекая содержимое для анализа.

Общее количество банкоматов возвращается с имеющейся у вас исходной страницы и с помощью селектора css

.atm-number

Вы можете разделить на &nbsp;, взять верхнее граничное значение из разделения и преобразовать в int. Затем вы можете рассчитать каждое смещение, необходимое для соответствия этому итоговому значению (которое используется в цикле в качестве последовательного параметра смещения до достижения общего значения), например Всего будет 19 результатов, всего 2 запроса, с дополнительным содержанием 1 запрос со смещением 10.

...