标签: rvest

在R中使用rvest跟随页面重定向

我是R和rvest的新手.我正在尝试使用这些来从网站(www.medicinescomplete.com)获取信息,该网站允许使用雅典学术登录系统登录.在浏览器中,当您单击雅典登录按钮时,它会将您转移到雅典登录表单.提交用户凭据后,表单然后将浏览器重定向回原始站点,但登录后.

我使用submit_form()函数将凭据提交到athens表单,这将返回200代码.但是,R不像浏览器那样遵循重定向,如果我使用jump_to()命令返回到原始站点,则它不会登录.我怀疑登录页面返回的重定向链接可能包含登录我需要的凭据,但我不知道如何找到链接并使用rvest发送它

有没有人弄清楚如何使用rvest通过雅典登录或有任何想法如何使其遵循自动重定向?

我用来做到这一点的代码是(登录凭据已更改):

library(rvest)
library(magrittr)

url <- "https://www.medicinescomplete.com/about/"
mcsession <- html_session(url)
mcsession <- jump_to(mcsession, "/mc/athens.htm?   uri=https%3A%2F%2Fwww.medicinescomplete.com%2Fabout%2F")
athensform <- html_form(mcsession)[[1]]
athensform <-set_values(athensform, ath_uname = "xxx", ath_passwd = "yyy")
submit_form(mcsession, athensform)
jump_to(mcsession, "https://www.medicinescomplete.com/mc/bnf/current/")
Run Code Online (Sandbox Code Playgroud)

我为submit_form()步骤获得了200个代码,但是跳转到最后一行的403禁止代码.

然后我将submit_form步骤传送到html()并打印出来.从我可以看出它是一个成功的登录,但在主页的正文中有一行指的是重定向回原始网站.整个页面的html太长而无法发布,但相关的位似乎是:

<div style="padding: 8px;" id="logindiv">
                        <form method="POST" action="https://www.medicinescomplete.com/mc/athens">
                            Please wait while we transfer you. <br><noscript>JavaScript disabled, please<input type="submit" value="click here" style="border:none;background:none;text-decoration:underline;color:#E27B2F;">
Run Code Online (Sandbox Code Playgroud)

我想知道以下这个位是否引用了一些登录密钥:

<input type="hidden" name="TARGET" value="https://www.medicinescomplete.com/about/" style="display:none"><input type="hidden" name="RelayState" value="https://www.medicinescomplete.com/about/" style="display:none"><input type="hidden" name="SAMLResponse" value="PFJlc3BvbnNlIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBEZXN...
Run Code Online (Sandbox Code Playgroud)

啊哈!在页面的下方是这样的:

<script>
window.onload = function() { document.forms[0].submit(); }
</script>
Run Code Online (Sandbox Code Playgroud)

我认为该窗口旨在自动提交另一个执行帖子到原始drugscomplete.com网站的表单,以使用隐藏字段作为登录凭据进行身份验证.但是,在尝试使用此页面上的submit_form()时,我似乎没有进一步了解!我添加了以下行来尝试找出正在发生的事情:

> submit_form(mcsession, athensform) …
Run Code Online (Sandbox Code Playgroud)

login r web-scraping rvest

8
推荐指数
1
解决办法
2437
查看次数

rvest 可以使用 html_table 保留内联 html 标签,例如 &lt;br&gt; 吗?

我试图在 R 中刮一张我以 html 形式给出的表格。Rvest 在从表格中取出所有文本方面非常有用,但我想保留其 HTML 表单中出现的内联样式。

例如,表格中的文本可能是

"This is a sentence <BR> this is another sentence"
Run Code Online (Sandbox Code Playgroud)

我想保留 BR

我试过在整个表格中阅读:

my_table <- my_table_html %>% 
html_nodes("table") %>% 
html_table(fill=TRUE) 
Run Code Online (Sandbox Code Playgroud)

我还尝试选择表中的特定列:

