爬虫流程
数据解析
解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储
- 进行标签的定位
- 标签或者标签对应的属性中存储的数据值进行提取(数据解析)
正则解析
使用正则表达式,利用字符串匹配筛选出所需要的内容
例:
ex = '<div class="thumb">.*?<img src="(.*?)"alt.*?</div>'
# re是python中使用正则表达式的库
# page_text是爬取到页面的源码
# 使用上面定义的正则匹配规则进行解析,得到图片的URL
img_src_list = re.findall(ex,page_text,re.S)
bs4解析
环境安装
pip install bs4
pip install lxml
使用流程
- 实例化一个
BeautifulSoup
对象 - 将html(爬取到的页面数据)加载到该对象中
加载本地的html到对象中
# file_url = '本地html文件的路径'
fp = open(file_url,'r',encoding='utf-8')
soup = BeautifulSoup(fp,'lxml')
加载网络上获取的页面源码加载到对象中
# response是请求到的页面数据
page_text = response.text
soup = BeatifulSoup(page_text,'lxml')
- 通过调用
BeautifulSoup
对象中的属性或者方法进行标签定位和数据提取
提供的属性或方法
soup.tagName
:返回文档中第一次出现的tagName对应的标签。
例soup.img
会返回第一个img标签soup.find()
:soup.find(’tagName‘)
:同soup.tagName
soup.find('div',class_/id/attr='song')
:返回文档中类名/id/属性为song的div标签soup.find_all('tagName')
:返回文档中所有tagName对应的标签组成的数组
select('cssSelector')
:返回符合要求的标签组成的数组
cssSelector是选择器,与css中选择器一样,例select('.tang>ul>li>a')
text/string/get_text()
:
这三个是标签的方法,所以使用方法是soup.a.text
、soup.a.get_text()
、soup.a.string
text/get_text()
可以获取某一个标签中所有的文本内容string
只可以获取该标签下面直系的文本内容
比如下面这种格式,用string只能获取到哈哈,用另外两个可以获取到哈哈嘿嘿
<div>
哈哈
<span>嘿嘿</span>
</div>
- 获取属性值
使用soup.a['href']
可以获取第一个a标签的href属性的值
使用soup.find('div')['id']
可以获取第一个div标签的id值
xpath解析
最常用的解析方式
环境安装
pip install lxml
使用流程
- 实例化一个
etree
对象
from lxml import etree
- 将页面源码加载到该对象中
本地
etree.parse(file_url)
网络
# page_text是请求到的页面数据
# page_text = requests.get(url='https://www.baidu.com',headers=headers).text
etree.HTML(page_text)
- 数据解析
/
:表示是从根节点开始定位,表示一个层级(有点类似写文件路径中的 / )//
:表示多个层级。可以从任意位置开始定位- 属性定位:tag[@attrName=“attrValue”]
//div[@class='song']
- 所以定位:tag[num]
//div/p[3]
- 取文本:/text()
//a/text()
/text()只能取直系文本
//text()可以取标签中的所有文本
- 取属性:@attrName
//img/@src