【零基础学Python】爬虫篇 :第十六节--Xpath爬虫——万字教你入手Xpath

在这里插入图片描述

📢📢📢📣📣📣
🌻🌻🌻Hello,大家好我叫是Dream呀,一个有趣的Python博主,小白一枚,多多关照😜😜😜
🏅🏅🏅CSDN Python领域新星创作者,大二在读,欢迎大家找我合作学习
💕 入门须知:这片乐园从不缺乏天才,努力才是你的最终入场券!🚀🚀🚀
💓最后,愿我们都能在看不到的地方闪闪发光,一起加油进步🍺🍺🍺
🍉🍉🍉“一万次悲伤,依然会有Dream,我一直在最温暖的地方等你”,唱的就是我!哈哈哈~🌈🌈🌈
🌟🌟🌟✨✨✨

今天是1024嘛,专属于我们程序员的节日,首先祝大家1024节日快乐!

科普一下:1024程序员节是中国程序员的共同节日。1024是2的十次方,二进制计数的基本计量单位之一。程序员(英文Programmer)是从事程序开发、维护的专业人员。程序员就像是一个个1024,以最低调、踏实、核心的功能模块搭建起这个科技世界。1G=1024M,而1G与1级谐音,也有一级棒的意思。

祝大家学习 工作 生活 三点一线都一级棒!

前言:老规矩给我一分钟,万字教你入手Xpath!

一、Xpath的介绍及安装

1.XPath介绍

XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。最初是用来搜寻 XML 文档的,但同样适用于 HTML 文档的搜索。所以在做爬虫时完全可以使用 XPath 做相应的信息抽取。

2.XPath 概览

XPath 的选择功能十分强大,它提供了非常简洁明了的路径选择表达式。另外,它还提供了超过 100 个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有想要定位的节点都可以用 XPath 来选择。
XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航:

  • XPath 使用路径表达式在 XML 文档中进行导航
  • XPath 包含一个标准函数库
  • XPath 是 XSLT 中的主要元素
  • XPath是一个 W3C 标准

3.Xpath的下载

关于xpath的下载,我找了许多的参考资料,基本都是要去下载xpath安装包,然后把文件属性属性crx的格式则将其改成.zip或者.rar,但是我的文件属性缺不知道咋的,咋也改不了,就一直失败,我都要吐了~

在这里插入图片描述
所以我咨询了我的同学,他直接把整个文件包发给了我,然后我就在添加拓展程序包中成功安装了了xpath插件。
我现在也把他的链接分享给大家了:
xpath文件夹
提取码:6666(下载完的同学别忘了在评论区给我同学道一句谢谢呀:谢谢刘同学!

4.在浏览器上安装xpath插件

首先在浏览器的设置中找到这个拓展程序,单击进入:
在这里插入图片描述
然后在拓展程序中的右上角找到开发者模式,将其点开(按钮在右端)
在这里插入图片描述
最后点击加载已解压的拓展程序将下载好的文件夹放进去,重启浏览器,就OK了!

5.xpath的快捷使用方法

快捷唤醒方式:ctrl + shift + x
你会发现出现了小黑框,这说明你的xpath插件已经安装好了:
在这里插入图片描述
那如何关闭呢?
当然还是ctrl + shift + x啦!
恭喜你,你已经完成xpath的安装了!

二、Xpath的基本使用方法

1.xpath解析

  • (1)本地文件 etree.parse()
  • (2)服务器相应的数据 response。read().decode(‘utf-8’)***#
    etree.HTML()

xpath解析本地文件

tree = etree.parse('Xpath基本使用.html')
print(tree)

这是我们的简单的HTML文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
    <ul>
        <li id="l1" class="c1">北京</li>
        <li id="l2">上海</li>
        <li>深圳</li>
        <li>武汉</li>
    </ul>
</body>
</html>

2.路径查询

  1. //:查找所有子孙节点,不考虑层级关系
  2. / :找直接子节点
li_list = tree.xpath('//body/ul/li')

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。下面列出了最常用的路径表达式:
在这里插入图片描述

3.谓词查询

  • //div[@id]
  • //div[@id=“maincontent”]

3.1查找所有的id的属性的li标签

text()获取标签中的内容:

li_list=tree.xpath('//ul/li[@id]/text()')

3.2找到id为l1的标签,必须加引号

li_list = tree.xpath('//ul/li[@id="l1"]/text()')

4.属性查询

  • //@class

4.1查找到id为l1的li标签的class的属性值

li = tree.xpath('//ul/li[@id="l1"]/@class')

5.模糊查询

  • //div[contains(@id, “he”)]
  • //div[starts‐with(@id, “he”)]

5.1查询id的值以l开头的li标签

li_list = tree.xpath('//ul/li[contains(@id,"l")]/text()')

5.2查询id的值以l开头的li标签

li_list = tree.xpath('//ul/li[starts-with(@id,"l")]/text()')

三、Xpath解析百度

运用我们的xpath解析百度页面,获取到“百度一下”四个字:
在这里插入图片描述
由于xpath返回的是一个列表,可以加上一个索引,获取到其中的元素值,这样就得到了想要的数据。

# -*-coding:utf-8 -*-
# @Author:到点了,心疼徐哥哥
# 奥利给干!!!
import urllib.request
url='https://www.baidu.com/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
# 请求对象的定制
request = urllib.request.Request(url = url,headers = headers)

# 模拟浏览器访问服务器
response = urllib.request.urlopen(request)

# 获取网页源码
content = response.read().decode('utf-8')

# 解析页面源码,获取我们需要的数据
from lxml import etree

# 解析服务器相应的文件
tree = etree.HTML(content)

#  获取我们想要的数据 xpath默认返回列表
result = tree.xpath('//input[@id="su"]/@value')
# result = tree.xpath('//input[@id="su"]/@value')[0]

print(result)

四、Xpath破解站长素材网站

打开站长素材网站,解析其中的情侣照片。

1.页面分析

首先在页面中找到其中的一张照片,进行定位:
在这里插入图片描述
逐级获取标签属性:
在这里插入图片描述
然后继续获取照片的网址:
在这里插入图片描述

# -*-coding:utf-8 -*-
# @Author:到点了,心疼徐哥哥
# 奥利给干!!!
# 需求  下载前十页的图片
# 第一页: https://sc.chinaz.com/tupian/qinglvtupian.html
# 第二页:https://sc.chinaz.com/tupian/qinglvtupian_2.html
import urllib.request
from lxml import etree

def create_request(page):
    if (page==1):
        url = 'https://sc.chinaz.com/tupian/qinglvtupian.html'
    else:
        url = 'https://sc.chinaz.com/tupian/qinglvtupian_'+str(page)+'.html'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
    }
    request = urllib.request.Request(url=url,headers = headers)
    return request

