使用 R 抓取你的第一个网页
介绍
本指南将以《R 中的 Web 爬取》指南为基础,该指南详细介绍了 R 中的 Web 爬取和 Web 抓取的基础知识。现在,我们将重点介绍如何在 R 的帮助下抓取网页,并研究允许您从选定网站抓取信息的不同技术。首先,我们将阐明 R 中的哪些模块支持此活动,然后我们将构建一个小型解决方案来抓取我们选择的特定网站。
网页抓取
互联网上数据量的指数级增长为数据科学家开辟了新视野,网络抓取也越来越受欢迎。如今,几乎没有一个感兴趣的话题在互联网上找不到,而通过挖掘相关信息来理解所有噪音的技能已经变得非常宝贵。
数据很少采用适当的格式,需要使用能够理解的语言进一步处理。当您抓取数据时,最常见的格式是 HTML,这种格式适合人眼通过网络浏览器查看,但很难通过编程进行处理。
网络抓取就是这样的艺术:以编程方式理解 HTML 格式的数据块。
假设由于疫情,你正在疯狂观看恐怖剧,而你当前的剧集只剩下一部了。无奈之下,你求助于 R 编写一个小脚本来解析相应的类别,并为你提供该类型中评分最高的剧集。
为了开始抓取,您需要打开 R 控制台并安装rvest包。
      install.packages("rvest")
    
在您的网络浏览器中,导航到 IMBD.com 并选择评分最高的恐怖节目。
从浏览器中复制 URL。此 URL 将作为开始抓取的锚点。加载rvest模块并使用 URL初始化horror变量。
      library("rvest")
horror <- "https://www.imdb.com/search/title/?genres=horror&explore=title_type,genres&pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=3396781f-d87f-4fac-8694-c56ce6f490fe&pf_rd_r=AFA6QBCC85CEAWNC6GTC&pf_rd_s=center-1&pf_rd_t=15051&pf_rd_i=genre&ref_=ft_gnr_pr1_i_3"
    
现在您可以加载页面内容。
      HTML <- read_html(horror)
    
应该可以看到以下输出。
      {html_document}
<html xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml">
[1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8 ...
[2] <body id="styleguide-v2" class="fixed">\n            <img height="1" widt ...
    
这是您想要抓取的信息。
- 秩
 - 等级
 - 标题
 - 描述
 
您可以从浏览器中选择,但您希望自动化该过程。
在这种情况下,您可以使用两种主要方法:CSS 选择器和XPATH。两者都需要一些 HTML 知识以及代码结构。CSS 选择器允许您根据样式在 HTML 代码中查找元素。XPATH 将 HTML 页面视为 XML 文档,并使用路径表达式在网页上查找特定元素。根据给定的站点,使用其中一种可能比使用另一种更容易。例如,如果站点有很多动画和闪烁的框,那么使用 CSS 选择器可能更明智。总而言之,两者都可以完成工作。现在,在这种情况下使用 CSS 选择器。
在浏览器中打开 IMDB 网站上的开发人员工具,并将鼠标悬停在排名第一的系列上。
span.lister-item -index.unbold.text-primary是相关代码,您需要使用最后一部分.text-primary。使用html_nodes()函数提取相关 HTML 代码,然后使用html_text()函数处理结果。
      ranking_html <- html_nodes(HTML,'.text-primary')
ranking <- html_text(ranking_html)
    
结果应该看起来像这样。
      1] "1."  "2."  "3."  "4."  "5."  "6."  "7."  "8."  "9."  "10." "11." "12." "13." "14." "15." "16." "17." "18." "19." "20." "21." "22." "23."
[24] "24." "25." "26." "27." "28." "29." "30." "31." "32." "33." "34." "35." "36." "37." "38." "39." "40." "41." "42." "43." "44." "45." "46."
[47] "47." "48." "49." "50."
    
现在,由于该过程是迭代的,您可以用相同的方式提取标题。可以通过.ratings-imdb-rating CSS 选择器找到。
      rating_html <- html_nodes(HTML,'.ratings-imdb-rating')
rating <- html_text(rating_html)
    
这有点难以做到正确,因为除了纯评级值之外还有其他残余。
      1] "\n        \n        8.2\n    " "\n        \n        7.0\n    " "\n        \n        5.3\n    " "\n        \n        7.2\n    "
 [5] "\n        \n        8.4\n    " "\n        \n        8.8\n    " "\n        \n        5.9\n    " "\n        \n        6.4\n    "
 [9] "\n        \n        8.3\n    " "\n        \n        7.1\n    " "\n        \n        7.5\n    " "\n        \n        3.7\n    "
