使用 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
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~