首页 > 解决方案 > 使用 R google 搜索进行网页抓取

问题描述

我正在寻找一种在谷歌搜索中使用 R 进行网络抓取的方法。考虑到困难(cookie 和不稳定的标签),我想分享一下如何在谷歌搜索中使用 R 进行网络抓取的想法。

这里举个例子。我选择谷歌“法拉利”并尝试检索所有谷歌搜索页面的 h3。我特别想得到每个 h3 aref-links。

但是,我只能检索 h3 标签和其他一些内容。

url = 'https://www.google.com/search?q=ferrari'

first_page <- read_html(url)

h3 <- first_page %>%   
  html_nodes("a h3")

h3_links <- first_page %>%   
  html_nodes("a h3") %>% html_attr("href")


basic <- first_page %>%   
  html_nodes("span span")

paragraphs <- first_page %>%   
  html_nodes("div div")

因此,我只想问是否有人知道如何在 google 上搜索尽可能多的网页。这可能有助于找到在谷歌上进行网络抓取的正确方法并讨论谷歌跟踪方式。

标签: rweb-scrapinggoogle-search

解决方案


也许你可以尝试这样的事情:

extract_Info_By_Page <- function(page_Content)
{
  page <- read_html(page_Content)
  h3 <- page %>% html_nodes("a h3")
  h3_links <- page %>% html_nodes("a h3") %>% html_attr("href")
  basic <- page %>% html_nodes("span span")
  paragraphs <- page %>% html_nodes("div div")
  return(list(page = page, h3 = h3, 
              h3_links = h3_links, basic = basic,
              paragraphs = paragraphs))
}

library(RSelenium)
library(stringr)
library(rvest)
library(xml2)

shell('docker run -d -p 4445:4444 selenium/standalone-firefox')
remDr <- remoteDriver(remoteServerAddr = "localhost", port = 4445L, browserName = "firefox")
remDr$open()

first_Page <- 'https://www.google.com/search?q=ferrari'
remDr$navigate(first_Page)
page_Content <- remDr$getPageSource()[[1]]

links_Other_Pages <- str_extract_all(page_Content, pattern = "\\<a.aria-label=(.*)\\</a\\>")
links_Other_Pages <- str_split(links_Other_Pages, pattern = "\\<a.aria-label")
links_Other_Pages <- str_extract_all(links_Other_Pages, 'href[^<]*\\<span class\\=\\\\')[[1]]
links_Other_Pages <- str_remove_all(links_Other_Pages, '\\<span class')
links_Other_Pages <- str_remove_all(links_Other_Pages, 'id|pnnext|style|text|align|left')
links_Other_Pages <- unlist(str_extract_all(links_Other_Pages, 'search.*[:alnum:]'))

links_Pages <- c(first_Page, links_Other_Pages)
nb_Pages <- length(links_Pages)
result_By_Page <- list()

for(i in 1 : nb_Pages)
{
  print(i)
  remDr$navigate(links_Pages[i])
  page_Content <- remDr$getPageSource()[[1]]
  result_By_Page[[i]] <- extract_Info_By_Page(page_Content)
}

推荐阅读