我正在使用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&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()按照直觉应该的方式进行后续操作?
我正在尝试从特定网站的源代码中提取信息
在源代码中有以下几行:
# [[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) 我是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>?
我正在从某个特定的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)
非常感谢您的帮助!
我正在使用Rselenium和rvest来搜索一些网站.因此,我循环浏览下拉菜单中的项目以更改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)
由于我正在循环选择,我需要一个通用的解决方案.谢谢.
我有大量在线取水许可证,我想从中提取一些数据。例如
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)