my_column <- my_table_html %>% 
html_nodes(".Tabletitle:nth-child(2)") %>%
html_text()
Run Code Online (Sandbox Code Playgroud)

任何想法将不胜感激

html r rvest

8
推荐指数
1
解决办法
1285
查看次数

使用R从网页中抓取可下载文件的链接地址?

我正在尝试自动化一个过程,该过程涉及从几个网页下载.zip文件并提取它们包含的.csv文件.挑战在于.zip文件名以及链接地址每周或每年更改一次,具体取决于页面.有没有办法从这些页面中抓取当前链接地址,以便我可以将这些地址提供给下载文件的函数?

其中一个目标页面就是这个.我想下载的文件是标题为"2015 Realtime Complete All Africa File"的第二个项目符号---即压缩的.csv.在我写的时候,该文件在网页上标有"Realtime 2015 All Africa File(2015年7月11日更新)(csv)",我想要的链接地址是http://www.acleddata.com/wp-content /uploads/2015/07/ACLED-All-Africa-File_20150101-to-20150711_csv.zip,但这应该在今天晚些时候改变,因为数据每周一更新 - 因此我的挑战.

我尝试但未能使用'rvest'和Chrome中的selectorgadet扩展名自动提取.zip文件名.这是怎么回事:

> library(rvest)
> realtime.page <- "http://www.acleddata.com/data/realtime-data-2015/"
> realtime.html <- html(realtime.page)
> realtime.link <- html_node(realtime.html, xpath = "//ul[(((count(preceding-sibling::*) + 1) = 7) and parent::*)]//li+//li//a")
> realtime.link
[1] NA
Run Code Online (Sandbox Code Playgroud)

该调用中的xpath html_node()来自突出显示实时2015年全非文件(2015年7月11日更新)(csv)字段中的(csv)部分的绿色,然后单击页面上足够的其他突出显示位以消除所有黄色只留下红色和绿色.

我在这个过程中犯了一个小错误,还是我完全走错了轨道?正如你所知,我没有HTML和网络抓取的经验,所以我真的很感激一些帮助.

r web-scraping rvest

8
推荐指数
1
解决办法
3668
查看次数

从多个屏幕网页获取网络抓取信息

我试图从互联网上获取有关企业的一些信息.大部分信息都位于此页面:http://appscvs.supercias.gob.ec/portalInformacion/sector_societario.zul,页面如下所示:在此输入图像描述

在这个页面中,我必须单击选项卡Busqueda de Companias,然后有趣的一面开始.当我点击时,我得到下一个屏幕:在此输入图像描述 在这个页面中,我必须设置选项Nombre,然后我必须插入一个带有名称的字符串.例如,我将添加字符串PROAÑO & ASOCIADOS CIA. LTDA.,我将获得下一个屏幕: 在此输入图像描述

然后,我必须点击Buscar,我将进入下一个屏幕:在此输入图像描述

在这个屏幕中,我有这个企业的信息.然后,我必须单击选项卡Informacion Estados Financieros,我将进入下一个屏幕: 在此输入图像描述

在这个最终屏幕中,我必须单击选项卡Estado Situacion,我将从列中的企业获取信息Codigo de la cuenta contable,Nombre de la cuenta contable并且Valor.我想将这些信息保存在数据框中.我发现的大多数复杂的一面都是在我必须设置元素Nombre,插入一个字符串,然后Buscar点击直到找到标签时开始的Informacion Estados Financieros.我尝试过使用html_sessionhtml_formrvest包中,但元素是空的.

你能帮我解决一下这个问题吗?

r rvest

8
推荐指数
1
解决办法
746
查看次数

在R中以粗体标识网络链接

以下脚本允许我访问具有多个具有相似名称的链接的网站.我想只得到其中一个,因为它在网站上以粗体显示,可以与其他人区别开来.但是,我找不到在列表中选择粗体链接的方法.

