我正试图png通过R从安全站点下载图像.
访问我使用的安全网站Rvest运作良好.
到目前为止,我已经提取了png图像的URL .
如何使用rvest下载此链接的图像?
rvest由于没有权限,函数外部的函数返回错误.
library(rvest)
uastring <- "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
session <- html_session("https://url.png", user_agent(uastring))
form <- html_form(session)[[1]]
form <- set_values(form, username = "***", password="***", cookie_checkbox= TRUE)
session<-submit_form(session, form)
session2<-jump_to(session, "https://url.png")
## Status 200 using rvest, sucessfully accsessed page.
session
<session> https://url.png
Status: 200
Type: image/png
Size: 438935
## Using download.file returns status 403, page unable to open.
download.file("https://url.png", destfile = "t.png")
cannot open: …Run Code Online (Sandbox Code Playgroud) 我试图在需要登录的网站上抓一页,并且一直在收到403错误.
我已经为我的网站修改了这2个帖子的代码,使用rvest或httr登录网页上的非标准表单以及如何重用会话以避免在使用rvest进行重复登录时重复登录?
library(rvest)
pgsession <- html_session("https://www.optionslam.com/earnings/stocks/MSFT?page=-1")
pgform <- html_form(pgsession)[[1]]
filled_form <- set_values(pgform, 'username'='user', 'password'='pass')
s <- submit_form(pgsession, filled_form) # s is your logged in session
Run Code Online (Sandbox Code Playgroud)
代码运行时,我收到以下消息:
Submitting with 'NULL'
Warning message:
In request_POST(session, url = url, body = request$values, encode = request$encode, :
Forbidden (HTTP 403).
Run Code Online (Sandbox Code Playgroud)
我也通过这种方式运行代码,通过在注释中将user_agent更新为RS建议,但是,我收到与上面相同的错误.
library(rvest)
library(httr)
uastring <- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36"
pgsession <- html_session("https://www.optionslam.com/earnings/stocks/MSFT?page=-1", user_agent(uastring))
pgform <- html_form(pgsession)[[1]]
filled_form <- set_values(pgform, 'username'='user', 'password'='pass')
s …Run Code Online (Sandbox Code Playgroud) 我试图简单地复制示例rvest::html_nodes(),但遇到错误:
library(rvest)
ateam <- read_html("http://www.boxofficemojo.com/movies/?id=ateam.htm")
html_nodes(ateam, "center")
Run Code Online (Sandbox Code Playgroud)
do.call中的错误(方法,列表(parsed_selector)):找不到函数"xpath_element"
同样的情况,如果我打开包,例如httr,xml2,selectr.我似乎也有这些软件包的最新版本......
在该包的功能,例如xpath_element,xpath_combinedselector在什么位置?我如何让它工作?请注意,我在Ubuntu 16.04上运行,因此该代码可能适用于其他平台...
我正在尝试以编程方式搜索网站,但提交按钮功能似乎主要由JavaScript提供支持.我并不过分熟悉它是如何工作的,所以我可能错了.
这是我正在使用的代码:
library(rvest)
BASE_URL = 'https://mdocweb.state.mi.us/otis2/otis2.aspx'
PARAMS = list(txtboxLName='Smith',
drpdwnGender='Either',
drpdwnRace='All',
drpdwnStatus='All',
submit='btnSearch')
# rvest approach
s = html_session(BASE_URL)
form = html_form(s)[[1]]
form = set_values(form, PARAMS)
resp = submit_form(s, form, submit='btnSearch') # This gives an error
# httr approach
resp = httr::POST(BASE_URL, body=PARAMS, encode='form')
html = httr::content(resp) # This just returns that same page I was on
Run Code Online (Sandbox Code Playgroud)
该按钮的HTML如下所示:
<input type="submit" name="btnSearch" value="Search" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("btnSearch", "", true, "", "", false, false))" language="javascript" id="btnSearch" style="width:100px;">
Run Code Online (Sandbox Code Playgroud)
鉴于该onclick属性,我没有受过教育的假设是JavaScript的使用干扰了我的方法.但同样,我并不完全理解这一切是如何运作的,所以我可能错了.
无论哪种方式,我如何实现我的目标,如果有的话,使用rvest或httr …
我正在尝试抓取该网站的内容(不是rvest链接的论文/摘要,只是数量、标题、作者等)。
默认情况下,该页面仅显示 2016 年论文,抓取 2016 年数据“没问题”。我希望 URL 在将“2016”更改为“所有年份”后会发生变化,但它保持不变。于是我就求助于html_form. 在检查网页的“资源”后,我发现相关的输入名称是filteryear。
R代码:
library(rvest)
rdc <- html_session("https://sfb649.wiwi.hu-berlin.de/fedc/discussionPapers_formular_content.php")
form <- html_form(rdc)
form <- set_values(form, filteryear = "all years")
#Error: Unknown field names: filteryear
Run Code Online (Sandbox Code Playgroud)
显然,filteryear这不是表格的一部分。由于我的 HTML 知识有限,我很确定下面的内容告诉我,该表单由三个输入组成:filterTypeName、filterName和filteryear。
来自资源的 HTML:
<form action='discussionPapers_formular_content.php' method='post'>
<select name='filterTypeName'>
<option value='AUTHORS'>Author</option>
<option value='PROJECT'>Project Code</option>
...
<option value='JEL'>JEL</option
</select> </td> # Is this </td> the problem?!
<td valign='baseline'>
<input type='text' size='35' name='filterName' > …Run Code Online (Sandbox Code Playgroud) 当前通过将不同的字符串传递给html_session()方法来更改 user_agent 。
有没有办法在抓取网站时更改计时器上的 IP 地址?
我想从网站下面定期提取一个表格。
单击积木名称(BLOK 16 A, BLOK 16 B, BLOK 16 C, ...)时,价格表会发生变化。URL 不改变,页面通过触发改变
javascript:__doPostBack('ctl00$ContentPlaceHolder1$DataList2$ctl04$lnk_blok','')
Run Code Online (Sandbox Code Playgroud)
在搜索 google 和 starckoverflow 后,我尝试了 3 种方法。
我尝试过的没有 1:这不会触发 doPostBack 事件。
postForm( "http://www.kentkonut.com.tr/tr/modul/projeler/daire_fiyatlari.aspx?id=44", ctl00_ContentPlaceHolder1_DataList2_ctl03_lnk_blok="ctl00$ContentPlaceHolder1$DataList2$ctl03$lnk_blok")
Run Code Online (Sandbox Code Playgroud)
我尝试过的没有 2: selenium remote 似乎可以在 ( http://localhost:4444/ ) 上工作,但 remotedriver 无法导航。返回此错误。(checkError(res) 中的错误:httr 调用中的未定义错误。httr 输出:length(url) == 1 不是 TRUE)
library(RSelenium)
startServer()
remDr <- remoteDriver()
remDr <- remoteDriver(remoteServerAddr = "localhost"
, port = 4444L, browserName = "firefox")
remDr$open()
remDr$getStatus()
remDr$navigate("http://www.kentkonut.com.tr/tr/modul/projeler/daire_fiyatlari.aspx?id=44")
Run Code Online (Sandbox Code Playgroud)
我尝试过的没有 3:这是触发 dopostback 事件的另一种方式。它不导航。
base.url <- "http://www.kentkonut.com.tr/tr/modul/projeler/",
event.target <- 'ctl00$ContentPlaceHolder1$DataList2$ctl03$lnk_blok',
action <- "daire_fiyatlari.aspx?id=44" …Run Code Online (Sandbox Code Playgroud) 我正在尝试抓取这个网站。不幸的是,我想使用 rvest 抓取的数据隐藏在按钮(加号)后面。
我试着用 rvest 包来做,我使用以下代码:
library(rvest)
url <- 'https://transparency.entsoe.eu/generation/r2/actualGenerationPerGenerationUnit/show?name=&defaultValue=true&viewType=TABLE&areaType=BZN&atch=false&dateTime.dateTime=17.03.2017+00:00|UTC|DAYTIMERANGE&dateTime.endDateTime=17.03.2017+00:00|UTC|DAYTIMERANGE&area.values=CTY|10YBE----------2!BZN|10YBE----------2&productionType.values=B02&productionType.values=B03&productionType.values=B04&productionType.values=B05&productionType.values=B06&productionType.values=B07&productionType.values=B08&productionType.values=B09&productionType.values=B10&productionType.values=B11&productionType.values=B12&productionType.values=B13&productionType.values=B14&productionType.values=B15&productionType.values=B16&productionType.values=B17&productionType.values=B18&productionType.values=B19&productionType.values=B20&dateTime.timezone=UTC&dateTime.timezone_input=UTC&dv-datatable_length=100'
htmlpage <- html_session(url) %>%
read_html() %>%
html_nodes(".dv-value-cell") %>>%
html_table()
Run Code Online (Sandbox Code Playgroud)
“.dv-value-cell”是使用 SelectorGadget 从网站中提取的(在rvest 的一个小插曲中)。
但是,在我可以使用此代码之前,我仍然需要打开加号菜单。单击按钮之前,此子表中的数据不存在。因此,上面的代码将返回一个空值。
我使用了这个问题中描述的 Chrome 网络开发工具来监控当我点击按钮时会发生什么。根据该信息,我看到有对以下网址的请求(缩短为仅突出显示与原始网址的区别):
https://transparency.entsoe.eu/...&dateTime.timezone_input=UTC&dv-datatable-detail_22WAMERCO000010Y_22WAMERCO000008L_length=10&dv-datatable_length=50&detailId=22WAMERCO000010Y_22WAMERCO000008L
Run Code Online (Sandbox Code Playgroud)
如您所见,这是原始 url,但还有一个小的额外请求。但是,当我在浏览器中尝试此 url 时,它没有显示所需的结果。我一定错过了网站另外通过的东西。
根据 Chrome,此请求的结果正是我要查找的数据(右键单击 > 复制 > 复制结果)。所以应该有一种方法可以下载这个特定的数据。
我也发现了这个关于类似问题的问题,但不幸的是,该解决方案非常适合这种情况,并且没有给出一般性解释。
如何重现此浏览器请求,以便我收到相同的表?
我想从以下位置抓取瑞士政府为大学研究项目提供的药物信息:
http://www.spezialitaetenliste.ch/ShowPreparations.aspx?searchType=Substance&searchValue=
该页面确实提供了一个robotx.txt 文件,但是,它的内容对公众免费提供,我认为抓取这些数据是不受禁止的。
这是这个问题的更新,因为我取得了一些进展。
到目前为止我取得的成就
# opens the first results page
# opens the first link as a table at the end of the page
library("rvest")
library("dplyr")
url <- "http://www.spezialitaetenliste.ch/ShowPreparations.aspx?searchType=Substance&searchValue="
pgsession<-html_session(url)
pgform<-html_form(pgsession)[[1]]
page<-rvest:::request_POST(pgsession,url,
body=list(
`ctl00$cphContent$gvwPreparations$ctl13$gvwpPreparations$txtPageNumber`=1,
`__VIEWSTATE`=pgform$fields$`__VIEWSTATE`$value,
`__VIEWSTATEGENERATOR`=pgform$fields$`__VIEWSTATEGENERATOR`$value,
`__VIEWSTATEENCRYPTED`=pgform$fields$`__VIEWSTATEENCRYPTED`$value,
`__EVENTVALIDATION`=pgform$fields$`__EVENTVALIDATION`$value,
`ctl00$cphContent$gvwPreparations$ctl13$gvwpPreparations$ddlPageSize`="10",
`__EVENTTARGET`="ctl00$cphContent$gvwPreparations$ctl02$ctl00",
`__EVENTARGUMENT`=""
),
encode="form")
Run Code Online (Sandbox Code Playgroud)
下一篇:获取基础数据
# makes a table of all results of the first page
read_html(page) %>%
html_nodes(xpath = '//*[@id="ctl00_cphContent_gvwPreparations"]') %>%
html_table(fill=TRUE) %>%
bind_rows %>%
tibble()
Run Code Online (Sandbox Code Playgroud)
下一步:获取附加数据
# gives the desired informations (=additional data) of the …Run Code Online (Sandbox Code Playgroud) 我正在使用 R 包 edgarWebR 来解析 SEC 文件,例如https://www.sec.gov/Archives/edgar/data/1060224/000090480206000008/sa10k306.htm。它返回一个数据框,其中一列(称为“原始”)是 HTML。它将 HTML 页面分解为段落,每段一行:
| 其他栏目 | 生的 | 文本 |
|---|---|---|
| 第一排 | <p id="PARA339" style="TEXT-ALIGN: left; MARGIN: 0pt; LINE-HEIGHT: 1.25"><font style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman, Times, serif"><i>We had a net loss of $1.</i><i><b>55</b></i><i> million for the year ended December 31, 201</i><i>6</i><i> and have an accumulated deficit of $</i><i>61.5</i><i> million as of December 31, 201</i><i>6</i><i>. To achieve sustainable profitability, we must generate increased revenue.</i></font></p> |
截至 2016 年 12 月 31 日止年度,我们的净亏损为 155 万美元,截至 2016 年 12 … |