一:XPath的介绍与使用
1.HTML的基础介绍
在爬取网页时,需要解析网页的HTML代码,提取需要的信息。HTML是网页的标记语言,所有网页的内容都是按照HTML语法进行标记的,因此了解HTML语法可以让爬虫更加准确地识别和解析网页内容,从而提高爬取的效率和准确性。同时,了解HTML语法还可以帮助爬虫更好地识别网页中的关键信息,如标题、链接、图片等,从而方便进行信息提取和分析。
爬虫中常用的HTML语法
标签:HTML中的标签用于将文本和其他元素包含在内,常见的标签有<h1>、<p>、<div>等。
属性:HTML中的属性用于为标签提供额外的信息,如id、class、style等。属性是在标签中使用的键值对,
如:<div id="nav">。
嵌套:HTML标签可以嵌套使用,一个标签内部包含另一个标签,这种层次结构可以帮助组织和展示网页内容。
注释:HTML中可以使用注释来在代码中添加注释文字,注释用<!-- 和 -->包围。
链接:HTML中的链接标签<a>用于创建超链接,可以链接到其他页面或者网站。如:
<a href="http://www.baidu.com">baidu</a>。
图像:HTML中的图片标签<img>可以用于在页面中显示图像,可以用src属性指定图像的路径。如:<img src="image.jpg">。
列表:HTML中的列表标签<ul>、<ol>等可以用于创建有序和无序列表。
表格:HTML中的表格标签<table>可以用于创建表格,需要使用<tr>、<th>、<td>等标签指定表格的行和
列。
HTML常用标签介绍
<html>内容</html> <!-- 定义html文档,中间部分存放html代码 -->
<head>头部</ head> <!-- 定义头部文档,用于标识头部的信息 -->
<body>主体</body> <!-- 定义主体文档,用于存放主体信息 -->
<h1>标题类</h1> <!-- 定义标题,标题大小从H1-H6依次降低 -->
<p>段落类</p> <!-- 定义段落,用于设置文字段落 -->
<div>区域块</div> <!-- 定义区域块,用于标记区域范围 -->
<h2>二级标题</h2> <!-- 定义标题,设置文字为二级标题 -->
<a>超链接</a> <!-- 定义超链接,用于跳转其他链接页面 -->
<img>图片</img> <!-- 定义图片,用于设置图片访问链接 -->
<ol>有序列表</ol> <!-- 定义有序列表,设置带有关联顺序的列表信息 -->
<ul>无序列表</ul> <!-- 定义无序列表,设置无关联顺序的列表信息 -->
<li>列表信息</li> <!-- 定义列表元素,设置单个列表条目信息 -->
2.XPath的使用介绍
XPath基本介绍
XPath (XML Path Language) 是一门在 HTML 和 XML 文档中查找信息的查询语言。在爬虫中 XPath主要用于解析HTML文档,通过XPath表达式来定位元素,抽取所需的数据。
lxml的安装命令
如果想要使用Xpath来提取数据,就需要安装lxml来进行解析。
pip install lxml
XPath的语法规则
表达式 | 描述 |
---|---|
/ | 选择当前节点的子节点 |
// | 选择所有节点 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
text() | 表示匹配元素的文本内容 |
* | 匹配任何元素节点 |
@* | 匹配任何属性节点 |
node() | 匹配任何类型的节点 |
管道符(一个竖线,这里会被转义) | 管道符同时选择多个元素 |
[@attribute=‘value’] | 匹配具有指定属性值的元素 |
XPath表达式的使用
XPath表达式是一种类似于路径的结构,可以使用元素名;属性名;文本内容等来描述标签的属性的位置
下面是一些常见的XPath表达式示例:
- 标签定位://标签名,例如://div表示选择所有的div标签。
- 属性定位://[email protected]='属性值‘,例如://div[@class=‘content’]表示选择class属性值为content的div标签。
- 子节点定位:/标签名,例如:/html/body/div表示选择body标签下的第一个div标签。
- 父节点定位:/…,例如://div[@class=‘content’]/…表示选择class为content的div标签的父节点。
- 文本定位:/text(),例如://div[@class=‘content’]/p/text()表示选择class为content的div标签下的所有p标签的文本内容。
- 通配符定位:*,例如://div/*表示选择所有div标签的子节点。
测试示例:
from lxml import etree
html = """
<html>
<head>
<title>最新电影</title>
</head>
<body>
<div class="content">
<p class="title">大赢家</p>
<p class="info">导演: 刘德华</p>
<p class="score">评分: 8.5</p>
</div>
<div class="content">
<p class="title">唐人街探案3</p>
<p class="info">导演: 陈思诚</p>
<p class="score">评分: 9.1</p>
</div>
</body>
</html>
"""
# 将html文本转换成xpath对象
html_data = etree.HTML(html)
# 使用xpath表达式定位标题和评分
titles = html_data.xpath('//p[@class="title"]/text()')
scores = html_data.xpath('//p[@class="score"]/text()')
for title, score in zip(titles, scores):
print(title, score)
输出:
大赢家 评分:8.5
唐人街探案3 评分:9.1
3.XPathHelper介绍
XPathHelper介绍
XPathHelper是一款浏览器插件,它能够帮助用户快速定位到网页中的元素,并生成XPath表达式。XPathHelper的主要功能包括:
- 自动生成XPath表达式:当用户选中一个元素时,XPathHelper能够自动生成对应的XPath表达式,方便用户直接复制粘贴使用
- 支持XPath表达式实时测试:XPathHelper还能够在实时测试功能中执行XPath表达式,快速验证表达式的正确性
安装插件
chrome浏览器 -> 设置 -> 扩展程序 -> 开发者模式 -> 将 xpath-helper 插件拖入页面中安装 -> 将xpath-helper 固定到工具栏
XPathHelper的使用
借助XPathHelper工具编写XPath表达式来定位图片的路径。
# 以li标签的路径为基准
//li[@class="game-live-item"]/a/img/@data-original
# 以a标签的路径为基准
//a[@class="video-info clickstat"]/img/@data-original
# 以img标签的路径为基准
//img[@class="pic"]/@data-original
# 全局查找data-origina属性
//@data-original
代码实现
import time
import requests
from lxml import etree # 导入lxml中的etree模块
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
url = 'https://www.huya.com/g/2168'
response = requests.get(url, headers=headers)
# 将响应得到的html字符串转换为树形结构
html = etree.HTML(response.text)
# 使用XPath表达式来筛选a标签的数据
element_list = html.xpath('//a[@class="video-info clickstat"]')
# print(element_list)
# 将所有标签的列表遍历成单个标签数据
for element in element_list:
# 从单个标签数据中抽取图片链接
image_url = element.xpath('./img[@class="pic"]/@data-original')[0]
# 使用split通过?作为分隔符,将整个链接分成?前和?后两段数据,再通过索引值取出前面的部分。
image_url = image_url.split('?')[0]
# print(image_url)
# 判断链接前6位是不是https:,如果不是则添加协议头:
if image_url[0:6] != 'https:':
image_url = 'https:' + image_url
# 从单个标签数据中抽取主播名字
image_name = element.xpath('./img[@class="pic"]/@title')[0]
# print(image_name)
# 将图片数据保存到电脑上
response = requests.get(image_url, headers=headers)
with open(f'./images/{image_name}.jpg', 'wb') as file:
file.write(response.content)
print(f'{image_name}下载完毕。。。。')
time.sleep(1)
4.网易云音乐爬虫
借助XPathHelper工具编写XPath表达式来定位音乐标签的路径
# 以a标签的路径为基准,查找a标签中包含有href属性,且href属性中有/song?内容
//a[contains(@href,"/song?")]
代码实现
import os
import time
import requests
from lxml import etree # 数据解析工具包
# 定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Edg/85.0.564.68 '
}
#定义歌曲榜单页面链接(记得去掉/#)
url = 'https://music.163.com/playlist?id=128871831'
response = requests.get(url=url, headers=headers)
# 将html文本数据转换成浏览器中的树形结构
html = etree.HTML(response.text)
# 筛选出网页中每首歌里包含@href属性的a标签
music_label_list = html.xpath('//a[contains(@href,"/song?")]')
# 判断当前路径下是否不存在music文件夹
if not os.path.exists('music'):
# 如果images文件夹不存在就创建music文件夹
os.mkdir('music')
# 循环遍历每首歌的标签
for music_label in music_label_list:
href = music_label.xpath('./@href')[0] # 筛选出音乐id的标签
music_id = href.split('=')[1] # 使用=切割字符串来获取音乐的id
# 判断得到的值是否是音乐ID数字,不是数字的并不是歌单中的数据
if music_id.isdigit():
music_name = music_label.xpath('./text()')[0] # 获取音乐的歌名
# 将网易云音乐的接口与音乐ID进行拼接,并向链接发送网络请求
music_url = 'http://music.163.com/song/media/outer/url?id=' + music_id
music = requests.get(music_url, headers=headers)
# 保存音乐到创建的文件夹中
with open(f'./music/{music_name}.mp3', 'wb') as file: # 创建一个空白的音乐文件
file.write(music.content) # 把从网页中获取的音乐数据写入到空白的音乐文件里
print('《%s》下载成功' % music_name)
time.sleep(1) # 延时降低请求频率