1. 首先摘抄一下之前的教程内容,确定一下这些概念之间的逻辑关系,如果看过就可以略去
A. 爬虫定位网页信息的步方法分为两种:匹配文本、建树搜索;下面我们按照这两类方 法,具体介绍一下各个工具:
- 两类工具
- 第一类:匹配文本
- 匹配文本的意思是直接在文本内容上做匹配;
- 例子:正则表达式;正则表达式就是直接按照一个特定的规则去匹配文本,不需要对网页的结构进行分析,只需要对需要定位的信息的上下文进行分析;
- 第二类:建树搜索
- 建树搜索的流程分为两步:第一步是建树,也就是解析;第二步是搜索,搜索的方法是根据树的结构,搜索想要的内容。
- 解析大体上有两个方法:dom,sax;各个浏览器大多采用这两个标准去自己实现一个方法,也有libxml,libxslt,python内置的解析库等(对java不太熟悉,在网上查阅过程中,发现java有很多解析库);
- 搜索的例子:在搜索上,我们有两类方法,一类是xpath,一类是css选择器;这两个方法其实对应解析器的两类作用对象:文本和样式表;在chrome、firefox浏览器里面可以直接选择这两类方法所对应的路径;
- 最后我们经常使用的比较成熟的库:lxml,bs4,xquery,xpoint:
- 第一类:匹配文本
B. 根据网页类型的不同,我们再来确定我们使用的工具:
- 静态网页
- 我们获取的信息由于是html或者css里面的,我们直接通过匹配文本或者是建树搜索都可以完成定位信息的功能;
- 但是注意上面提到的一种特殊情况
- 如果信息是在js代码的内部一次性发送过来(注意这里是一次性发送过来,不是异步发送),我们需要用匹配文本的方式去匹配;
- 如果这种情况下我们用了当时的渲染js代码的方法,我们就也可以用建树搜索了;
- 动态网页
- 如果获取网页信息是用分析api的方法:我们从json数据中拿到信息;
- 如果我们的网页信息是用js引擎渲染的方法,我们又有两种处理方法:
- 第一种是我们用文本匹配、或者建树搜索;
- 第二种是我们使用js引擎直接操作dom api,找出相应的内容;这种方法在上面介绍定位信息的工具的时候没有讲,适合js比较熟练的同学;
- 第三种是我们用模拟请求法获取信息时,这个时候用文本匹配、或者建树搜索都可以;
2. 然后对比一下这几个的具体的关系
A. 正则表达式
由上面的概念可知,正则表达式是独立的一个体系,使用文本匹配的方式,剩下的都是先建树再搜索的一环;
优点是速度快,准确程度高;
缺点是可读性差,不宜修改,编写困难;
B. libxml、lxml、bs4
这些是用来解析网页成为树的,并可以附加xpath、css选择器来寻找文档内容;
- libxml的特点是用编写成的;
- 优点是速度快;
- 缺点是用C 写爬虫的人比较少;
- lxml的特点是在python中继承了libxml:
- 优点是速度相对快,
- 缺点是xpath的表达式比较复杂,当然lxml也支持选择器,这个可能也就不是个缺点了;
- bs4
- 优点是:bs4支持多种解析器,其中包括lxml,也方便配合css选择器;
- 缺点是:性能上和lxml有一定的差距;
C. xpath,css选择器
这两个内容是用来选择树中的内容的,个人觉得xpath和css如果单纯说编写难度的话,前者更高,速度上前者略慢,但是准确性上前者更强。