以编程方式刮取R中的响应标头

我正在尝试访问突出显示的响应标题:下面的屏幕截图中的位置文本仅使用R及其基于卷曲的webscraping库.您可以在任何网页浏览器中轻松访问这一点,方法是访问 http://www.worldvaluessurvey.org/WVSDocumentationWVL.jsp,点击任何数据文件的下载,并填写协议表单.下载在网络浏览器中自动开始.

我相信获得有效的cookie的唯一方法是使用库(curlconverter)(参见How to download a file behind a semi-broken javascript asp function with R),但该回答似乎不足以以编程方式确定文件的http url,只有在已知的时候下载压缩文件.

我已经粘贴了一些代码,使用不同的httr和curlconverter代码,我已经玩了,但我在这里遗漏了一些东西.再次,唯一的目标是以编程方式在R(跨平台)内完全确定突出显示的文本.

library(curlconverter)
library(httr)

browserPOST <-
    "curl 'http://www.worldvaluessurvey.org/AJDownload.jsp'
    -H 'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
    -H 'Accept-Encoding:gzip,deflate'
    -H 'Accept-Language:en-US,en;q=0.8'
    -H 'Cache-Control:max-age=0'
    --compressed -H 'Connection:keep-alive'
    -H 'Content-Length:188'
    -H 'Content-Type:application/x-www-form-urlencoded'
    -H 'Cookie:ASPSESSIONIDCASQAACD=IBLGBFOAEHFILMMJJCFEOEMI; JSESSIONID=50DABDEDD0B2FC370C415B4BD1855260; __atuvc=13%7C45; __atuvs=58224f37d312c42400c'
    -H 'Host:www.worldvaluessurvey.org'
    -H 'Origin:http://www.worldvaluessurvey.org'
    -H 'Referer:http://www.worldvaluessurvey.org/AJDownloadLicense.jsp'
    -H 'Upgrade-Insecure-Requests:1'
    -H 'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/54.0.2840.71 Safari/537.36'"

form_data <-
    list( 
        ulthost = "WVS",CMSID = "",LITITLE = "",LINOMBRE = "fas",LIEMPRESA = "asf",LIEMAIL = "asdf",LIPROJECT = "asfd",LIUSE = "1",LIPURPOSE = "asdf",LIAGREE = "1",DOID = "3996",CndWAVE = "-1",SAID = "-1",AJArchive = "WVS Data Archive",EdFunction = "",DOP = "" 
    )   



getDATA <- (straighten(browserPOST) %>% make_req)[[1]]()

