2022年 11月 9日

Python网络爬虫之数据解析篇

对于爬虫中的数据解析,简单理解就是在通用爬虫获取到的响应数据中,进一步提取出我们需要的某些特定数据,例如一段文字,一张图片。 

聚焦爬虫:爬取页面中指定的页面内容。

——编码流程

1、指定url

2、发起请求

3、获取响应数据

4、数据解析

5、持久化存储

数据解析分类:

——正则

——bs4

——xpath(***通用性强)

数据解析原理:

——解析的局部文本内容都会在标签之间或标签对应的属性中进行存储

——1、进行指定标签的定位

——2、标签或标签对应属性中存储的数据值进行提取(解析)

数据解析之正则表达式

正则表达式:

可以视为通配符的增强版,作用是匹配制定规则的字符串。

——限定符

1、?:代表前面的字符出现0次或者1次

2、*:代表匹配0或多个前面字符

3、+:代表匹配出现一次以上的前面字符

4、{…}:指定前面的字符出现的次数,例如,{2,6}代表出现2~6次,{2,}代表出现2次以上

注意:以上四种针对的都是单个字符,若想针对多个字符,可用()将目标字符串括起来。

——”或“运算符(…|…)

例如(cat|dog),意为匹配cat或dog

——字符类(Character Classes)

1、[…]+ 方括号中的内容代表要求匹配的字符只能取自于他们

2、可在方括号中指定字符的范围。如[a-z]+,代表所有小写英文字母;[a-zA-Z]+,代表所有英文字母

3、若在方括号前面加一个“^”,则代表要求匹配除了尖号后面列出的以外的字符。如[ ^0-9]+,代表所有的非数字字符

——元字符(Meta-Characters)

正则表达式中大多数元字符都以反斜杠开头。

\d:代表数字字符

\w:代表单词字符(所有英文字符、数字以及下划线)

\s:代表空白字符(包含Tab(制表符)和换行符)

\D:代表非数字字符

\W:代表非单词字符

\S:代表非空白字符

句点 . :代表任意字符,但不包括换行符

特殊字符:^匹配行首,$匹配行尾

如^a只会匹配行首的a,a$只会匹配行尾的a

——贪婪与懒惰匹配

贪婪匹配:正则表达式中*+{}在匹配字符串时会默认匹配尽可能多的字符。如 .+代表任意单个字符匹配多次

懒惰匹配:.+?代表满足条件的情况只匹配一次

数据解析之bs4

bs4数据解析原理:

——1、实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中

——2、通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取

如何实例化BeautifulSoup对象:

——from bs4 import BeautifulSoup

——对象的实例化:

1、将本地的html文档中的数据加载到该对象中

  1. fp = open('./sougou.html','r',encoding='utf-8')
  2. soup = BeautifulSoup(fp,'lxml')

2、将互联网上获取的页面源码加载到该对象中

  1. page_text = response.text
  2. soup = BeautifulSoup(page_text, 'lxml')

用于数据解析的方法和属性(tagName意为标签名):

——soup.tagName:返回的是html中第一次出现的tagName对应的标签

——soup.find(参数):

1、find('tagName'):等同于soup.tagName

2、属性定位 :可根据具体属性定位标签,语法如

soup.find('div',class_='content')

——soup.find_all(‘tagName’):返回符合要求的所有标签(列表)

——soup.select(参数)

1、select(‘某种选择器(id, class, 标签……选择器)’),返回的是一个列表

2、层级选择器:

(1)

soup.select('.tang > ul > li > a')

:>表示的是一个层级

(2)

soup.select('.tang > ul a')

:空格表示多个层级

如何获取标签之间的文本数据:

——soup.tagName.text/string/get_text()

text/get_text():可以获取某一个标签中所有文本内容

string:只可以获取该标签下直系的文本内容

如何获取属性值:

soup.tagName['属性名']

数据解析之xpath

该方式是最常用且最便捷高效的一种方式。

xpath解析原理:

——1、实例化一个etree的对象,且将需要被解析的页面源码数据加载到该对象中

——2、调用etree对象中的xpath方法结合xpath表达式实现标签的定位和内容的提取

如何实例化一个etree对象:from lxml import etree

——1、将本地 的html文档中的源码数据加载到etree对象中,如

etree.parse(filePath)

——2、可将从互联网上获取的源码数据加载到该对象中,如

etree.HTML('page_text')

xpath表达式(层级选择)(返回列表)

——/:放在标签最前面表示的是从根节点开始定位。放在标签之间表示的是一个层级。

——//:放在标签之间表示多个层级(效果等同bs4中select()方法中的空格),放在单个标签之前表示从任意位置开始定位(例如’//div‘,表示定位所有div标签)

——属性定位:例如

tree.xpath('//div[@class="song"]')

,表示定位标签名为div,属性名为class,值为song的标签

——索引定位:例如

'//div[@class="song"]/p[3]'

,表示定位上述标签下的第三个p标签。ps:索引从1开始。

——获取文本:

1、/text():获取标签直系文本内容

2、//text():获取标签下所有文本内容

——获取属性值:

/@属性名