使用RVest使用“加载更多”按钮发布抓取页面

时间:2019-05-13 19:49:17

标签: r web-scraping screen-scraping rvest

我想获得此页面上列出的atm的链接:https://coinatmradar.com/city/345/bitcoin-atm-birmingham-uk/

我是否需要对页面底部的“加载更多”按钮做些事情?

我一直在使用选择器工具,可以下载chrome来选择CSS路径。

我已经写了下面的代码块,它似乎只检索了前十个链接。

{{1}}

我希望能够检索到该区域中列出的atm的所有链接,但我的R代码尚未这样做。

任何帮助都会很棒。抱歉,这是一个非常简单的问题。

2 个答案:

答案 0 :(得分:5)

您应该尝试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/" 

答案 1 :(得分:3)

单击“显示更多”时,页面将使用XHR POST请求以获取更多结果,该结果与当前集合的偏移量为10(建议结果以10为批次)。只要您在帖子正文中具有以下参数,就可以模仿这一点(我怀疑只有底部3个元素是必需的)

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

并且以下请求标头是必需的(至少在Python实现中)

'X-Requested-With' : 'XMLHttpRequest'

您正确发送了该邮件,您将收到包含其他内容的回复。注意:将内容包装在![CDATA[]]中,作为指示内容不应解释为xml的指令-您需要通过提取内容进行解析来解决该问题。

从您拥有的原始页面以及使用CSS选择器返回的atm总数

.atm-number

您可以在&nbsp;上进行拆分,并从拆分中获取上限值,然后转换为int。然后,您可以计算满足该总数所需的每个偏移量(在循环中用作连续的偏移量参数,直到达到总数),例如19个结果将是总共2个请求,其中1个请求在偏移量10处的其他内容。