#r #authentication #web-scraping #token #httr
#r #аутентификация #очистка веб-страниц #токен #httr
Вопрос:
Я хочу очистить данные агентов на этом веб-сайте: https://thep.hoaphat.com.vn/distribution-systems
Я использую следующий код, но получаю «Ошибку несоответствия токена»:
httr::POST(
url = "https://thep.hoaphat.com.vn/ajax/load_agency",
body = list(
type = "web",
product_id = "7",
province_id = "10",
member_type = "1"
),
encode = "form"
) -> res
dat <- httr::content(res)
str(dat)
Как я могу это решить?
Комментарии:
1. Для страницы требуется
x-csrf-token
заголовок иXSRF-TOKEN
значение cookie. Я думаю, что это какая-то защита.2. Да, я так думаю, но когда я пытаюсь добавить заголовки в сообщение функции, это все равно не работает.
3. Это защита, она не должна быть одинаковой каждый раз. Попробуйте использовать
RSelenium
.4. спасибо, RSelenium потрясающий, но я часто получаю ошибку при его использовании, ошибки связаны с версией java или браузера….
Ответ №1:
Данные запрашиваются для https://thep.hoaphat.com.vn/ajax/load_agency
Сделайте небольшое обратное проектирование, я обнаружил, что запрос отправляется из этого JS-файла: https://thep.hoaphat.com.vn/assets/js/functions.min.js
Взгляните на эту функцию:
function loadAjax(t, e, n) {
var a = {
beforeSend: function() {},
success: function() {}
};
$.extend(a, n),
$.ajax({
headers: {
"X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content")
},
type: "POST",
url: t,
data: e,
beforeSend: function() {
$("#loading_box").css({
visibility: "visible",
opacity: 0
}).animate({
opacity: 1
}, 200),
a.beforeSend()
},
success: function(t) {
$("#loading_box").animate({
opacity: 0
}, 200, function() {
$("#loading_box").css("visibility", "hidden")
}),
a.success(t)
},
error: function(t) {
$("#loading_box").animate({
opacity: 0
}, 200, function() {
$("#loading_box").css("visibility", "hidden")
}),
alert("Có lỗi xảy ra!")
}
})
}
Вы можете видеть, что токен взят из meta
тега с именем csrf-token
. Теперь вы можете очистить это значение токена и отправить запрос для получения данных:
library(rvest)
pg <- html_session("https://thep.hoaphat.com.vn/distribution-systems")
token <- read_html(pg) %>%
html_node(xpath = "//meta[@name='csrf-token']") %>% html_attr("content")
pg <-
pg %>% rvest:::request_POST(
"https://thep.hoaphat.com.vn/ajax/load_agency",
config = httr::add_headers(`x-csrf-token` = token),
body = list(
type = "web",
product_id = 1, # choose product
province_id = 50, # choose province
`member_type[]` = 1, # agency level 1
`member_type[]` = 2 # agency level 2
)
)
data <- httr::content(pg$response)$data
Результат: