使用 "Load more" 按钮和 rvest 发布抓取页面
Issue scraping page with "Load more" button with rvest
我想获取此页面上列出的 atms 的链接:https://coinatmradar.com/city/345/bitcoin-atm-birmingham-uk/
我需要对页面底部的 'load more' 按钮做些什么吗?
我一直在使用 select 或者您可以下载 chrome 到 select 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 代码没有这样做。
任何帮助都会很棒。抱歉,如果这是一个非常简单的问题。
当您单击“显示更多”时,页面会使用当前集合的偏移量 10(建议结果以 10 个为一组)执行 XHR POST 请求以获取更多结果。只要你在 post body 中有以下参数,你就可以模仿这个(我怀疑只有底部的 3 个是必需的)
'direction' : 1
'sort' : 1
'offset' : 10
'pagetype' : 'city'
'pageid' : 345
并且需要以下请求 header(至少在 Python 实施中)
'X-Requested-With' : 'XMLHttpRequest'
您发送正确,您将收到包含附加内容的回复。注意:内容包含在 ![CDATA[]] 中,作为内容不应被解释为 xml 的说明 - 您需要通过提取其中的内容进行解析来说明这一点。
atms 总数从您拥有的原始页面返回,并带有 css 选择器
.atm-number
您可以在
上拆分并从拆分中获取上限值并转换为 int。然后,您可以计算满足该总数所需的每个偏移量(在循环中用作连续偏移参数,直到达到总数)例如19 个结果将是 2 个请求,其中 1 个请求位于偏移量 10 处,用于附加内容。
你应该 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/"
我想获取此页面上列出的 atms 的链接:https://coinatmradar.com/city/345/bitcoin-atm-birmingham-uk/
我需要对页面底部的 'load more' 按钮做些什么吗?
我一直在使用 select 或者您可以下载 chrome 到 select 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 代码没有这样做。
任何帮助都会很棒。抱歉,如果这是一个非常简单的问题。
当您单击“显示更多”时,页面会使用当前集合的偏移量 10(建议结果以 10 个为一组)执行 XHR POST 请求以获取更多结果。只要你在 post body 中有以下参数,你就可以模仿这个(我怀疑只有底部的 3 个是必需的)
'direction' : 1
'sort' : 1
'offset' : 10
'pagetype' : 'city'
'pageid' : 345
并且需要以下请求 header(至少在 Python 实施中)
'X-Requested-With' : 'XMLHttpRequest'
您发送正确,您将收到包含附加内容的回复。注意:内容包含在 ![CDATA[]] 中,作为内容不应被解释为 xml 的说明 - 您需要通过提取其中的内容进行解析来说明这一点。
atms 总数从您拥有的原始页面返回,并带有 css 选择器
.atm-number
您可以在
上拆分并从拆分中获取上限值并转换为 int。然后,您可以计算满足该总数所需的每个偏移量(在循环中用作连续偏移参数,直到达到总数)例如19 个结果将是 2 个请求,其中 1 个请求位于偏移量 10 处,用于附加内容。
你应该 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/"