聚焦爬虫:爬取页面中指定的页面内容。(ajax局部刷新的数据)
数据解析分类:
- 正则 数据解析
- bs4 类
- xpath (*****) 通用性强,其他变成语言 也可以使用
数据解析原理:
- 解析的局部文本内容都会在标签之前或者标签对应的属性中进行存储
正则 数据解析:
# < div class ="thumb" >
# < a href = "/article/123861730" target = "_blank" >
# < img src = "//pic.qiushibaike.com/system/pictures/12386/123861730/medium/962GVYAGLG9ATY0R.jpg"
# alt = "糗事#123861730" class ="illustration" width="100%" height="auto" >
# < / a >
# < / div >
# 指定匹配规则,注意空格
er = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
# . 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
# * 匹配*号前的字符0次或多次, re.search('a*','aaaabac') 结果'aaaa'
# ? 匹配前一个字符1次或0次 ,re.search('b?','alex').group() 匹配b 0次 , 可以起到中止的作用
img_url_list=re.findall(er,response,re.S)
# er 是定制的匹配规则,response 是页面源码文本
# re.S 是 单行匹配
# re.M 是 多行匹配
# re.L 做本地化识别(locale-aware)匹配
# re.I 使匹配对大小写不敏感
# re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
# 多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
bs4 数据解析:
- 数据解析原理:
- 标签定位
- 提取标签、标签属性中存储的数据值
- bs4 数据解析的原理
- 实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
- 通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取
- 环境安装
- pip install bs4 安装 bs4 模块
- pip install lxml 使用bs4 进行数据解析 会应用到 lxml 解析器,在xpath 中也会用到
- 如何实例化 BeautifulSoup 对象:
- from bs4 import BeautifulSoup
- 对象实例化:
- 将本地的html文档中的数据加载到该对象中
f = open('./test.html','r',encoding='utf-8')
soup = BeautifulSoup(f,'lxml')
第一个参数是 取到的 本地html文档中的源码,,第二个是固定的 lxml 解析器,此时 的soup 就包含了本地
html中所有文档源码
- 将互联网上面获取到的页面源码加载到该对象中
page_text = response.text
soup = BeautifulSoup(page_text,'lxml')
- 提供用于数据解析的方法和属性:
- soup.tagName(标签名称):返回的文档中第一次出现的tagName对应的标签
- soup.find():
- find('tagName'): 等同于soup.div
- 属性定位: 获取当前类名为 song 的div 标签
- soup.find('div',class_/id/attr='song') class_ 加上下划线,代表是class属性,否者就是关键字
- soup.find_all('tagName'): 返回符合要求的所有标签 (列表)
- select:
- select('.tang') 参数可以为 id,class,标签...等选择器,返回一个列表
- 层级选择器:
- > 大于号表示的是一个层级
- soup.select('.tang > ul > li > a ')[0]
- 返回一个列表,可以利用列表的索引找到想要的某一个值
- 多个层级: 空格 表示多个层级
- soup.select('.tang > ul a ')[0]
- 获取标签之间的文本数据
- soup.select('.tang > ul > li > a ')[0].text
- soup.a.text/string/get_text() 这三种方法都可以获取到 标签之间的 文本数据
- text 和 get_text() : 可以获取到某一个标签中所有的文本内容,不是直系的内容也会直接获取
- string : 只可以获取到该标签下面的直系文本内容,如果直系中没有文本内容,则返回None
- 获取标签中的属性值
- soup.select('.tang > ul > li > a ')[0].['href']
- soup.a['href'] 直接获取 a 标签中的 href 属性值
xpath 数据解析 (最常用的一款数据解析方式)
- xpath 解析原理
- 实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中
- 调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获
- 环境的安装:
- pip install lxml
- 如何实例化一个 etree 对象: from lxml import etree
- 将本地的 html 文档中的源码数据加载到 etree 对象中
- etree.parse(filePath) 参数: 本地所存储的html文件的路径
- 将从互联网上获取到的源码数据加载到该对象中
- etree.HTML('page_text') 参数: 参数是从互联网中获取的响应数据
- 调用 xpath 方法
- xpath('xpath表达式') 参数就是 xpath 的表达式 (核心即使 xpath 的表达式编写)
- xpath 表达式:
- tree = etree.parse('test.html')
- r = tree.xpath('/html/body/div') / 开头是从根节点开始定位,找到html下的body标签下的div标签,返回列表
- r = tree.xpath('/html//div') 结果同上
- / : 相当与 bs4 中的 > 属于单个层级, // : 相当于 bs4 中的 空格 属于多个层级
- r = tree.xpath('//div') 结果同上面两种一样 (找到源码中的所有div标签)
- 属性定位:
- r = tree.xpath('//div[@class="song"]') class='song' 所对应的 div ,返回列表
- 通用的 写发:tag[@attrName="attrValue"]
- 索引定位:
- r = tree.xpath('//div[@class="song"]/p[3]') 取第三个p标签 注意:这里的索引是从1开始的,而不是从0开始
- 取文本:
- r = tree.xpath('//div[@class="tang"]//li[5]/a/text()') 定位到 div下的第5个li标签中的a标签里的text文本,返回列表
可以根据列表的索引,来拿到字符串,/text()获取的是直系关系的文本
- //text(): 如果要取到不是直系的文本内容, 将 /text() 改为 //text() 即可
获取标签中非直系文本内容(该标签下的所有文本内容)
- 取属性:
- r = tree.xpath('//div[@class="song"]/img/@src')
- 格式:
- /@attrName ===>>> img/@src