Html 使用Selenium在R中进行Web抓取以单击新页面

Html 使用Selenium在R中进行Web抓取以单击新页面,html,r,selenium,web-scraping,rselenium,Html,R,Selenium,Web Scraping,Rselenium,我正在尝试进入这个动态web()的不同页面。在这个搜索引擎中,我的意图是输入每个项目。每页有12个项目。 一旦您输入了这些项目中的每一个,并获得了所需的信息(即,如果我得到它),我希望您继续下一页。也就是说,一旦您获得了第1页上的12个项目,您就必须获得第2页上的12个项目,依此类推 怎样才能做到呢?你帮了我很多。谢谢 这是我的代码: #Loading the rvest package library(rvest) library(magrittr) # for the '%>%'

我正在尝试进入这个动态web()的不同页面。在这个搜索引擎中,我的意图是输入每个项目。每页有12个项目。

一旦您输入了这些项目中的每一个,并获得了所需的信息(即,如果我得到它),我希望您继续下一页。也就是说,一旦您获得了第1页上的12个项目,您就必须获得第2页上的12个项目,依此类推

怎样才能做到呢?你帮了我很多。谢谢

这是我的代码:

#Loading the rvest package
library(rvest)
library(magrittr) # for the '%>%' pipe symbols
library(RSelenium) # to get the loaded html of 
library(purrr) # for 'map_chr' to get reply 
library(tidyr) #extract_numeric(years)
library(stringr)

df_0<-data.frame(project=character(),
                 name=character(),
                 location=character(),
                 dates=character(),
                 objective=character(),
                 collected=character(),
                 donor=character(),
                 shares=character(),
                 follow=character(),
                 comments=character(),
                 category=character())

#Specifying the url for desired website to be scraped
url <- 'https://es.gofundme.com/f/ayuda-a-ta-josefina-snchez-por-covid-en-pulmn?qid=00dc4567cb859c97b9c3cefd893e1ed9&utm_campaign=p_cp_url&utm_medium=os&utm_source=customer'

# starting local RSelenium (this is the only way to start RSelenium that is working for me atm)
selCommand <- wdman::selenium(jvmargs = c("-Dwebdriver.chrome.verboseLogging=true"), retcommand = TRUE)
shell(selCommand, wait = FALSE, minimized = TRUE)
remDr <- remoteDriver(port = 4567L, browserName = "firefox")
remDr$open()

  
require(RSelenium)

# go to website
remDr$navigate(url)

# get page source and save it as an html object with rvest
html_obj <- remDr$getPageSource(header = TRUE)[[1]] %>% read_html()
  
# 1) Project name
project <- html_obj %>% html_nodes(".a-campaign-title") %>% html_text()
  
 # 2) name 
info <- html_obj %>% html_nodes(".m-person-info") %>% html_text()
  
# 3) location 
location <- html_obj %>% html_nodes(".m-person-info-content") %>% html_text()

  
# 4) dates 
dates <- html_obj %>% html_nodes(".a-created-date") %>% html_text()
  
# 5) Money -collected -objective
money <- html_obj %>% html_nodes(".m-progress-meter-heading") %>% html_text()
  
# 6) doner, shares and followers
popularity <- html_obj %>% html_nodes(".text-stat-value") %>% html_text()
  
# 7) Comments
comments <- html_obj %>% html_nodes(".o-expansion-list-wrapper") %>% html_text()
  
# 8) Category
category <- html_obj %>% html_nodes(".a-link") %>% html_text()
  
  
  
# create the df with all the info
review_data <- data.frame(project=project, 
                            name= gsub("\\Organizador.*","",info[7]),
                            location=str_remove(location[7], "Organizador"),
                            dates = dates, 
                            collected = unlist(strsplit(money, " "))[1], 
                            objective = unlist(strsplit(money, " "))[8], 
                            donor = popularity[1],
                            shares = popularity[2],
                            follow = popularity[3],
                            comments = extract_numeric(comments), 
                            category = category[17], 
                            stringsAsFactors = F)  

#加载rvest包
图书馆(rvest)
库(magrittr)#用于“>%”管道符号
库(RSelenium)#获取加载的html
图书馆(purrr)#供“地图”获取回复
图书馆(三年)#摘录#数字(年)
图书馆(stringr)
df_0%html_文本()
#5)收款-目标
金钱%html\u节点(“.m-progress-meter-heading”)%%>%html\u文本()
#6)捐赠者、股份和追随者
流行度%html\u节点(“.text stat value”)%%>%html\u text()
#7)评论
注释%html\u节点(“.o-expansion-list-wrapper”)%>%html\u文本()
#8)类别
类别%html\u节点(“.a-link”)%%>%html\u文本()
#使用所有信息创建df

