文章目录
1.数据解析
1.1数据解析的分类
- 正则
- bs4
- xpth
1.2数据解析的原理
解析的局部文本内容都会在标签之间或者标签对应的属性中进行存储
1.进行指定标签的定位
2.标签或者标签对应的属性中存储的数据值进行提取(解析)
1.3聚焦爬虫
爬取页面中指定的页面内容
编码流程
1.指定url
2.发起请求
3.获取响应数据
4.数据解析
5.持久化存储
2正则表达式爬虫
2.1常用正则表达式回顾
单字符:
.:除换行以外所有字符
[]:[aoe][a-w]匹配集合中任意一个字符
\d:数字[0-9]
\D:非数字
\w:数字、字母、下划线、中文
\W:非\w
\s:所有非空字符包,包括制表符、换页符等等。等价于{\f\t\w\n\r}
\S:非空白
数量修饰:
*:任意多次 >=0
+:至少一次 >=1
?:可有可无 1次或者0次
{m}:固定m次
{m,}:至少m次
{m,n}:m-n次
边界:
$:以某某字符开头
^:以某某字符结尾
分组:
(ab)
贪婪模式: .*
非贪婪(惰性)模式: .*?
re.I 忽略大小写
re.M 多行匹配
re.S 单行匹配
re.sub(正则表达式,替换内容,字符串)
3.bs4进行数据解析
3.1数据解析原理
- 标签定位
- 提取标签、标签属性中存储的数据值
3.2bs4数据解析的原理
1.实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
2.通过调用BeautifulSoup对象中相关的属性或方法进行标签定位和数据提取
3.3环境安装
pip install bs4
pip install lxml
3.4如何实例化BeautifulSoup对象
from bs4 import BeautifulSoup
对象的实例化
1.将本地的HTML文档中的数据加载到该对象中
from bs4 import BeautifulSoup
fp=open('./sogou.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup)
2.将互联网上获取的页码源码加载到该对象中
提供的用于数据解析的方法和属性
- soup.tagName:返回的是文档中第一次出现名为tagName对应的标签
- sopu.find():
find(‘div’)等同于soup.div
属性定位:soup.find(‘div’,class_/id/attr=‘x’)类名为x的div
soup.find_all(‘tangname’):返回符合要求的所有标签
select:
select(‘某种选择器(id、class、标签选择器)’)返回的是一个列表
层级选择器
soup.select(’.ta > ul > li’):>表示一个层级
soup.select(’.ta ul li’):>表示多个层级
获取标签之间的文本内容(数据):soup.a.text/string/get_text()
text/get_text():可以获取某一个标签中所有的文本内容
string:只可以获取该标签下面直系的文本内容
获取标签中的属性值:
soup.find(“标签”)[‘属性值’]
4xpath数据解析
最常用且最便捷高效的一种解析方式。通用性
4.1xpath解析原理
- 实例化一个etree对象,且需要将被解析的页面的源码数据加载到该对象中
- 调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获
4.2环境安装
pip install lxml
4.3如何实例化一个etree对象
from lxml import etree
- 将本地的HTML文档中的源码数据加载到etree对象中
etree.parse(filepath) - 可以将互联网上的源码数据加载到该对象中
etree.HTML(‘page_text’)
xpath(‘xpath表达式’)
4.4xpath表达式
- /:表示从根节点开始定位。表示的是一个层级
- //:表示的是多个层级。可以表示从任意位置开始定位
- 属性定位: //div[@class=‘div1’] 名为div1的id选择器 tag[@attrName="attrvalue]
- 索引定位: //div[@class=“div2”]/p[3] 索引是从1开始的
- 取文本:
/text() 获取的是标签中直系的文本内容
//text() 标签中非直系的文本内容(所有的文本内容) - 取属性 /@attrname 例:img/@src
样例展示
import requests
from lxml import etree
url='https://bj.58.com/ershoufang/?PGTID=0d100000-0000-153f-2e71-d52d39e367c2&ClickID=2'
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.63"
}
res=requests.get(url=url,headers=headers).text
tree=etree.HTML(res)
list=tree.xpath("//section[@class='list']")
for li in list :
t=li.xpath(".//h3/text()")
tt= li.xpath(".//h3/@tittle")
print(t,tt)
5.验证码的识别
5.1验证码与爬虫直接的联系
反爬机制:识别验证码图片中的数据,用于模拟登录操作
5.2识别验证码的操作
- 人工肉眼识别(不推荐)
- 第三方自动识别(推荐)