我想从这个网址中删除匹配时间和日期:
http://www.scoreboard.com/game/rosol-l-goffin-d-2014/8drhX07d/#game-summary
通过使用chrome dev工具,我可以看到这似乎是使用以下代码生成的:
<td colspan="3" id="utime" class="mstat-date">01:20 AM, October 29, 2014</td>
Run Code Online (Sandbox Code Playgroud)
但这不是源html.
我认为这是因为它的java(纠正我,如果我错了).如何使用R抓取此信息?
我正在尝试从我使用rvest的网址列表中搜索纬度/经度数据.每个网址都有一个包含特定位置的嵌入式谷歌地图,但网址本身并未显示API所采用的路径.
在查看页面源代码时,我看到我所关注的部分在这里:
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">
</script>
<script type="text/javascript">
function initialize() {
var myLatlng = new google.maps.LatLng(43.805170,-70.722084);
var myOptions = {
zoom: 16,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.SATELLITE
}
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
var marker = new google.maps.Marker({
position: myLatlng,
map: map,
title:"F.E. Wood & Sons - Natural Energy"
});
Run Code Online (Sandbox Code Playgroud)
现在,如果我可以获得具有LatLng(....)输入的行,我可以使用一些字符串解析操作来导出所有URL的纬度和经度值.
我写了以下代码来获取我的数据:
require(rvest)
require(magrittr)
fetchLatLong<-function(url){
url<-as.character(url)
solNum<-html(url)%>%
html_nodes("#map_canvas")%>%
html_attr("script")
}
Run Code Online (Sandbox Code Playgroud)
(使用selectorGadget找到"map_canvas"选择器;您可以在此处查看整个源).
我有最糟糕的时间来阅读我所追求的内容.我尝试了很多节点和节点组合,但无济于事.我玩过phantom.js,但问题是它不是js渲染的html内容我正在追求:我正在寻找API查询输入,它被写入页面代码(或者,至少,我的业余眼睛似乎是).
有人有建议吗?
我正在抓一个网站,并从for-loop调用我的抓取功能.在循环的4,000次迭代中,我的计算机警告我RStudio使用了太多的内存.但是在使用转义键断开循环之后,我在R环境中看不到任何大对象.
我尝试了这两个 帖子的提示,但他们没有透露原因.当我mem_used()从pryr包裹打电话时,我得到:
2.3 GB
这与Windows任务管理员最初所说的一致.它表示2.3 GB,然后在循环结束后十分钟内降至1.7 GB,在循环后二十分钟内降至1.2 GB. mem_used()继续说2.3 GB.
但根据lsos()上面链接的第一篇文章中的函数,我的R对象很小:
> lsos()
Type Size Rows Columns
all_raw tbl_df 17390736 89485 12
all_clean tbl_df 14693336 89485 15
all_no_PAVs tbl_df 14180576 86050 15
all_no_dupe_names tbl_df 13346256 79646 15
sample_in tbl_df 1917128 9240 15
testdat tbl_df 1188152 5402 15
username_res tbl_df 792936 4091 14
getUserName function 151992 NA NA
dupe_names tbl_df 132040 2802 3
time_per_iteration numeric 65408 4073 NA
Run Code Online (Sandbox Code Playgroud)
这说我最大的对象是17 MB,不接近2.3 GB.我怎样才能找到内存使用的罪魁祸首并修复它?循环中是否存在逐渐占用内存的东西? …
我正在测试R中的一些web scrape脚本.我已经阅读了很多教程,文档并尝试了不同的东西,但到目前为止还没有成功.
我试图抓取的URL就是这个.它有公共,政府数据,没有针对网络抓取工具的声明.它是葡萄牙语,但我相信这不会是一个大问题.
它显示了一个包含多个字段的搜索表单.我的测试是搜索来自特定州("RJ",在这种情况下,该字段是"UF")和城市("Rio de Janeiro",在"MUNICIPIO"字段中)的数据.通过单击"Pesquisar"(搜索),它显示以下输出:
使用Firebug,我发现它调用的URL(使用上面的参数)是:
http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam?buscaForm=buscaForm&codEntidadeDecorate%3AcodEntidadeInput=&noEntidadeDecorate%3AnoEntidadeInput=&descEnderecoDecorate%3AdescEnderecoInput=&estadoDecorate%3A**estadoSelect=33**&municipioDecorate%3A**municipioSelect=3304557**&bairroDecorate%3AbairroInput=&pesquisar.x=42&pesquisar.y=16&javax.faces.ViewState=j_id10
Run Code Online (Sandbox Code Playgroud)
该网站使用jsessionid,使用以下内容可以看到:
library(rvest)
library(httr)
url <- GET("http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/")
cookies(url)
Run Code Online (Sandbox Code Playgroud)
知道它使用了jsessionid,我使用cookies(url)检查这些信息,并将其用于这样的新URL:
url <- read_html("http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam;jsessionid=008142964577DBEC622E6D0C8AF2F034?buscaForm=buscaForm&codEntidadeDecorate%3AcodEntidadeInput=33108064&noEntidadeDecorate%3AnoEntidadeInput=&descEnderecoDecorate%3AdescEnderecoInput=&estadoDecorate%3AestadoSelect=org.jboss.seam.ui.NoSelectionConverter.noSelectionValue&bairroDecorate%3AbairroInput=&pesquisar.x=65&pesquisar.y=8&javax.faces.ViewState=j_id2")
html_text(url)
Run Code Online (Sandbox Code Playgroud)
好吧,输出没有数据.实际上,它有一条错误消息.翻译成英文,它基本上说会话已经过期.
我认为这是一个基本的错误,但我四处寻找并找不到克服这个问题的方法.
我正试图从这个网站上删除电话号码:http://olx.pl/oferta/pokoj-1-os-bielany-encyklopedyczna-CID3-IDdX6wf.html#c1c0e14c53.可以使用rvest带选择器的包来抓取电话号码.\'id_raw\'\::nth-child(1) span+ div strong(由selectorGadget建议).
问题是在点击掩码后可以获得信息.所以我不得不打开一个会话,提供一个点击,然后抓取信息.
编辑顺便说一下,它不是一个链接imho.看看来源.我有一个问题,因为我是一个普通的R用户,而不是一个javascript程序员.
我正在从某个特定的div类中的网站上抓取所有文本。在下面的示例中,我想提取类“ a”的div中的所有内容。
site <- "<div class='a'>Hello, world</div>
<div class='b'>Good morning, world</div>
<div class='a'>Good afternoon, world</div>"
Run Code Online (Sandbox Code Playgroud)
我想要的输出是...
"Hello, world"
"Good afternoon, world"
Run Code Online (Sandbox Code Playgroud)
下面的代码从每个div中提取文本,但是我不知道如何仅包括class =“ a”。
library(tidyverse)
library(rvest)
site %>%
read_html() %>%
html_nodes("div") %>%
html_text()
# [1] "Hello, world" "Good morning, world" "Good afternoon, world"
Run Code Online (Sandbox Code Playgroud)
使用Python的BeautifulSoup,它看起来像site.find_all("div", class_="a")。
我正在看这个很好的答案:https : //stackoverflow.com/a/58211397/3502164。
解决方案的开头包括:
library(httr)
library(xml2)
gr <- GET("https://nzffdms.niwa.co.nz/search")
doc <- read_html(content(gr, "text"))
xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value")
Run Code Online (Sandbox Code Playgroud)
输出在多个请求中保持不变:
"59243d3a2....61f8f73136118f9"
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的默认方式是:
doc <- read_html("https://nzffdms.niwa.co.nz/search")
xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value")
Run Code Online (Sandbox Code Playgroud)
结果与上面的输出不同,并在多个请求中发生变化。
题:
两者有什么区别:
read_html(url)read_html(content(GET(url), "text"))为什么它会导致不同的值,为什么只有“GET”解决方案会返回链接问题中的 csv?
(我希望可以在三个子问题的种类中对其进行结构化)。
我试过的:
走下函数调用的兔子洞:
read_html
(ms <- methods("read_html"))
getAnywhere(ms[1])
xml2:::read_html
xml2:::read_html.default
#xml2:::read_html.response
read_xml
(ms <- methods("read_xml"))
getAnywhere(ms[1])
Run Code Online (Sandbox Code Playgroud)
但这导致了这个问题:Find the used method for R wrapper functions
想法:
我没有看到 get 请求采用任何标头或 Cookie,这可以解释不同的响应。
从我的理解都read_html和read_html(content(GET(.),
"text"))返回XML / HTML。
好的,在这里我不确定检查是否有意义,但因为我的想法用完了:我检查了是否有某种缓存正在进行。
代码:
with_verbose(GET("https://nzffdms.niwa.co.nz/search"))
....
<- Expires: Thu, …Run Code Online (Sandbox Code Playgroud) 我正在进行一些抓取,但当我解析大约 4000 个 URL 时,该网站最终会检测到我的 IP,并每 20 次迭代就会阻止我。
我已经写了一堆Sys.sleep(5),tryCatch所以我不会太快被封锁。
我使用 VPN,但我必须时不时地手动断开连接并重新连接才能更改 IP。对于这样一个需要整夜运行的刮刀来说,这不是一个合适的解决方案。
我认为轮换代理应该可以完成这项工作。
这是我当前的代码(至少是其中的一部分):
library(rvest)
library(dplyr)
scraped_data = data.frame()
for (i in urlsuffixes$suffix)
{
tryCatch({
message("Let's scrape that, Buddy !")
Sys.sleep(5)
doctolib_url = paste0("https://www.website.com/test/", i)
page = read_html(site_url)
links = page %>%
html_nodes(".seo-directory-doctor-link") %>%
html_attr("href")
Sys.sleep(5)
name = page %>%
html_nodes(".seo-directory-doctor-link") %>%
html_text()
Sys.sleep(5)
job_title = page %>%
html_nodes(".seo-directory-doctor-speciality") %>%
html_text()
Sys.sleep(5)
address = page %>%
html_nodes(".seo-directory-doctor-address") %>%
html_text()
Sys.sleep(5)
scraped_data = rbind(scraped_data, data.frame(links,
name,
address, …Run Code Online (Sandbox Code Playgroud) 我有一些代码可以抓取网站,但是在运行了多次抓取之后,我收到了 403 禁止错误。我知道 R 中有一个名为polite的包,它负责弄清楚如何根据主机要求运行抓取,这样就不会出现403。我尽力使其适应我的代码,但我陷入困境。非常感谢一些帮助。这是一些可重现的示例代码,其中只有一些链接:
library(tidyverse)
library(httr)
library(rvest)
library(curl)
urls = c("https://www.pro-football-reference.com/teams/pit/2021.htm", "https://www.pro-
football-reference.com/teams/pit/2020.htm", "https://www.pro-football-
reference.com/teams/pit/2019.htm")
pitt <- map_dfr(
.x = urls,
.f = function(x) {Sys.sleep(2); cat(1);
read_html(
curl(x, handle = curl::new_handle("useragent" = "chrome"))) %>%
html_nodes("table") %>%
html_table(header = TRUE) %>%
simplify() %>%
.[[2]] %>%
janitor::row_to_names(row_number = 1) %>%
janitor::clean_names(.) %>%
select(week, day, date, result = x_2, record = rec, opponent = opp, team_score = tm, opponent_score = opp_2) %>%
mutate(year = str_extract(string = x, pattern = "\\d{4}"))
}
) …Run Code Online (Sandbox Code Playgroud) 这是这个问题的后续问题:
这次我试图在谷歌搜索中获取标题后面的文本(用红色圈出):
由于我缺乏网页设计知识,我不知道如何制定 xpath 来提取标题下面的文本。
@AllanCameron 的答案非常有用,但我不知道如何修改它:
library(rvest)
library(tidyverse)
#Code
#url
url <- 'https://www.google.com/search?q=Mario+Torres+Mexico'
#Get data
first_page <- read_html(url)
titles <- html_nodes(first_page, xpath = "//div/div/div/a/h3") %>%
html_text()
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助!