数据采集基础知识(爬虫相关)(三) | 「掘金日新计划 · 12 月更文挑战」

130 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天

一、本篇笔记重点内容:

  • 网页结构
  • 了解数据抽取的三种方法
  • 使用正则表达式
  • 使用Python库:Lxml、BeautifulSoup、Xpath
  • 使用JSON数据处理

二、详细知识点介绍

网页结构

根据网站的组成结构,网站可以分为以下两类:

  • 静态网站: 纯粹采用HTML语言编写,内容不变

  • 动态网站: 服务器端动态生成:使用ASP、PHP等语言进行编写,在服务器端运行,根据浏览器请求的地址及参数,动态从数据库中读取数据,并填入预先写好的模板中,实时生成所需要的HTML网页,返回给浏览器,在浏览器看来跟静态网站没有区别 浏览器端动态加载:随时能实现更新,使用Javascript,AJAX渲染加载内容

  • 对网络爬虫而言: 服务器端动态生成的网页,因为使用了模板,可以较方便地从大量非常相似的网页中抽取感兴趣的内容和数据,相当于还原了服务器的后台数据库 使用正则表达式等工具,直接从HTML页面匹配内嵌的内容 通过分析AJAX,以及Javascript等脚本,匹配动态加载的内容

了解数据抽取的三种方法

Ø 正则表达式

Ø 使用Python库:Lxml、BeautifulSoup、Xpath

Ø JSON数据处理

使用正则表达式

正则表达式可以用来检索,匹配,替换符合给定规则的字符串或者文本 image.png

正则表达式语言由两种基本字符类型组成:

  • 原义(正常)文本字符
  • 元字符 image.png

分组

使用正则表达式匹配重复的单字符,只需在字符后面加上相应的元字符

如果要匹配重复的字符串呢? 使用小括号() 把目标字符串包裹起来:(abc)? 可以匹配0个或者多个字符串abc

分组可以分为两种形式:捕获组和非捕获组

什么是捕获呢?

小括号包裹起来的表达式去匹配字符串,匹配的结果可以在后续的匹配过程中使用

  • 把表达式中的括号进行编号,从左到右,以左括号出现的前后顺序为准,第一个出现的分组,组号即为1。
  • 组号0代表正则表达式整体
  • 例如,正则表达式(\d{4})-(\d{2}-(\d\d))
  • 匹配 2017-04-19

image.png 非捕获组是指以 (?) 开头的分组组,它不捕获文本,没有分组编号,也不针对组合计进行计数

  • 捕获组会默认把括号里的文本捕获过来以供下次使用。如果只是需要正则匹配,没有额外需求,使用非捕获组可以完成任务,降低资源消耗
  • 例如: 匹配0到100范围内的整数
  • 捕获组正则表达式 ^([0-99]|100)$
  • 非捕获组正则表达式 ^(?:[0-99]|100)$

使用re库匹配文本的一般过程是:

  • 使用compile函数将正则表达式编译为pattern对象
  • 使用pattern对象检索文本,获得匹配的结果(Match对象)
  • 使用Match对象获得匹配结果的信息,进行相关操作

使用Python库:Lxml、BeautifulSoup、Xpath

lxml

  • 是Python语言中处理XML和HTML的第三方库:
  • 底层封装C 语言编写的libxml2和libxslt包
  • 提供简单有效的Python API

根据目标文本的类型,lxml提供不同的函数来去解析:

  • fromstring(): 解析字符串
  • HTML(): 解析HTML类型对象
  • XML(): 解析XML类型对象
  • parse(): 解析文件类型对象

BeautifulSoup

是Python语言中另一种解析XML/HTML的第三方解析库:

  • 处理不规范标记并生成分析树 (parse tree)
  • 提供简单常用的导航,搜索以及修改分析树的操作功能

与正则表达式和lxml相比,BeautifulSoup优势

  • 提供python式的函数用来处理导航、搜索、修改分析树等功能
  • 自动将输入编码转换为Unicode,输出编码转换为utf-8
  • 为用户提供不同的解析策略或强劲的速度
  • 相比正则解析,降低学习成本
  • 相比XPATH解析,节约时间成本

使用JSON数据处理

JSON是指JavaScript对象表示法(JavaScript Object Notation):

  • 独立于语言和平台
  • 与XML类似,存储和交换文本信息
  • 比XML语言更快、更易解析

image.png