[13] "\n        \n        7.4\n    " "\n        \n        8.1\n    " "\n        \n        5.8\n    " "\n        \n        7.7\n    "
[17] "\n        \n        6.8\n    " "\n        \n        7.4\n    " "\n        \n        8.3\n    " "\n        \n        7.5\n    "
[21] "\n        \n        7.6\n    " "\n        \n        6.9\n    " "\n        \n        7.5\n    " "\n        \n        8.7\n    "
[25] "\n        \n        4.5\n    " "\n        \n        7.0\n    " "\n        \n        8.4\n    " "\n        \n        6.7\n    "
[29] "\n        \n        5.2\n    " "\n        \n        8.2\n    " "\n        \n        6.6\n    " "\n        \n        7.3\n    "
[33] "\n        \n        8.8\n    " "\n        \n        5.0\n    " "\n        \n        5.7\n    " "\n        \n        8.4\n    "
[37] "\n        \n        7.6\n    " "\n        \n        6.3\n    " "\n        \n        7.3\n    " "\n        \n        1.9\n    "
[41] "\n        \n        6.8\n    " "\n        \n        8.4\n    " "\n        \n        7.6\n    " "\n        \n        6.9\n    "
[45] "\n        \n        8.5\n    " "\n        \n        8.2\n    " "\n        \n        7.0\n    " "\n        \n        7.0\n    "
[49] "\n        \n        6.9\n    "
    
gsub ()函数可用于删除不必要的字符。首先删除\n字符,然后删除多余的空格。
      rating <-  gsub("\n","",rating)
rating <-  gsub(" ","",rating)
    
现在收视率看上去也不错。
      1] "8.2" "7.0" "5.3" "7.2" "8.4" "8.8" "5.9" "6.4" "8.3" "7.1" "7.5" "3.7" "7.4" "8.1" "5.8" "7.7" "6.8" "7.4" "8.3" "7.5" "7.6" "6.9" "7.5"
[24] "8.7" "4.5" "7.0" "8.4" "6.7" "5.2" "8.2" "6.6" "7.3" "8.8" "5.0" "5.7" "8.4" "7.6" "6.3" "7.3" "1.9" "6.8" "8.4" "7.6" "6.9" "8.5" "8.2"
[47] "7.0" "7.0" "6.9"
    
.lister -item-header CSS 选择器允许您提取标题。
      title_html <- html_nodes(HTML,'.lister-item-header a')
title <- html_text(title_html)
    
输出不需要进一步处理。
      1] "The Walking Dead"                "A platform"                      "Gretel & Hansel"                 "A láthatatlan ember"             "Odaát"                           "Különös dolgok"                 
 [7] "Árok"                            "Vadászat"                        "Vaják"                           "Fehér éjszakák"                  "Legacies: A sötétség öröksége"   "The Turning"                    
[13] "Kulcs a zárját"                  "Amerikai Horror Story"           "Vivarium"                        "Vámpírnaplók"                    "Train to Busan 2"                "Zombieland: A második lövés"    
[19] "Álom doktor"                     "A királyság titkai"              "Vonat Busanba: Zombi expressz"   "A világítótorony"                "Fear the Walking Dead"           "Hang nélkül"                    
[25] "A Hill-ház szelleme"             "Brahms: The Boy II"              "Egy szent szarvas meggyilkolása" "Hétköznapi vámpírok"             "I See You"                       "We Summon the Darkness"         
[31] "A sötétség kora"                 "Az - Második fejezet"            "Az"                              "Shingeki no kyojin"              "The Other Lamb"                  "Sea Fever"                      
[37] "Ragyogás"                        "Sabrina hátborzongató kalandjai" "The Wretched"                    "Örökség"                         "Verotika"                        "Aki bújt"                       
[43] "A nyolcadik utas: a Halál"       "28 nappal később"                "Expedíció"                       "Hannibal"                        "Castlevania"                     "Ház az erdő mélyén"             
[49] "Z világháború"                   "Mi"
    
您需要提取的最后一条信息是描述。
      description_html <- html_nodes(HTML,'.detail.sub-list div.lister-list div.lister-item.mode-advanced div.lister-item-content p.text-muted')
description <- html_text(description_html)
    
描述的输出很难变成可读的格式。
      1] "\n            \n                44 min\n                 | \n            \nDrama
    
使用序列来获取每隔一行。
      description<- description[seq(0, length(description), 2)]
    
现在剩下的就是删除\n字符和尾随空格。要删除空格,trimws()函数是完美的选择!
      description <- gsub('\n','',description)
description <- trimws(description, which =c("left"), whitespace="[ ]")
    
现在您已经掌握了所有信息,只需将它们组合成一个数据框即可。排名和评级应转换为数字类型。使用seq函数仅提取前 10 个。
      ranking <- as.numeric(ranking)
rating <- as.numeric(rating)
horrors <- data.frame(Ranking = ranking[seq(0,10)], Rating = rating[seq(0,10)],Title = title[seq(0,10)], description = description[seq(0,10)])
    
现在,您的恐怖数据框将所有信息整合在一起,您可以使用非常流行的ggplot2<font sty
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
                                
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                
                            
                                    
                                    
                                    
                                    
    
    
            
  
        
请先 登录后发表评论 ~