def get_content(request):
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    return content

def down_load(content):
    # 下载的是图片,不是页面
    # urllib.request.urlretrieve('图片地址','文件的名字')
    tree = etree.HTML(content)
    name_list = tree.xpath('//div[@id="container"]//a/img/@alt')

    # 一般的设计图片的网页都会进行懒加载
    src_list = tree.xpath('//div[@id="container"]//a/img/@src')
    # for i in range(len(name_list)):
    #
    #     print(name_list[i],src_list[i])
    print(len(name_list),len(src_list)) #第二个值为0

if __name__ == '__main__':
    start_page = int(input('请输入起始页码:'))
    end_page = int(input('请输入结束页码:'))
    for page in range(start_page, end_page+1):
        # (1)请求对象定制
        request=create_request(page)
        # (2)获取网页的源码
        content = get_content(request)
        # (3)下载
        down_load(content)

设计图片的网页懒加载问题

按照这个思路把代码写出来,你会发现len(name_list)的值是40,而len(src_list)的值是0,明明是一一对应的关系,却相差这么大,这是为啥呢?
其实一般的设计图片的网页都会进行懒加载,就是你的这个图片不出现在屏幕中,是不会把网址传给scr的:
在这里插入图片描述
其实没加载出来的图片都是用的scr2存储的照片网址。
即:src_list = tree.xpath('//div[@id="container"]//a/img/@src2')

2.代码构建

# -*-coding:utf-8 -*-
# @Author:到点了,心疼徐哥哥
# 奥利给干!!!
# 需求  下载前十页的图片
# 第一页: https://sc.chinaz.com/tupian/qinglvtupian.html
# 第二页:https://sc.chinaz.com/tupian/qinglvtupian_2.html
import urllib.request
from lxml import etree

def create_request(page):
    if (page==1):
        url = 'https://sc.chinaz.com/tupian/qinglvtupian.html'
    else:
        url = 'https://sc.chinaz.com/tupian/qinglvtupian_'+str(page)+'.html'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
    }
    request = urllib.request.Request(url=url,headers = headers)
    return request

def get_content(request):
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    return content

def down_load(content):
    # 下载的是图片,不是页面
    # urllib.request.urlretrieve('图片地址','文件的名字')
    tree = etree.HTML(content)
    name_list = tree.xpath('//div[@id="container"]//a/img/@alt')

    # 一般的设计图片的网页都会进行懒加载
    src_list = tree.xpath('//div[@id="container"]//a/img/@src2')
    for i in range(len(name_list)):
    #
    #     print(name_list[i],src_list[i])
        name = name_list[i]
        src = src_list[i]
        url = 'https:'+src
        # print(len(name_list),len(src_list)) #第二个值为0
        urllib.request.urlretrieve(url = url,filename =name+'.jpg' )
if __name__ == '__main__':
    start_page = int(input('请输入起始页码:'))
    end_page = int(input('请输入结束页码:'))
    for page in range(start_page, end_page+1):
        # (1)请求对象定制
        request=create_request(page)
        # (2)获取网页的源码
        content = get_content(request)
        # (3)下载
        down_load(content)

得到我们所需要的图片:
在这里插入图片描述
这样的相类似的网站,我们就只需要改改网址,页面节点层次就可以了,是不是非常的nice!

📢📢📢最后的福利

☀️☀️☀️最后一点小福利带给大家:如果想快速上手python的小伙伴们,这个详细整理PPT可以迅速帮助大家打牢python基础,需要的小伙伴们可以下载一下 Python入门基础教程全套+小白速成+学不会来找我! 🍻🍻🍻
还有自制表白神器,需要自取:
Python表白神器,源码+解析+各种完美配置+浪漫新颖 🍻🍻🍻
在这里插入图片描述
🌲🌲🌲 好啦,这就是今天要分享给大家的全部内容了
❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~
在这里插入图片描述
在这里插入图片描述

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是Dream呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值