数据解析之xpath
1.数据解析介绍
"""
网络请求模块 urllib requests 获取整个网页源代码数据的
爬虫四大步骤:
1 发请求 url 请求头参数
get
post 表单参数
2 获取响应
response
3 解析数据
找的数据是垂直数据 最漂亮的女孩子
从获取到的响应数据中 找到自己想要的目标数据 学习数据解析的方式
实际上就是从大盒子中找小盒子
4 保存数据
将小盒子中的数据 保存到本地或者说数据库 持久化
"""
"""
数据解析对应三大方法
1 xpath解析 都是用响应中找数据
2 bs4
3 正则
库的安装:
pip install lxml -i 换源地址
"""
2.lxml的基本使用
# 导入模块
from lxml import etree
# html源代码
web_data = """
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
"""
# 将html转成xml文件
element = etree.HTML(web_data)
# print(element)
# 获取li标签下面的a标签的href
links = element.xpath('//ul/li/a/@href')
print(links) # ['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']
# 获取li标签下面的a标签的文本数据
result = element.xpath('//ul/li/a/text()')
print(result) # ['first item', 'second item', 'third item', 'fourth item', 'fifth item']
"""
1 导入网络请求模块库 数据解析库
2 发请求获取响应
3 将响应对象转成xml对象
4 通过xml对象的xpath语法定位数据 (页面分析)
5 将获取的数据进一步处理即可
"""
3.文本定位测试方法
import requests
from lxml import etree
url = 'https://www.biedoul.com/article/180839'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers)
html = etree.HTML(response.text) # 转成xml对象
data = html.xpath('//div[@class="cc2"]//text()') # 是一个列表
print(data)
data1 = html.xpath('//div[@class="cc2"]')[0].xpath('string(.)')
print(data1)
运行结果:
4.top250实战
"""
1 页面与思路分析:
1.1 确定数据接口 翻页的情况下 考虑url的规律
1.1.1 url分析
1.2 观察请求头信息是否有加密
1.3 确定编码 utf-8
1.4 确定目标数据
1.4.1题目/文档中的需求会给出
1.5 xpath语法构建
1.5.1 难度上升 手写xpath语法
注意点: 我们要的数据是elements中的数据还是网页源代码中的数据 非常相似的
但是我们获取的是网页源代码中的数据 我们elements中标签的属性可能在网页源代码中没有
所以我们elements仅仅只是作为一个辅助定位 实际上我们要找的数据还是在网页源代码中
1.6 保存数据
保存数据的方式
2 代码实现
"""
import requests
from lxml import etree
'''
目标:熟悉xpath解析数的方式
需求:爬取电影的名称 评分 引言 详情页的url 翻页爬取1-10页 保存到列表中
如何实现?
设计技术与需要的库 requests lxml(etree)
实现步骤
1 页面分析(一般讲数据解析模块 都是静态页面)
1.1 通过观察看网页源代码中是否有我们想要的数据 如果有就分析这个url
如果没有再通过ajax寻找接口 通过分析数据在网页源代码中
1.2 确定目标url
https://movie.douban.com/top250?start=0&filter= 第一页
通过页面分析发现所有我们想要的数据都在一个div[class="info"]里面
具体实现步骤
1 获取整个网页的源码 html
2 将获取的数据源码转成一个element对象(xml)
3 通过element对象实现xpath语法 对数据进行爬取(标题 评分 引言 详情页的url)
4 保存数据 先保存到字典中-->列表中
'''
# 定义一个函数用来获取网页源代码
def getsource(pagelink):
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
# 获取源码
response = requests.get(pagelink, headers=headers)
response.encoding = 'utf-8'
html = response.text
return html
# 定义一个函数用于解析我们的网页源代码并获取我们想要的数据
def geteveryitem(html):
element = etree.HTML(html)
# 拿到[class="info"]的所有div
movieitemlist = element.xpath('//li//div[@class="info"]')
# print(movieitemlist,len(movieitemlist))
# 定义一个列表
itemlist = []
for item in movieitemlist:
# 定义一个字典
itemdict = {}
# 标题
title = item.xpath('./div[@class="hd"]/a/span[@class="title"]/text()')
title = "".join(title).replace("\xa0", "")
# print(title)
# 副标题
othertitle = item.xpath('./div[@class="hd"]/a/span[@class="other"]/text()')[0].replace("\xa0", "")
# print(othertitle)
# 评分
grade = item.xpath('./div[@class="bd"]/div[@class="star"]/span[2]/text()')[0]
# print(grade)
# 详情页的url
link = item.xpath('div[@class="hd"]/a/@href')[0]
# print(link)
# 引言
quote = item.xpath('div[@class="bd"]/p[@class="quote"]/span/text()')
# print(quote)
# list index out of range
# 处理方式1 非空处理
if quote:
quote = quote[0]
else:
quote = ""
# 将数据存放到字典中
itemdict['title'] = ''.join(title + othertitle)
itemdict['grade'] = grade
itemdict['link'] = link
itemdict['quote'] = quote
# print(itemdict)
itemlist.append(itemdict)
# print(itemlist)
return itemlist
if __name__ == '__main__':
url = 'https://movie.douban.com/top250?start=0&filter='
html = getsource(url)
itemlist = geteveryitem(html)
print(itemlist)
运行结果: