Python爬虫(6)

一:XPath的介绍与使用

1.HTML的基础介绍

在爬取网页时,需要解析网页的HTML代码,提取需要的信息。HTML是网页的标记语言,所有网页的内容都是按照HTML语法进行标记的,因此了解HTML语法可以让爬虫更加准确地识别和解析网页内容,从而提高爬取的效率和准确性。同时,了解HTML语法还可以帮助爬虫更好地识别网页中的关键信息,如标题、链接、图片等,从而方便进行信息提取和分析。

爬虫中常用的HTML语法

标签:HTML中的标签用于将文本和其他元素包含在内,常见的标签有<h1><p><div>等。

属性:HTML中的属性用于为标签提供额外的信息,如idclass、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表达式示例:

  1. 标签定位://标签名,例如://div表示选择所有的div标签。
  2. 属性定位://[email protected]='属性值‘,例如://div[@class=‘content’]表示选择class属性值为content的div标签。
  3. 子节点定位:/标签名,例如:/html/body/div表示选择body标签下的第一个div标签。
  4. 父节点定位:/…,例如://div[@class=‘content’]/…表示选择class为content的div标签的父节点。
  5. 文本定位:/text(),例如://div[@class=‘content’]/p/text()表示选择class为content的div标签下的所有p标签的文本内容。
  6. 通配符定位:*,例如://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的主要功能包括:

  1. 自动生成XPath表达式:当用户选中一个元素时,XPathHelper能够自动生成对应的XPath表达式,方便用户直接复制粘贴使用
  2. 支持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) # 延时降低请求频率
  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值