标签: rvest

R - 使用 rvest 将 html_node 限制为 html_nodes 结果的元素

我正在使用rvest网页抓取 - 为了试用,我正在抓取来自 IMDB 的电影的评论分数。对于此示例,我尝试从该站点获取所有评论和相关用户名。请注意,并非所有评论都有星级评分 - 我想要的只是有星级评分的评论。

我的起始代码:

library(rvest)
library(magrittr)

id = "0000001"
reviews = paste0("http://www.imdb.com/title/tt",id,"/reviews-index?start=0;count=10000000") %>% 
  html() %>%
  html_nodes(xpath='//td[contains(@class, "comment-summary")]') 
Run Code Online (Sandbox Code Playgroud)

这将完全按照我的预期返回 11 条评论的列表(这部电影有 11 条评论)。

当我然后尝试浏览此列表以检查是否存在星级时,我得到了意想不到的结果。

reviews %>%
  .[[1]] %>%
  html_node(xpath='//img[contains(@width,"102")]')
Run Code Online (Sandbox Code Playgroud)

这产生

<img width="102" height="12" alt="10/10" src="http://i.media-imdb.com/images/showtimes/100.gif"/>
Run Code Online (Sandbox Code Playgroud)

但第一条评论实际上只包含:

<td class="comment-summary">
<a href="/user/ur0093335/"><img class="avatar" src="http://ia.media-imdb.com/images/M/MV5BMjI2NDEyMjYyMF5BMl5BanBnXkFtZTcwMzM3MDk0OQ@@._SX40_SY40_SS40_.jpg" height="width="/></a>
<h2><a href="reviews?count=10000000&amp;start=0">one-shot record of a belly dancer</a></h2>

<b>Author:</b>
     <a href="/user/ur0093335/">Brian Fuller (bfuller@montreat.edu)</a>
      <small>on 12 August 1998</small>
</td> 
Run Code Online (Sandbox Code Playgroud)

img我的代码返回并没有在子集存在。 我怎样才能真正地对 html 进行子集化以html_node()按照直觉应该的方式进行后续操作?

r rvest

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

在R中的rvest包中写入哪个选择器?

我正在尝试从特定网站的源代码中提取信息

在源代码中有以下几行:

# [[4]]
# <script type="text/javascript">
#   <![CDATA[
#     <!-- // <![CDATA[
#       var wp_dot_addparams = {
#         "cid": "148938",
#         "ctype": "article",
#         "ctags": "dziejesiewkulturze,piraci z karaibów,Charlie Hebdo,Scorpions",
#         "cauthor": "",
#         "csource": "film.wp.pl",
#         "cpageno": 1,
#         "cpagemax": 1,
#         "cdate": "2015-02-18"
#       };
#       // ]]]]><![CDATA[> -->
#                          ]]>
#   </script> 
Run Code Online (Sandbox Code Playgroud)

我想从中提取:

"ctags": "dziejesiewkulturze,piraci z karaibów,Charlie Hebdo,Scorpions",
Run Code Online (Sandbox Code Playgroud)

有谁知道我应该如何在R包的html_nodes函数中指定选择器rvest

html("http://film.wp.pl/id,148938,title,dziejesiewkulturze-Codzienna-dawka-informacji-kulturalnych-180215-WIDEO,wiadomosc.html") %>%
  html_nodes("script")
Run Code Online (Sandbox Code Playgroud)

r css-selectors rvest

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

使用rvest在h后刮掉所有p?(或其他R包)

我是html抓取世界的新手,我很难在特定标题下拉入段落,在R中使用rvest

我想从多个站点中获取信息,这些站点都具有相对类似的设置.它们都有相同的标题,但标题下的段落数量可能会发生变化.我能够使用以下代码在标题下刮取特定段落:

unitCode <- data.frame(unit = c('SLE010', 'SLE115', 'MAA103'))

html <- sapply(unitCode, function(x) paste("http://www.deakin.edu.au/current-students/courses/unit.php?unit=", 
                                          x,
                                          "&return_to=%2Fcurrent-students%2Fcourses%2Fcourse.php%3Fcourse%3DS323%26version%3D3", 
                                          sep = ''))
assessment <- html[3] %>%
              html() %>%
              html_nodes(xpath='//*[@id="main"]/div/div/p[3]') %>%
              html_text()
Run Code Online (Sandbox Code Playgroud)