有人会对此有所了解吗?提前致谢!

library(httr)
library(rvest)
sp="Alnus japonica"

res <- httr::POST(url ="http://apps.kew.org/wcsp/advsearch.do", 
              body = list(page ="advancedSearch", 
                          AttachmentExist ="", 
                          family ="", 
                          placeOfPub ="", 
                          genus = unlist(strsplit(as.character(sp), split="         "))[1], 
                          yearPublished ="", 
                          species = unlist(strsplit(as.character(sp), split="    "))[2], 
                          author ="", 
                          infraRank ="", 
                          infraEpithet ="", 
                          selectedLevel ="cont"), 
              encode ="form") 
pg <- content(res, as="parsed") 
lnks <- html_attr(html_nodes(pg,"a"),"href")
#how get the url of the link wth accepted name (in bold)?
res2 <- try(GET(sprintf("http://apps.kew.org%s", lnks[grep("id=",lnks)]      [1])),silent=T)
#this gets a link but often fails to get the bold one
Run Code Online (Sandbox Code Playgroud)

html r httr rvest

8
推荐指数
2
解决办法
256
查看次数

无法保存 - 从R中的rvest生成的xml_document

read_html函数生成一个xml_document,我想保存,稍后加载它来解析它.

问题是加载xml_document后,其中没有html.

library(rvest)
library(magrittr)
doc <- read_html("http://www.example.com/")
doc %>% html_node("h1") %>% html_text
Run Code Online (Sandbox Code Playgroud)

我明白了: [1] "Example Domain"

但是当我首先保存xml_document doc对象并再次加载它时,似乎一切都已被清除.

save(doc, file=paste0(getwd(), "/example.RData"))
rm(doc)

load(file=paste0(getwd(), "/example.RData"))
doc %>% html_node("h1") %>% html_text
Run Code Online (Sandbox Code Playgroud)

我明白了: Error: No matches

或者当我运行时doc我得到:{xml_document}一个空的xml_document.

也是这样的情况,当我运行它doc,在加载它之后,我得到一条消息,RStudio已经停止工作.

我在两台不同的Windows机器上试过它,遇到了同样的问题.

sessionInfo()

R version 3.3.0 (2016-05-03)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252   
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] …
Run Code Online (Sandbox Code Playgroud)

xml r rvest

8
推荐指数
1
解决办法
715
查看次数

使用tryCatch和rvest来处理404和其他爬行错误

使用时检索h1标题时rvest,我有时会遇到404页.这将停止该过程并返回此错误.

open.connection(x,"rb")出错:HTTP错误404.

请参阅下面的示例

Data<-data.frame(Pages=c(
"http://boingboing.net/2016/06/16/spam-king-sanford-wallace.html",
"http://boingboing.net/2016/06/16/omg-the-japanese-trump-commer.html",
"http://boingboing.net/2016/06/16/omar-mateen-posted-to-facebook.html",
"http://boingboing.net/2016/06/16/omar-mateen-posted-to-facdddebook.html"))
Run Code Online (Sandbox Code Playgroud)

用于检索h1的代码

library (rvest)
sapply(Data$Pages, function(url){
 url %>%
 as.character() %>% 
 read_html() %>% 
 html_nodes('h1') %>% 
 html_text()
 })
Run Code Online (Sandbox Code Playgroud)

有没有办法包含一个参数来忽略错误并继续这个过程?

r try-catch rvest

8
推荐指数
1
解决办法
9017
查看次数

Rvest:如何在没有名称的表单上设置值

我有一个具有以下功能的表单 - 在本例中“文本”是用户名框。

form = html_form(read_html(url))[[1]]
print(form)

<form> 'login' (GET )
  <input text> '':
  <input password> '':
  <input submit> '': log in
>
Run Code Online (Sandbox Code Playgroud)

我更深入地研究了表格的样子:

> form$fields[1]
$`NULL`
$`name`
NULL