a <- VERB(verb = "POST",url = "http://www.worldvaluessurvey.org/AJDownload.jsp",httr::add_headers(Accept = "text/html,*/*;q=0.8",`Accept-Encoding` = "gzip,deflate",`Accept-Language` = "en-US,en;q=0.8",`Cache-Control` = "max-age=0",Connection = "keep-alive",`Content-Length` = "188",Host = "www.worldvaluessurvey.org",Origin = "http://www.worldvaluessurvey.org",Referer = "http://www.worldvaluessurvey.org/AJDownloadLicense.jsp",`Upgrade-Insecure-Requests` = "1",`User-Agent` = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/54.0.2840.71 Safari/537.36"),httr::set_cookies(`Cookie:ASPSESSIONIDCASQAACD` = "IBLGBFOAEHFILMMJJCFEOEMI",JSESSIONID = "50DABDEDD0B2FC370C415B4BD1855260",`__atuvc` = "13%7C45",`__atuvs` = "58224f37d312c42400c"),encode = "form",body=form_data)

解决方法

这是一个很好的挑战!

问题与R语言无关.如果我们尝试将一些数据发布到下载脚本,我们将以任何语言获得相同的结果.我们必须在这里处理某种安全的“模式”.该网站限制用户检索文件URL,并且要求他们填写表单以提供数据,以便提供这些链接.如果浏览器可以检索这些链接,那么我们也可以通过编写适当的HTTP调用.事实上,我们需要知道我们必须做出哪些呼叫.为了找到这一点,我们需要看到网站在有人点击下载时进行的个人呼叫.这是我在一个成功的302 AJDownload.jsp POST调用之前发现几个电话:

我们可以清楚地看到它,如果我们看AJDocumentation.jsp的源码,它通过使用jQuery $.get来进行这些调用:

$.get("http://ipinfo.io?token=xxxxxxxxxxxxxx",function (response) {
    var geodatos=encodeURIComponent(response.ip+"\t"+response.country+"\t"+response.postal+"\t"+
    response.loc+"\t"+response.region+"\t"+response.city+"\t"+
    response.org);

    $.get("jdsStatJD.jsp?ID="+geodatos+
        "&url=http%3A%2F%2Fwww.worldvaluessurvey.org%2FAJDocumentation.jsp&referer=null&cms=Documentation",function (resp2) {
    });
},"jsonp");

然后,下面几个电话,我们可以看到成功的POST /AJDownload.jsp,状态为302移动临时和在其响应头中的想要的位置:

HTTP/1.1 302 Moved Temporarily
Content-Length: 0
Content-Type: text/html
Location: http://www.worldvaluessurvey.org/wvsdc/CO00001/F00003724-WVS_Longitudinal_1981-2014_stata_dta_v_2015_04_18.zip
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Thu,01 Dec 2016 16:24:37 GMT

所以这是这个网站的安全机制.在用户即将通过点击链接开始下载之前,它使用ipinfo.io存储有关其IP,位置甚至ISP组织的访问者信息.接收这些数据的脚本是/jdsStatJD.jsp.我没有使用ipinfo.io,也没有使用这个服务的API密钥(隐藏在我的屏幕截图上),而是创建了一个虚拟的有效数据序列,只是为了验证请求. “受保护”文件的表单数据根本不需要.可以下载文件而不发布这些数据.

此外,curlconverter库不是必需的.所有我们要做的,是使用httr库简单的GET和POST请求.我想指出的一个重要部分是,为了阻止httr POST功能跟随在上次调用时接收到302状态的Location头,我们需要使用config setting config(followlocation = FALSE),这当然会阻止它从跟随位置,让我们从标题获取位置.

OUTPUT

我的R脚本可以从命令行运行,它可以接受参数的DOID数值来获取所需的文件.例如,如果要获取文件WVS_Longitudinal_1981-2014_stata_dta_v_2015_04_18的链接,那么在使用Rscript命令调用它时,我们必须将其DOID(这是3724)添加到脚本的末尾:

Rscript wvs_fetch_downloads.r 3724
[1] "http://www.worldvaluessurvey.org/wvsdc/CO00001/F00003724-WVS_Longitudinal_1981-2014_stata_dta_v_2015_04_18.zip"

我已经创建了一个R函数来通过传递DOID来获取所需的每个文件位置:

getFileById <- function(fileId)

您可以通过直接传递DOID来删除命令行参数解析并使用该函数:

#args <- commandArgs(TRUE)
#if(length(args) == 0) {
#   print("No file id specified. Use './script.r ####'.")
#   quit("no")
#}

#fileId <- args[1]
fileId <- "3724"

# DOID=3843 : WVS_EVS_Integrated_Dictionary_Codebook v_2014_09_22 (Excel)
# DOID=3844 : WVS_Values Surveys Integrated Dictionary_TimeSeries_v_2014-04-25 (Excel)
# DOID=3725 : WVS_Longitudinal_1981-2014_rdata_v_2015_04_18
# DOID=3996 : WVS_Longitudinal_1981-2014_sas_v_2015_04_18
# DOID=3723 : WVS_Longitudinal_1981-2014_spss_v_2015_04_18
# DOID=3724 : WVS_Longitudinal_1981-2014_stata_dta_v_2015_04_18

getFileById(fileId)

最终R工作脚本

library(httr)

getFileById <- function(fileId) {
    response <- GET(
        url = "http://www.worldvaluessurvey.org/AJDocumentation.jsp?CndWAVE=-1",add_headers(
            `Accept` = "text/html,`Connection` = "keep-alive",`Host` = "www.worldvaluessurvey.org",`User-Agent` = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0",`Content-type` = "application/x-www-form-urlencoded",`Referer` = "http://www.worldvaluessurvey.org/AJDownloadLicense.jsp",`Upgrade-Insecure-Requests` = "1"))

    set_cookie <- headers(response)$`set-cookie`
    cookies <- strsplit(set_cookie,';')
    cookie <- cookies[[1]][1]

    response <- GET(
        url = "http://www.worldvaluessurvey.org/jdsStatJD.jsp?ID=2.72.48.149%09IT%09undefined%0941.8902%2C12.4923%09Lazio%09Roma%09Orange%20SA%20Telecommunications%20Corporation&url=http%3A%2F%2Fwww.worldvaluessurvey.org%2FAJDocumentation.jsp&referer=null&cms=Documentation",add_headers(
            `Accept` = "*/*",`X-Requested-With` = "XMLHttpRequest",`Referer` = "http://www.worldvaluessurvey.org/AJDocumentation.jsp?CndWAVE=-1",`Cookie` = cookie))

    post_data <- list( 
        ulthost = "WVS",DOID = fileId,DOP = "",PUB = "")  

    response <- POST(
        url = "http://www.worldvaluessurvey.org/AJDownload.jsp",config(followlocation = FALSE),`Cookie` = cookie),body = post_data,encode = "form")

    location <- headers(response)$location
    location
}

args <- commandArgs(TRUE)
if(length(args) == 0) {
    print("No file id specified. Use './script.r ####'.")
    quit("no")
}

fileId <- args[1]

# DOID=3843 : WVS_EVS_Integrated_Dictionary_Codebook v_2014_09_22 (Excel)
# DOID=3844 : WVS_Values Surveys Integrated Dictionary_TimeSeries_v_2014-04-25 (Excel)
# DOID=3725 : WVS_Longitudinal_1981-2014_rdata_v_2015_04_18
# DOID=3996 : WVS_Longitudinal_1981-2014_sas_v_2015_04_18
# DOID=3723 : WVS_Longitudinal_1981-2014_spss_v_2015_04_18
# DOID=3724 : WVS_Longitudinal_1981-2014_stata_dta_v_2015_04_18

getFileById(fileId)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、信号(signal)、消息队列、共享内存、信号量、套接字(socket)。管道用于具有亲缘关系的进程间通信,有名管道的每个管道具有名字,使没有亲缘关系的进程间也可以通信。信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别对整个系统的性能做统计,而进程级别则具体到进程,为每个进程维护统计信息。&#xD;&#xA;&#xD;&#xA;按实现原理分,可分为基于计数器和跟踪以及剖析。含义如下:&#xD;&#xA;&#xD;&#xA;计数器:内核维护的统计数据,通常为无符号整型,用于对发生的事件计数,比如,网络包接收计数器,磁
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书验证,详细追踪整个交互过程,可用于调用网络后端接口,诊断http和https网络服务故障。
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满、fd泄漏等问题。命令包括ping、fping、tcpdump、lsof、netstat、/proc/$pid/fd、du、grep、traceroute、dig。
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的进程数目,用uptime查看到负载很高,既有可能是CPU利用率高,也可能是大量在等待io的进程导致,用mpstat查看每个CPU的使用情况,查看CPU的使用率或者CPU花在等待io的时间,接着用pidstat定位具体的进程
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线程切换及中断切换,进程切换的开销较大,除了需要保存寄存器和程序计数器中的值还需保存全局变量、栈等到内存中,以便下次运行恢复,而同一进程中的线程切换开销会小很多,只需更新寄存器和线程独有的栈,共享资源如打开的文件、全局变量等无需切换,当硬件中
1.top命令 作用:该命令可以按CPU使用.内存使用和执行时间对任务进行排序,常用来监控系统中占用CPU或内存较高的程序及CPU和内存的负载。 默认视图: 当想看系统负载时,可观察汇总的%CPU中的us用户进程和sy系统进程是否占用CPU很高,相加接近100%就说明占用很高了,有些程序可能得不到及
文章浏览阅读1.8k次,点赞63次,收藏54次。Linux下的目录权限!!!粘滞位!!!超详解!!!
文章浏览阅读1.6k次,点赞44次,收藏38次。关于Qt的安装、Windows、Linux、MacBook_mack book 安装qt
本文介绍了使用shell脚本编写一个 Hello
文章浏览阅读1.5k次,点赞37次,收藏43次。【Linux】初识Linux——了解操作系统的发展历史以及初次体验Linux编程环境
文章浏览阅读3k次,点赞34次,收藏156次。Linux超详细笔记,个人学习时很认真的记录的,觉得好的麻烦点个赞。
文章浏览阅读6.8k次,点赞109次,收藏114次。【Linux】 OpenSSH_9.3p1 升级到 OpenSSH_9.5p1(亲测无问题,建议收藏)_openssh_9.5p1
文章浏览阅读3.5k次,点赞93次,收藏78次。初识Linux中的线程,理解线程的各种概念,理解进程地址空间中的页表转换,介绍pthread线程库并理解线程库!
文章浏览阅读863次。出现此问题为Linux文件权限问题,解决方案为回到引擎目录执行命令。输入用户密码后运行./UnrealEditor。_increasing per-process limit of core file size to infinity.
文章浏览阅读2.9k次。使用文本编辑器:打开CSV文件,并使用文本编辑器(如Notepad++、Sublime Text、Visual Studio Code等)来查看文件的字符编码格式。通常在编辑器的底部状态栏或设置中可以找到当前编码的显示。请注意,上述方法并非绝对准确,特别是当文件没有明确的编码标识时。因此,如果你发现CSV文件在不同的工具或方法中显示不同的编码格式,可能需要进行进一步的分析和判断,或者尝试使用不同的编码转换方法。该命令将输出文件的MIME类型和编码信息。使用命令行工具:在命令行中,你可以使用。_shell读取csv文件逐行处理
本文介绍了如何在Linux系统中升级gcc版本,以便更好地支持C++11及以上版本的新特性。通过升级gcc,可以提升编译器的功能和性能,获得更好的开发体验。详细的步骤和方法请参考原文链接。
文章浏览阅读4.4k次,点赞6次,收藏19次。Mosquitto是一个开源的MQTT消息代理服务器。MQTT是一个轻量级的、基于发布/订阅模式的消息传输协议。 mosquitto的安装使用比较简单,可以方便的来进行一些测试。_linux mosquitto
文章浏览阅读7.2k次,点赞2次,收藏12次。Linux中,用于根目录下有一个.ssh目录,保存了ssh相关的key和一些记录文件。_~/.ssh/
文章浏览阅读4.5k次,点赞5次,收藏18次。首先需要安装 snmp ,使用下面的命令进行安装安装完毕之后,使用下面的命令查看是否安装成功当命令行显示如图即为安装成功。_snmp工具