【问题标题】:Scraping website in R在 R 中抓取网站
【发布时间】:2018-07-17 05:40:04
【问题描述】:

我正在尝试使用 rvest 从本网站 http://www.napo.net/search/newsearch.asp 中获取专业人士的姓名、城市、州、电子邮件等,但我似乎无法使用选择器小工具获取 CSS 选择器,并且电子邮件受到保护使用 JavaScript。

我查看了论坛,没有看到任何类似的问题。

【问题讨论】:

  • 该搜索结果页面上的成员详细信息通过鼠标悬停显示。似乎有指向这些单个成员详细信息页面的链接。如果您访问这些页面中的每一页并从那里刮掉它会怎样?您可以通过 id 'SearchResultsGrid' 抓取每个成员的 id 链接
  • 您对各个会员页面很感兴趣,但我无法抓取指向他们个人资料的链接。我使用“SearchResultsGrid”作为“html_nodes”(rvest 包)中的选择器,它返回一个空列表
  • 实际的搜索结果页面使用 iframe 元素嵌入到您发布的链接中。我发布下面的代码以使用实际搜索结果链接获取成员列表。

标签: javascript r web-scraping css-selectors


【解决方案1】:

此解决方案使用 seleniumPipes 和 RSelenium 包。您还应该下载 phantomjs,解压缩并将 .exe 文件放入您的 R 工作目录。
此方法使用模拟用户行为的无头浏览器(phantomjs)。它可以读取 javascript 生成的值。

library(rvest)
library(RSelenium) # start a server with utility function
library(seleniumPipes)
rD <- rsDriver (browser = 'chrome',chromever = "latest",port = 4444L)
#open browser
remDr <- remoteDr(browserName = "chrome")

main_page_url <- "http://www.napo.net/search/newsearch.asp"
#go to home page
remDr %>% go(main_page_url)
#switch to iframe
remDr %>% switchToFrame(Id = "SearchResultsFrame")
#get all relative path
relative_path <- remDr %>% getPageSource() %>% html_nodes(".lineitem a[href]") %>% html_attr("href")
#all individual urls:
full_paths <- paste0("http://www.napo.net",relative_path)
#scrape email from each page
email_address <- list()
#Retrieve email adress from the first three results
for(i in seq_along(full_paths[1:3])){
    remDr %>% go(full_paths[i])
    email_adress <- remDr %>% getPageSource()  %>% html_nodes('a[href^="mailto"]') %>% html_text()
    temp_list <- list(email = email_adress)
    email_address <- c(email_address,temp_list)
    Sys.sleep(3)
}
#display result
email_address[1]
    $email
[1] "marla@123organize.com"

以上都是第一页,如果你想翻到第二页:

remDr %>% go(main_page_url)
remDr %>% switchToFrame(Id = "SearchResultsFrame")
#click on page two on iframe to turn to page 2:
remDr %>% findElement(using = "css selector",value = ".DotNetPager a:nth-child(2)") %>% elementClick()
#get relative and full path again
relative_path <- remDr %>% getPageSource() %>% html_nodes(".lineitem a[href]") %>% html_attr("href")
full_paths <- paste0("http://www.napo.net",relative_path)
#And you can do the for loop again
for(i in seq_along(full_paths[1:3])){
    remDr %>% go(full_paths[i])
    email_adress <- remDr %>% getPageSource()  %>% html_nodes('a[href^="mailto"]') %>% html_text()
    temp_list <- list(email = email_adress)
    email_address <- c(email_address,temp_list)
    Sys.sleep(3)
}
#display result[6]
$email
[1] "lynette@itssimplyplaced.com"

email_address
#You can also do a loop to scrape all pages
#-----
#delete session and close server
remDr %>% deleteSession()
rD[["server"]]$stop() 

【讨论】:

  • 非常感谢。请为将来的问题,我可以知道您是如何获得“findElement”功能的css选择器以及用于提取电子邮件和相对路径的css选择器
  • 没错,如果你在源码中搜索关键词,你会发现这一行写着email地址document.write('&amp;lt;a href="mailto:'+ strEmail + '"&amp;gt;'+ strEmail + '&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;');,所以查找以“mailto”开头的href的语法是'a[href ^="mailto"]'。通过使用remDr %&gt;% getPageSource(),所有 javascript 生成的值都会自动呈现(例如&lt;a href="mailto:marla@123organize.com"&gt;marla@123organize.com&lt;/a&gt;)。所以你可以像在普通的 HTML 文件中一样找到它。
  • 另外,你可以像往常一样使用CSS selector gadget,因为javascript生成的值已经被渲染了。这个 CSS 选择器也可以工作:“#SpContent_Container a:nth-child(6)”[1] &lt;a href="mailto:marla@123organize.com"&gt;marla@123organize.com&lt;/a&gt;
【解决方案2】:

我分两步做。

1.获取嵌入式搜索结果页面的链接:

require(rvest)
require(magrittr)
yourlink <- "http://www.napo.net/search/newsearch.asp"
linktoresult <- yourlink %>% read_html() %>%
                html_nodes("iframe") %>% extract(1) %>%
                html_attr("src")

# /searchserver/people.aspx?id=FE0436D0-08ED-4763-8588-09112794521D&cdbid=&canconnect=0&canmessage=0&map=True&toggle=False&hhSearchTerms=

2.从实际搜索结果页面中抓取:

pagelink <- paste0("http://www.napo.net", linktoresult)
# "http://www.napo.net/searchserver/people.aspx?id=FE0436D0-08ED-4763-8588-09112794521D&cdbid=&canconnect=0&canmessage=0&map=True&toggle=False&hhSearchTerms="

yourresult <- pagelink %>% read_html() %>%
              html_nodes("#SearchResultsGrid>.lineitem") %>%
              html_nodes("a") %>% 
              html_attr("href")
#/members/?id=42241027
#NA
#/members/?id=46636113
#/members/?id=37474237
#/members/?id=39530420
#...

【讨论】:

    猜你喜欢
    • 2014-12-25
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多