【问题标题】:HTTR POST in r tokenr 令牌中的 HTTR POST
【发布时间】:2020-09-18 15:51:15
【问题描述】:

我想在这个网站上抓取代理的数据: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)

我该如何解决?

【问题讨论】:

  • 该页面需要x-csrf-token 标头和XSRF-TOKEN cookie 值。我认为这是某种保护。
  • 是的,我想是的,但是当我尝试在函数 POST 中添加标头时,它仍然不起作用。
  • 这是一种保护,不应该每次都一样。尝试使用RSelenium
  • 谢谢,RSelenium 很棒,但我在使用时经常出错,错误与 java 版本或浏览器有关,......

标签: r authentication web-scraping token httr


【解决方案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!")
        }
    })
}

您可以看到令牌来自名称为csrf-tokenmeta 标记。现在您可以抓取该令牌值并发送请求以获取数据:

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

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多