'xpath'元素引入评估标题下的第一段.有些页面在评估标题下有多个段落,如果我改变'xpath'变量来具体指定它们,我可以获得,例如p [4]或p [5].不幸的是,我想在数百页上迭代这个过程,所以每次更改xpath是不合适的,我甚至不知道每个页面中会有多少段落.

我认为,考虑到页面设置的不确定性,在我感兴趣的标题之后拉出所有<p>是最好的选择.

我想知道是否有办法在<h3>评估<h3>之后使用rvest或其他一些R刮包来刮掉所有<p>?

html xpath r scrape rvest

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

用特定的类刮取所有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
查看次数

用rvest刮掉选定的Drop Down项目的文本

我正在使用Rseleniumrvest搜索一些网站.因此,我循环浏览下拉菜单中的项目以更改javascript表.下拉菜单中的表名应成为已删除表中的标识符列.我设法凑表,但刮只是一个选择的菜单项时,我坚持.以下是html代码的一些行:

<select>
<option value="5823">2010/2011</option>
<option value="7094">2011/2012</option>
<option value="9024">2012/2013</option>
<option value="11976">2013/2014</option>
<option value="15388">2014/2015</option>
<option value="18336" selected="selected">2015/2016</option>
</select>
Run Code Online (Sandbox Code Playgroud)

如何获取所选列的html_text?css选择器:选中不起作用.我试过了:

 html_nodes("option") %>% html_attrs()
Run Code Online (Sandbox Code Playgroud)

哪个正确地给了我:

 [[1]]
 value 
"5823" 

[[2]]
 value 
"7094" 

[[3]]
 value 
"9024" 

[[4]]
  value 
"11976" 

[[5]]
  value 
"15388" 

[[6]]
  selected      value 
"selected"    "18336" 
Run Code Online (Sandbox Code Playgroud)

read_html(wData) %>% html_nodes("option") %>% html_text()
[1] "2010/2011" "2011/2012" "2012/2013" "2013/2014" "2014/2015" "2015/2016"
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将两者结合在一起.我只得到:

[1] "2015/2016"
Run Code Online (Sandbox Code Playgroud)

由于我正在循环选择,我需要一个通用的解决方案.谢谢.

css r web-scraping rvest

3
推荐指数
1
解决办法
1319
查看次数

使用R提取HTML文本-无法访问某些节点

我有大量在线取水许可证,我想从中提取一些数据。例如

url <- "https://www.ecan.govt.nz/data/consent-search/consentdetails/CRC000002.1"
Run Code Online (Sandbox Code Playgroud)

我一点都不懂HTML,但是一直在Google和一位朋友的帮助下插手。我可以使用xpath或css选择器到达某些节点,而不会出现任何问题,例如,获得标题:

library(rvest)
url %>% 
read_html() %>% 
html_nodes(xpath = '//*[@id="main"]/div/h1') %>%
html_text()
[1] "Details for CRC000002.1"
Run Code Online (Sandbox Code Playgroud)

或使用CSS选择器:

url %>% 
read_html() %>% 
html_nodes(css = "#main") %>% 
html_nodes(css = "div") %>% 
html_nodes(css = "h1") %>% 
html_text()
[1] "Details for CRC000002.1"
Run Code Online (Sandbox Code Playgroud)

到目前为止,还算不错,但是我真正想要的信息被更深入地埋了,我似乎无法理解。例如,客户名称字段(在这种情况下为“ Killermont Station Limited”)具有以下xpath:

clientxpath <- '//*[@id="main"]/div/div[1]/div/table/tbody/tr[1]/td[2]'
url %>% 
read_html() %>% 
html_nodes(xpath = clientxpath) %>%
html_text()
character(0)
Run Code Online (Sandbox Code Playgroud)

CSS选择器变得相当复杂,但是我得到了相同的结果。html_nodes()的帮助文件显示:

# XPath selectors ---------------------------------------------
# chaining with XPath is a little trickier - you may need to vary
# the prefix …
Run Code Online (Sandbox Code Playgroud)

html r web-scraping rvest

3
推荐指数
1
解决办法
459
查看次数

标签 统计

r ×10

rvest ×10

web-scraping ×3

html ×2

css ×1

css-selectors ×1

get ×1

proxy ×1

scrape ×1

screen-scraping ×1

vpn ×1

xml2 ×1

xpath ×1