爬虫系列教程二:如何获取网页信息并定位信息所处位置

在爬虫中如何获取并定位网页的信息

由于我们获取网页的类型的不同,我们希望爬取的信息的定位方法也有很大差别,但总体来说我们想要爬取的网页可以分为静态和动态,下面讲述在不同的情况下如何爬取这些信息;

网页的不同类型

  • 根据获取网页的方式不同可以分为
    • 静态网页
      • 静态网页是只在用户打开网页时,网站服务器与用户的浏览器通信一次,用户便获取了所有的信息,之后,用户可以不再与服务器发生任何通信;
    • 动态网页
      • 动态网页是用户打开网页后,浏览器和服务器多次通信,动态地获取信息,用户获取的信息是在浏览器和网页多次交互中获得的。
    • 为什么要区分这两种网页
      • 根据定义的不同,我们发现这两种网页的获取信息的方式有很大的不同,前者的所有消息都在第一次通信中获取,但是后者的信息可能是分散在多次通信中的。我们需要根据需要获取的信息的位置的不同,采用不同的方法。

爬虫获取网页信息的方法

  • 我们获取网页信息方法的核心实现是以尽量少的代价模拟正常用户请求网页时的行为,在获取信息之后,才能针对网页进行解析;
  • 我们首先介绍一些获取网页信息的工具,然后根据网页类型的不同,讲解如何使用这些工具;
    • 工具一:向服务器发送访问请求:
      • 这类工具可以模拟浏览器向服务器发送访问的请求,但是获取到的代码是未经渲染的,也就是不能运行其中的js代码;
      • python
        • urilb
        • requests
    • 工具二:用JS引擎渲染爬取到的js代码:
      • 这类方法可以弥补上一种方法的缺点:无法渲染js,针对动态网页有极大的作用;
      • PhantomJS
    • 工具三:模拟一个浏览点击网页:
      • 这类方法直接打开一个浏览器进行操作,从性能上来说比较慢,但是对动态网页具有奇效,适合比较闲适的人(懒人)使用;
      • webdriver
      • selenium
      • ghost
  • 根据网页类型的不同,我们将获取网页信息的方法分为直接请求、分析请求、和模拟请求法;
    • 静态网页
      • 直接请求法
        • 因为所有的信息都在第一个请求中发送了过来,所以我们直接向服务器请求一个网页,就可以拿到所有的信息;
        • 我们直接使用工具一中的方法就可以完成,当然我们也可以采用工具三中的方法,但是显然工具一的性能高,占用资源少,所以推荐工具一;
        • 注意:有一种特殊情况,网页中的信息有一部分是用js生成的,但是这部分信息是在第一次请求网页的时候你可以一次性拿到的,在爬取到的网页内容中是可以看到在js部分的json数据的,这种情况下,我们也将其归为静态网页;注意和动态网页的使用js代码再次获取数据相区分;这种情况下,工具一也可,因为信息拿到了;当然,你也可以用工具二来将数据整合到网页中,由个人喜好来决定;
    • 动态网页
      • 由于这类网页的信息是js向服务器发送请求得到的,但是用工具一中的方法获取到的js代码不能被执行,所以我们需要用其它的方法绕过js或者解析js;
      • 分析请求法
        • 这类方法的核心是绕过js,通过抓包分析,阅读js代码,从而得到服务器的api接口等规则,从而访问api接口,得到我们想要的数据(一般是json字符串);
        • 这类方法只使用工具一就可以完成所有的任务,效率高,但是对爬虫编写者有较高的要求;
      • 模拟请求法
        • 模拟请求法:想办法模拟浏览器解析js代码,解析后获取的html文件,就包含了所有的信息;
        • 我们可以用工具一来获取所有的代码,用工具二中渲染js,就得到了完整的网页;
        • 也可以使用工具三的方法,显然工具三的自动化程度更高,但是效率也更低,资源占用情况也更多;
  • 总结一下:
    • 静态网页采用工具一、工具二(情况比较特殊)和工具三均可;
    • 动态网页采用工具一(需要分析api接口)、工具一+工具二、工具三均可;
    • 其中工具一的效率最高,占用资源最少,难度也相应较大;工具三的效率最低,占用资源最高,难度也相应较低;

爬虫定位网页信息的方法

  • 爬虫定位网页信息的步方法分为两种:匹配文本、建树搜索;下面我们按照这两类方法,具体介绍一下各个工具:
    • 两类工具
      • 第一类:匹配文本
        • 匹配文本的意思是直接在文本内容上做匹配;
        • 例子:正则表达式;正则表达式就是直接按照一个特定的规则去匹配文本,不需要对网页的结构进行分析,只需要对需要定位的信息的上下文进行分析;
      • 第二类:建树搜索
        • 建树搜索的流程分为两步:第一步是建树,也就是解析;第二步是搜索,搜索的方法是根据树的结构,搜索想要的内容。
        • 解析大体上有两个方法:dom,sax;各个浏览器大多采用这两个标准去自己实现一个方法,也有libxml,libxslt,python内置的解析库等(对java不太熟悉,在网上查阅过程中,发现java有很多解析库);
        • 搜索的例子:在搜索上,我们有两类方法,一类是xpath,一类是css选择器;这两个方法其实对应解析器的两类作用对象:文本和样式表;在chrome、firefox浏览器里面可以直接选择这两类方法所对应的路径;
        • 最后我们经常使用的比较成熟的库:lxml,bs4,xquery,xpoint:
  • 最后根据网页类型的不同,我们再来确定我们使用的工具:
    • 静态网页
      • 我们获取的信息由于是html或者css里面的,我们直接通过匹配文本或者是建树搜索都可以完成定位信息的功能;
      • 但是注意上面提到的一种特殊情况
        • 如果信息是在js代码的内部一次性发送过来(注意这里是一次性发送过来,不是异步发送),我们需要用匹配文本的方式去匹配;
        • 如果这种情况下我们用了当时的渲染js代码的方法,我们就也可以用建树搜索了;
    • 动态网页
      • 如果获取网页信息是用分析api的方法:我们从json数据中拿到信息;
      • 如果我们的网页信息是用js引擎渲染的方法,我们又有两种处理方法:
        • 第一种是我们用文本匹配、或者建树搜索;
        • 第二种是我们使用js引擎直接操作dom api,找出相应的内容;这种方法在上面介绍定位信息的工具的时候没有讲,适合js比较熟练的同学;
        • 第三种是我们用模拟请求法获取信息时,这个时候用文本匹配、或者建树搜索都可以;

参考资料

[1] 百科XML https://baike.baidu.com/item/XML%E8%A7%A3%E6%9E%90%E5%99%A8/2673664?fr=aladdin
[2] 百科DOM https://baike.baidu.com/item/%E6%96%87%E6%A1%A3%E5%AF%B9%E8%B1%A1%E6%A8%A1%E5%9E%8B/1033822?fromtitle=DOM&fromid=50288&fr=aladdin
[3] 知乎DOM https://www.zhihu.com/question/34219998
[4] XSL页面 https://www.w3.org/Style/XSL/
[5] 百科Xpath https://baike.baidu.com/item/XPath
[6] Xpath官网 https://www.w3.org/TR/xpath/all/
[7] Libxml2官网 http://xmlsoft.org/
[8] Libxlst教程 http://xmlsoft.org/XSLT/tutorial/libxslttutorial.html
[9] LXML官网 https://lxml.de/
[10] html5lib官网 https://html5lib.readthedocs.io/en/latest/html5lib.html#
[11] 几个概念的对比 https://www.zhihu.com/question/20097166
[12] bs和lxml的对比 https://www.zhihu.com/question/26494302

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章