标签: rvest

在R中搜索javascript网站

我想从这个网址中删除匹配时间和日期:

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抓取此信息?

javascript screen-scraping r rvest

5
推荐指数
1
解决办法
4105
查看次数

在rvest中搜索位置数据

我正在尝试从我使用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查询输入,它被写入页面代码(或者,至少,我的业余眼睛似乎是).

有人有建议吗?

javascript r scraper web-scraping rvest

5
推荐指数
1
解决办法
1244
查看次数

在网页抓取时只有小对象的高R内存使用率

我正在抓一个网站,并从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.我怎样才能找到内存使用的罪魁祸首并修复它?循环中是否存在逐渐占用内存的东西? …

memory r rvest

5
推荐指数
0
解决办法
395
查看次数

R网络刮板与jsessionid

我正在测试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)

好吧,输出没有数据.实际上,它有一条错误消息.翻译成英文,它基本上说会话已经过期.

我认为这是一个基本的错误,但我四处寻找并找不到克服这个问题的方法.

r web-scraping httr rvest

5
推荐指数
1
解决办法
626
查看次数

如何使用R网页抓取点击信息?

我正试图从这个网站上删除电话号码: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程序员.

在此输入图像描述

r web-scraping rvest

5
推荐指数
1
解决办法
1878
查看次数

用特定的类刮取所有div标签的内容

我正在从某个特定的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")

r rvest

4
推荐指数
2
解决办法
4106
查看次数

read_html(url) 和 read_html(content(GET(url), "text")) 的区别

我正在看这个很好的答案: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_htmlread_html(content(GET(.), "text"))返回XML / HTML。

  • 好的,在这里我不确定检查是否有意义,但因为我的想法用完了:我检查了是否有某种缓存正在进行。

代码:

with_verbose(GET("https://nzffdms.niwa.co.nz/search"))
....
<- Expires: Thu, …
Run Code Online (Sandbox Code Playgroud)

get r rvest xml2

4
推荐指数
1
解决办法
651
查看次数

如何使用 R 和 rvest 轮换代理和 IP 地址

我正在进行一些抓取,但当我解析大约 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)

vpn proxy screen-scraping r rvest

4
推荐指数
1
解决办法
2368
查看次数

使用 R 中的 Rvest 进行礼貌的网页抓取

我有一些代码可以抓取网站,但是在运行了多次抓取之后,我收到了 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)

r web-scraping rvest

4
推荐指数
1
解决办法
742
查看次数

如何使用 rvest 从 google 搜索中检索标题下方的文本

这是这个问题的后续问题:

如何使用 rvest 从 google 搜索中检索标题

这次我试图在谷歌搜索中获取标题后面的文本(用红色圈出):

在此输入图像描述

由于我缺乏网页设计知识,我不知道如何制定 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)

非常感谢您的帮助!

r rvest

4
推荐指数
1
解决办法
440
查看次数

标签 统计

r ×10

rvest ×10

web-scraping ×4

javascript ×2

screen-scraping ×2

get ×1

httr ×1

memory ×1

proxy ×1

scraper ×1

vpn ×1

xml2 ×1