查看数据页面会发出POST请求,您可以模拟/简化该请求。为了保持动态,您需要首先从源js文件中获取api密钥和应用程序id,然后在后续POST请求中传递它们

在下面,我只是从每个请求中提取URL。我将帖子的查询字符串设置为每页最多有20个结果。在一个初始请求(在该请求中我检索页面数)之后,我在页面数之间映射一个函数,从每个页面的POST响应中提取URL;更改
页面
参数

最后,您将得到一个URL列表,其中列出了所有项目的URL,您可以访问这些项目以从中提取信息;或者,可能向发出xmlhttp请求

注意:代码可以重新分解一点,以便整理

library(httr)
library(stringr)
library(purrr)
library(tidyverse)

get_df <- function(x){
  df <- map_dfr(x, .f = as_tibble) %>% select(c('url')) %>% unique() %>% 
    mutate( url = paste0('https://es.gofundme.com/f/', url))
  return(df)
}

r <- httr::GET('https://es.gofundme.com/static/js/main~4f8b914b.bfe3a91b38d67631e0fa.js') %>% content(as='text')

matches <- stringr::str_match_all(r, 't\\.algoliaClient=r\\.default\\("(.*?)","(.*?)"')

application_id <- matches[[1]][,2]
api_key <-matches[[1]][,3]

headers = c(
  'User-Agent' = 'Mozilla/5.0',
  'content-type' = 'application/x-www-form-urlencoded',
  'Referer' = 'https://es.gofundme.com/'
)

params = list(
  'x-algolia-agent' = 'Algolia for JavaScript (4.7.0); Browser (lite); JS Helper (3.2.2); react (16.12.0); react-instantsearch (6.8.2)',
  'x-algolia-api-key' = api_key,
  'x-algolia-application-id' = application_id
)  
post_body <- '{"requests":[{"indexName":"prod_funds_feed_replica_1","params":"filters=status%3D1%20AND%20custom_complete%3D1&exactOnSingleWordQuery=word&query=covid&hitsPerPage=20&attributesToRetrieve=%5B%22fundname%22%2C%22username%22%2C%22bene_name%22%2C%22objectID%22%2C%22thumb_img_url%22%2C%22url%22%5D&clickAnalytics=true&userToken=00-e940a6572f1b47a7b2338b563aa09b9f-6841178f&page='
page_num <- 0
data <- paste0(post_body, page_num, '"}]}')
res <- httr::POST(url = 'https://e7phe9bb38-dsn.algolia.net/1/indexes/*/queries', httr::add_headers(.headers=headers), query = params, body = data) %>% content()
num_pages <- res$results[[1]]$nbPages
df <- get_df(res$results[[1]]$hits)
pages <- c(1:num_pages-1)

df2 <- map_dfr(pages, function(page_num){
  data <- paste0(post_body, page_num, '"}]}')
  res <- httr::POST('https://e7phe9bb38-dsn.algolia.net/1/indexes/*/queries', httr::add_headers(.headers=headers), query = params, body = data) %>% content()
  temp_df <-get_df(res$results[[1]]$hits)
}
)

df <- rbind(df, df2)
库(httr)
图书馆(stringr)
图书馆(purrr)
图书馆(tidyverse)
获取_df%unique()%%>%
变异(url=0('https://es.gofundme.com/f/,网址(
返回(df)
}
r%内容(如='text')

非常感谢您的投入。但是,当我尝试运行您给我的代码时,当我定义变量df2时,它会返回我以下错误:
is.url(url)中的错误:
无法将类型“closure”强制为类型“character”的向量。
我无法准确识别错误,您能帮助我吗?对不起。现在更新了几个打字错误。太棒了。非常感谢。这段代码很棒。我必须试着自己理解它,以便能够在其他情况下应用它。怀疑。我有1020个项目。但是我认为在你指出的链接中还有更多()。我不知道你为什么不把它们都弄到手。这还归功于我运行代码:
未提供编码:默认为UTF-8
。我不知道这是一个错误还是一个警告。我不知道对你来说这是非常乏味的,能够解释或给我发一个网站,我解释了从源js文件中获取应用程序id的API密钥,然后在后续POST请求中传递这些密钥的步骤。浏览51页,每页显示20个结果,我得到1020个链接。我认为提取更多链接的关键可能在js文件中,对吗?在我想提取其链接的页面上,网络上显示大约有53万个活动。我怎样才能获得比所有链接更多的链接@我不知道你是否能做到这一点。谢谢大家!@QHarr