$type
[1] "text"

$value
NULL

$checked
NULL

$disabled
NULL

$readonly
NULL

$required
[1] FALSE

attr(,"class")
[1] "input"
Run Code Online (Sandbox Code Playgroud)

我不确定如何在没有具体名称可供参考的情况下更改文本和密码参数。这个没用,仅供参考:

filled_form = set_values(form,
                         '' = "email@email.com",
                         '' = "p@ssword")
Run Code Online (Sandbox Code Playgroud)

这也不起作用:

filled_form = set_values(form,
                         form$fields[1]$value = "email@email.com",
                         form$fields[2]$value ="p@ssword")
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?提前致歉,我无法分享 URL。

html r web-scraping rvest

8
推荐指数
0
解决办法
549
查看次数

Rvest读取表,其中包含跨越多行的单元格

我正在尝试使用rvest从Wikipedia 抓取不规则表格。该表具有跨越多行的单元格。该文档html_table明确规定,这是一个限制。我只是想知道是否有解决方法。

如下所示: 在此处输入图片说明

我的代码:

library(rvest)
url <- "https://en.wikipedia.org/wiki/Arizona_League"
parks <- url %>%
  read_html() %>%
  html_nodes(xpath='/html/body/div[3]/div[3]/div[4]/div/table[2]') %>%
  html_table(fill=TRUE) %>%  # fill=FALSE yields the same results
  .[[1]]
Run Code Online (Sandbox Code Playgroud)

返回此:

在此处输入图片说明

例如,在存在多个错误的地方:“城市”下的第4行应为“ Mesa”,而不是“芝加哥小熊队”。我对空白单元格感到满意,因为我可以根据需要“填充”,但是错误的数据是一个问题。非常感谢您的帮助。

r web-scraping rvest

8
推荐指数
1
解决办法
171
查看次数

如何在R中发布简单的HTML表单?

我对R编程比较陌生,我试图将我在Johns Hopkins数据科学专业中学到的一些东西用于实际应用.具体来说,我想自动化从美国财政部网站下载历史债券价格的过程

使用Firefox和R,我能够确定美国财政部网站使用非常简单的HTML POST表单来指定感兴趣的报价的单个日期.然后返回所有未偿债券的二级市场信息表.

我没有尝试使用两个不同的R包来向美国财政部Web服务器提交请求.野兔是我尝试过的两种方法:

尝试#1(使用RCurl):

url <- "https://www.treasurydirect.gov/GA-FI/FedInvest/selectSecurityPriceDate.htm"
td.html <- postForm(url,
                    submit = "Show Prices",
                    priceDate.year  = 2014,
                    priceDate.month = 12,
                    priceDate.day   = 15,
                   .opts = curlOptions(ssl.verifypeer = FALSE))
Run Code Online (Sandbox Code Playgroud)

这导致返回并存储的网页,td.html但它包含的是来自treasurydirect服务器的错误消息.我知道服务器正在运行,因为当我通过浏览器提交相同的请求时,我得到了预期的结果.

尝试#2(使用rvest):

s <- html_session(url)
f0 <- html_form(s)
f1 <- set_values(f0[[2]], priceDate.year=2014, priceDate.month=12, priceDate.day=15)
test <- submit_form(s, f1)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种方法甚至不会留下R并导致来自R的以下错误消息:

Submitting with 'submit'
Error in function (type, msg, asError = TRUE)  : <url> malformed
Run Code Online (Sandbox Code Playgroud)

我似乎无法弄清楚如何查看正在发送给rvest的"格式错误"的文本,以便我可以尝试诊断问题.

任何建议或提示解决这个看似简单的任务将不胜感激!

html post r rcurl rvest

7
推荐指数
1
解决办法
4833
查看次数

标签 统计

r ×10

rvest ×10

html ×4

web-scraping ×4

httr ×1

login ×1

post ×1

rcurl ×1

try-catch ×1

xml ×1