美文网首页
R爬虫必备基础—rvest为什么不用于动态网页?

R爬虫必备基础—rvest为什么不用于动态网页?

作者: Clariom | 来源:发表于2020-08-13 16:02 被阅读0次

    上一期R爬虫必备—httr+POST请求类爬虫(网易云课堂)主要介绍了httr包如何进行POST请求类爬虫,什么是POST?POST是一种HTTP 请求,根据 HTTP 标准,共有六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

    image.png
    在请求模式中,最常用的请求方法是GET和POST方法,在爬虫过程中至关重要。这两个方法都是从服务器请求一个资源,但是在正文的使用上有所不同。GET方法是网络请求最通用方法,可理解为直接请求。POST则有所区别,需要提交表单信息才能请求到信息

    之前咱们写过R爬虫必备——rvest包的使用,它的网页请求方式就很简单,直接用read_html()即可获取网页,完全没有涉及这些请求方法。怎么看这个包更简单更方便,那为什么不用rvest进行爬取呢?

    read_html():获取并解析网页
    html_nodes():定位并获取节点信息
    html_text():提取节点文本信息
    html_attr():提取节点属性信息
    
    • 首先,rvest的确是个很好的爬虫工具,但它的强项在于网页解析,有两套解析语法可选(Xpath、css), 可以快捷的提取取所需数据,但是它的网页请求功能很脆弱,在实际操作中,特别是动态网页,明明数据就在网页源码中,通过css或者xpath路径,可就是没有返回值,或者总是返回chracter(0)、list(0)或者NULL,代码检查也没任何错误,就是爬取失败。这是因为rvest包提供的read_html()这种访问方式是很脆弱的,因为没有任何伪装措施和报头信息,直接访问存在着很大的隐患。

    • 此外,对于那些异步加载的网页来说,请求的网络资源分成了html纯文档和js脚本,浏览器可以通过解析并执行js脚本来更新关键数据,而通过其他非浏览器终端发送的请求,通常情况下只能拿到纯文档(你可以看到一些script标签中引用的的.js脚本),并不具备解析js脚本的能力。

    • 当然,这并不妨碍rvest包(read_html函数)直接从某些静态网站的URL中解析数据,因为很多静态网页并不会对网络请求做过多限制,比如不检查User-Agent,不做任何的数据隐藏,不限制数据权限等。

    • 当你有权限直接通过URL获取完整网页(注意是完整网页,大家直接理解为静态网页吧),或者已经通过其他请求库(比如httr)获取了完整的网页,下面就交给rvest,读取网页,解析并提取数据。总结来说:httr(请求网页)+rvest(解析网页),这是一对较为经典的工具搭配。还有一组更为复杂的:RCurl(请求网页)+XML(解析网页)。

    read_html

    read_html函数其实直接调用的是xml2包中的read_html方法,rvest包作为请求器的脆弱性便在于此,它是一个I/0函数。通俗一点说就是文件导入导出的操纵函数,与read_csv、read_xlsx、read_table属于同类。在XML包中与之功能一致的函数是xmlParse/xmlTreeParse。xmlParse/xmlTreeParse函数也是仅仅作为RCurl请求包的解析函数使用的,很少有单独使用xmlParse请求并解析网页,它太脆弱了,尽管它是支持直接从url获取并解析网页的。当然,对于那些对网络请求没有过多限制的网页来说,可以直接使用read_html函数获取并解析网页。

    html_nodes

    html_nodes函数是rvest包中非常关键的函数,提供有两套网页解析语法:xpath、css,可以非常便利的提取自己想要的节点信息。在html_nodes函数中,最终的解析函数是xml2中的xml_find_all函数,它的功能类似于XML包中的XpathAapply函数或者getNodest函数。在html_nodes函数中,一切都是xpath,即便你提供的是css路径,也会先被转化为xpath之后再使用xml_find_all函数进行处理。

    html_attrs

    该函数直接调用的xml2包中的xml_attrs函数,就是从节点中批量提取属性值。

    html_text

    该函数调用的xml2包中的xml_text函数,提取节点文本。

    httr+rvest与RCurl+XML两种工具搭配的比较

    image.png

    四种常规参数编码类型:application/x-www-form-urlencoded ;multipart/form-data;application/json;text/xml。

    总结:rvest包的高级请求功能依托于httr(当然你可以直接使用httr来构造请求)。解析器依托于xml2包中的xml_find_all函数实现。解析语法有css和xpath可选,但是最终都会转换为xpath进行解析。借助magrittr包来做管道优化,实现代码简化与效率提升。

    参考:https://cloud.tencent.com/developer/article/1092915

    更多内容可关注公共号“YJY技能修炼”~~~

    往期回顾
    R爬虫在工作中的一点妙用
    R爬虫必备基础——HTML和CSS初识
    R爬虫必备基础——静态网页+动态网页
    R爬虫必备——rvest包的使用
    R爬虫必备基础——CSS+SelectorGadget
    R爬虫必备基础—Chrome开发者工具(F12)
    R爬虫必备基础—HTTP协议
    R爬虫必备—httr+POST请求类爬虫(网易云课堂)

    相关文章

      网友评论

          本文标题:R爬虫必备基础—rvest为什么不用于动态网页?

          本文链接:https://www.haomeiwen.com/subject/xcafrktx.html