【Python爬虫】使用request和xpath爬取高清美女图片

  📝个人主页:哈__

期待您的关注 

目录

🎈 urlib.request

 🔥具体的方法

✈ lxml

🔥xpath的基本语法

1. 基本路径

2. 选择节点

3. 谓语(Predicates)

4. 通配符

5. 选择多个路径

6. 函数

7. 运算符

8. 轴(Axes)

🔥🔥🔥爬取美女图片

 1.定期请求头

2.获取页面源码

3.爬取我们需要的图片 

一点点小问题

源码如下


使用Python爬虫需要使用以下两个库。

🎈 urlib.request

urllib.request 是 Python 标准库中的一个模块,它提供了用于打开和读取 URLs(统一资源定位符)的接口。通过使用这个模块,你可以很容易地发送 HTTP 和 HTTPS 请求,并处理响应。以下是对 urllib.request 的简要介绍:


urllib.request 模块允许你执行以下操作:

  1. 发送 HTTP/HTTPS 请求:你可以使用 urllib.request.urlopen() 函数或 urllib.request.Request 类与 URL 交互,发送 GET、POST 等请求。
  2. 处理响应:返回的响应对象(通常是 http.client.HTTPResponse 的一个实例)包含了服务器的响应,如状态码、响应头和响应体。你可以使用响应对象的方法如 read() 来读取响应体内容。
  3. 添加请求头:通过创建 urllib.request.Request 对象,你可以为请求添加自定义的请求头,如 User-Agent、Referer 等。
  4. 处理异常urllib.request 模块定义了各种异常,如 urllib.error.HTTPError 和 urllib.error.URLError,以便你能够优雅地处理请求失败和错误情况。
  5. 数据编码:对于 POST 请求,你可能需要将数据编码为适当的格式(如 application/x-www-form-urlencoded 或 multipart/form-data),urllib.parse 模块提供了相关的函数来辅助完成这些任务。
  6. 处理重定向和会话urllib.request 模块能够自动处理 HTTP 重定向,并且可以通过使用 urllib.request.OpenerDirector 和处理器(如 urllib.request.HTTPCookieProcessor)来管理 HTTP 会话和 cookie。
  7. 使用代理:通过设置环境变量或使用 urllib.request.ProxyHandler,你可以配置 urllib.request 使用代理服务器发送请求。

以下代码是一个示例

import urllib.request  # 定义要请求的 URL  
url = 'http://example.com'  # 发送 GET 请求  
with urllib.request.urlopen(url) as response:  # 读取响应内容  html = response.read()  # 打印响应内容(这里以字符串形式打印,实际可能需要根据需要进行解码)  
print(html.decode('utf-8'))

 🔥具体的方法

 urllib.request.urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *, cafile=None, capath=None, cadefault=False, context=None)
  • 功能:打开指定的 URL,并返回一个响应对象。
  • 参数
    • url:要打开的 URL。
    • data(可选):如果请求需要发送数据(如 POST 请求),则将其指定为字节串。
    • timeout(可选):设置请求的超时时间,以秒为单位。
    • cafilecapathcadefault(可选):用于 SSL 证书的验证。
    • context(可选):SSL 上下文对象,允许你定制 SSL 设置。
  • 返回值:一个响应对象,可以使用 .read().getcode().getheader(name) 等方法获取响应内容、状态码和头部信息。

urllib.request.Request(url, data=None, headers={}, method=None, origin_req_host=None, unverifiable=False)
  • 功能:创建一个请求对象,该对象可以被 urlopen() 或自定义的 opener 使用。
  • 参数
    • url:要请求的 URL。
    • data(可选):POST 请求的数据。
    • headers(可选):一个字典,包含自定义的请求头。
    • method(可选):HTTP 请求方法,如 'GET'、'POST' 等。
    • origin_req_host 和 unverifiable(可选):通常不需要手动设置。
  • 返回值:一个 urllib.request.Request 对象。

urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)
  • url (str): 要下载的文件的 URL。
  • filename (str, optional): 可选参数,指定保存文件的本地路径和文件名。如果未指定,则使用 URL 中最后的路径组件作为文件名,并保存在当前工作目录下。
  • reporthook (callable, optional): 可选参数,一个回调函数,它将在下载过程中被多次调用,并传递三个参数:一个块号(block number)、一个块大小(block size in bytes)、以及文件总大小(total file size in bytes)。这可以用于实现下载进度的报告。
  • data (bytes, optional): 可选参数,如果提供,它应该是一个字节对象,将被发送到服务器作为 POST 请求的数据。这通常用于发送表单数据或上传文件。

urllib.request.install_opener(opener)
  • 功能:全局安装一个 opener。此后,urlopen() 将使用这个 opener 发送请求。
  • 参数:一个实现了 OpenerDirector 接口的对象。

urllib.request.build_opener([handler, ...])
  • 功能:创建一个 opener 对象,该对象使用提供的处理器(handler)列表来处理请求。
  • 参数:一个或多个处理器对象,如 ProxyHandlerHTTPHandlerHTTPSHandler 等。
  • 返回值:一个 opener 对象。

自定义处理器

你可以通过继承 urllib.request.BaseHandler 或其子类(如 HTTPHandlerHTTPSHandler 等)来创建自定义的处理器。这些处理器可以处理请求的不同方面,如代理、cookie、重定向等。

✈ lxml

在Python中,XPath通常与解析HTML或XML文档的库结合使用,例如lxmlBeautifulSoup。这些库提供了对XPath表达式的支持,使得在HTML/XML文档中查找和提取数据变得简单。下面我将以lxml库为例,介绍Python中XPath的使用。

🔥xpath的基本语法

1. 基本路径

  • /: 从根节点开始选择。
  • //: 从文档中的任意位置开始选择。
  • .: 选择当前节点。
  • ..: 选择当前节点的父节点。

2. 选择节点

  • nodename: 选取此节点的所有子节点。
  • @: 选取属性。例如,@lang 会选取名为 lang 的属性。

3. 谓语(Predicates)

谓语用于查找某个特定的节点或者包含某个指定的值的节点。

  • [1]: 选择第一个子节点。
  • [last()]: 选择最后一个子节点。
  • [last()-1]: 选择倒数第二个子节点。
  • [position()]: 选择某个位置上的节点。
  • [text()]: 选择包含文本的节点。
  • [attr=value]: 选择属性值等于某个值的节点。例如,[@lang='en'] 会选择 lang 属性值为 en 的节点。

4. 通配符

  • *: 匹配任何元素节点。
  • @*: 匹配任何属性节点。

5. 选择多个路径

通过在路径表达式中使用 | 运算符,可以选择多个路径。


6. 函数

XPath包含超过一百个内建函数,这些函数可用于字符串值、数值、日期和时间比较、节点和QName处理、序列处理以及逻辑比较等。一些常用的函数有:

  • text(): 获取节点文本。
  • contains(string1, string2): 如果 string1 包含 string2,则返回 true,否则返回 false。
  • starts-with(string1, string2): 如果 string1 以 string2 开头,则返回 true,否则返回 false。
  • last(): 返回当前上下文中节点的最后一个节点的位置。
  • local-name(): 返回当前节点的本地名称。
  • namespace-uri(): 返回当前节点的命名空间URI。
  • name(): 返回当前节点的名称。
  • string(): 将节点或节点集转换为字符串。
  • string-length(): 返回字符串的长度。
  • substring(string, start, length): 返回字符串的子字符串。
  • concat(string1, string2, ...): 连接两个或多个字符串。
  • normalize-space(string): 规范化字符串中的空白字符。

7. 运算符

XPath 支持一系列运算符,如:

  • orand:逻辑运算符。
  • =!=<><=>=:比较运算符。
  • +-*divmod:算术运算符。

8. 轴(Axes)

XPath 轴可以定义相对于当前节点的节点集。以下是一些常用的轴:

  • child: 选取当前节点的所有子节点。
  • parent: 选取当前节点的父节点。
  • ancestor: 选取当前节点的所有先辈(父、祖父等)。
  • ancestor-or-self: 选取当前节点及其所有先辈。
  • descendant: 选取当前节点的所有后代(子、孙等)。
  • descendant-or-self: 选取当前节点及其所有后代。
  • following: 选取文档中当前节点的结束标签之后的所有节点。
  • preceding: 选取文档中当前节点的开始标签之前的所有节点。
  • following-sibling: 选取当前节点之后的所有同辈节点。
  • preceding-sibling: 选取当前节点之前的所有同辈节点。
  • self: 选取当前节点。

下边是一个xpath使用的小教程。

from lxml import html  # 假设我们有一个HTML字符串  
html_string = """  
<html>  
<head>  <title>Example Page</title>  
</head>  
<body>  <div class="content">  <h1>Welcome to the Example Page</h1>  <p class="intro">This is an example paragraph.</p>  <ul>  <li><a href="https://example.com/item1">Item 1</a></li>  <li><a href="https://example.com/item2">Item 2</a></li>  </ul>  </div>  
</body>  
</html>  
"""  # 使用lxml的html模块将HTML字符串解析为HTML文档对象  
tree = html.fromstring(html_string)  # 使用XPath表达式查找标题(title)元素  
title = tree.xpath('//title/text()')[0]  
print(f"Title: {title}")  # 使用XPath表达式查找所有链接(a)元素的href属性  
links = tree.xpath('//a/@href')  
for link in links:  print(f"Link: {link}")  # 使用XPath表达式查找具有特定类的段落(p)元素的内容  
intro_text = tree.xpath('//p[@class="intro"]/text()')[0]  
print(f"Intro text: {intro_text}")

行了不多说了,直接开始我们的主线,爬取美女图片。

🔥🔥🔥爬取美女图片

我要爬取的页面在这里:https://aspx.sc.chinaz.com/query.aspx?keyword=%E7%BE%8E%E5%A5%B3%E5%9B%BE%E7%89%87&issale=&classID=11&navindex=0&page=1

这个链接将会作为我们的url,但并不是固定的,我会把它写成一个动态url,拼接我们要爬取的页码。

 1.定期请求头

我们使用爬虫来访问网页的话可能会因为一些请求头部的信息校验过不去而被阻拦,我们定制一个有请求头的request出来。

先打开我们要爬取的网页,右键点击检查,之后在弹出的功能栏中找到网络模块。

这时候你点进去大概率会什么都没有,我们刷新页面再看。

这时就会有很多的网络请求,我们的目的是爬取图片,那我们就要知道这些图片是哪一个网络请求加载出来的,看图中的红色箭头指向的一个请求,这个就请求就是我们请求的这个美女图片的网页,我们上边给出的网址就是这个。我们从这个请求中拿取我们需要的请求头信息。

这里我只拿了Cookie和User-Agent。下方就是我们的请求头信息。

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0','Cookie': 'cz_statistics_visitor=d8de5b1d-e51b-4986-734a-dee6c9baa136; Hm_lvt_aecc9715b0f5d5f7f34fba48a3c511d6=1715078740; Hm_lpvt_aecc9715b0f5d5f7f34fba48a3c511d6=1715078752; Hm_lvt_398913ed58c9e7dfe9695953fb7b6799=1715078772; _clck=wz5o14%7C2%7Cflk%7C0%7C1588; _clsk=1196i88%7C1715078773199%7C1%7C1%7Cu.clarity.ms%2Fcollect; ASP.NET_SessionId=a5jbwhq5z4sq25coftwlvkg4; Hm_lpvt_398913ed58c9e7dfe9695953fb7b6799=1715078929'
}

请求头的定制代码如下。注意我们的url是动态拼接的,需要根据传过来的页码来爬取第几页。

def create_request(page):url = f'https://aspx.sc.chinaz.com/query.aspx?keyword=%E7%BE%8E%E5%A5%B3%E5%9B%BE%E7%89%87&issale=&classID=11&navindex=0&page={page}'request = urllib.request.Request(url, headers=headers)return request

2.获取页面源码

把我们的请求头传进来,然后调用urllib中的request方法获取返回对象,然后通过第二行代码把网页内容读取出来。

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

3.爬取我们需要的图片 

想要拿到这些图片,我们就要知道这些图片的url到底是什么,我们接着去目标网页看源码,右键->检查->元素。

 分析这个html代码的结构,找到我们图片是被哪个div包着的。


看到class为imgload的div下的结构了吗?这些机构就是我们一个一个的图片,我们想要获取的信息都在这里。一共有两个div,一个叫做im,另一个叫做heis,im当中保存着图片的地址,heis中保存着图片的名称,不信的话你可以把鼠标移动到im中的img标签的src上,看看能不能跳转到这个图片中。我们下载图片,就要使用xpath去把im中的img标签的路径描述出来。


这里其实是有坑的,下方的div中的img根本没有src看到了吗?这里使用了懒加载的方式,你不进行滑动是根本不显示这个src的,所以我们要获取的不是src,而是data-src。


 xpath代码。name_list就是获取所有图片的名称,src_list就是获取所有图片的地址。以图片地址为例。

  1. 我们寻找所有id值为“ulcontent”的div
  2. 然后找到这个div下所有class值为“im”的div
  3. 找class值为“im”的div下的a标签
  4. 然后找到a标签下的img标签
  5. 获取img标签的data-src属性的值。
 name_list = tree.xpath('//div[@id="ulcontent"]//div[@class="heis"]//a/text()')src_list = tree.xpath('//div[@id="ulcontent"]//div[@class="im"]//a/img/@data-src')

有了xpath路径,我们就可以通过以下代码进行下载了。一定要注意斜杠的问题,我们爬下来的路径都是反斜杠,我们替换一下,同时添加一个https协议,就可以调用request库中的方法下载了。

  for i in range(len(name_list)):pic_url = "https:" + src_list[i]pic_url = pic_url.replace('\\',"/")pic_url = "https:" + pic_urlurllib.request.urlretrieve(url=pic_url,filename="./站长素材/"+name_list[i]+".jpg")

一点点小问题

但是你可能会发现,我们爬取的都是缩略图,并不是高清图,我们的页面结构分析的没问题,但就是爬取的图片并不是真正的图片,真正的图片在这个网页中。 

所以我们的代码要变一变,我们先把这个网页爬下来,然后再次通过request请求去访问这个网页,然后分析一下这个网页的结构,拿到这里的图片。

源码如下

import urllib.request
from lxml import etreeheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0','Cookie': 'cz_statistics_visitor=d8de5b1d-e51b-4986-734a-dee6c9baa136; Hm_lvt_aecc9715b0f5d5f7f34fba48a3c511d6=1715078740; Hm_lpvt_aecc9715b0f5d5f7f34fba48a3c511d6=1715078752; Hm_lvt_398913ed58c9e7dfe9695953fb7b6799=1715078772; _clck=wz5o14%7C2%7Cflk%7C0%7C1588; _clsk=1196i88%7C1715078773199%7C1%7C1%7Cu.clarity.ms%2Fcollect; ASP.NET_SessionId=a5jbwhq5z4sq25coftwlvkg4; Hm_lpvt_398913ed58c9e7dfe9695953fb7b6799=1715078929'
}
def create_request(page):url = f'https://aspx.sc.chinaz.com/query.aspx?keyword=%E7%BE%8E%E5%A5%B3%E5%9B%BE%E7%89%87&issale=&classID=11&navindex=0&page={page}'request = urllib.request.Request(url, headers=headers)return requestdef get_content(request):response = urllib.request.urlopen(request)content = response.read().decode('utf-8')return contentdef download(html):tree = etree.HTML(html)name_list = tree.xpath('//div[@id="ulcontent"]//div[@class="heis"]//a/text()')src_list = tree.xpath('//div[@id="ulcontent"]//div[@class="im"]//a/@href')for i in range(len(name_list)):pic_url = "https:" + src_list[i]pic_url = pic_url.replace('\\',"/")# 再次发送请求request = urllib.request.Request(pic_url, headers=headers)response = urllib.request.urlopen(request)# 获得高清图片的页面源码content = response.read().decode('utf-8')tree2 = etree.HTML(content)# 找到高清图片的地址pic = tree2.xpath('//div[@class="container"]//div[@class="img-box"]/img/@src')[0]pic = "https:" + picurllib.request.urlretrieve(url=pic,filename="./站长素材高清/"+name_list[i]+".jpg")if __name__ == '__main__':request = create_request('1')html = get_content(request)download(html)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3020759.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Google Pixel4手机刷机+Root+逆向环境详细教程

Google Pixel4手机刷机Root逆向环境配置详细教程 刷机工具下载 Windows10、Google Pixel4手机当前安卓10系统、adb工具、要刷的谷歌原生的Android11最新刷机包、安装google usb驱动、美版临时twrp-3.6.0_11-0-flame.img和美版永久twrp-installer-3.6.0_11-0-flame.zip、Magis…

Python | Leetcode Python题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; class Solution:def climbStairs(self, n: int) -> int:a, b 1, 1for _ in range(n - 1):a, b b, a breturn b

Etcd集群选举细节

日志级别 在 etcd 集群中&#xff0c;领导者选举是 Raft 协议的一部分&#xff0c;用于在当前领导者失败或无法与集群中的其他节点通信时选出新的领导者。以下是您提供的日志中与领导者选举相关的一些关键条目&#xff0c;以及对它们的详细说明&#xff1a; 节点失去领导者&am…

IP定位技术在解决“薅羊毛”问题中扮演着关键角色

IP定位技术在解决被“薅羊毛”问题中扮演着关键角色。所谓“薅羊毛”&#xff0c;通常指的是在网络平台上&#xff0c;通过不正当手段获取优惠、奖励或利润的行为。这种行为不仅损害了平台的经济利益&#xff0c;也破坏了公平竞争的市场环境。IP定位技术通过提供IP地址的地理位…

2024年最适合做的母婴赛道,选品思路揭秘,教你如何选品!

大家好&#xff0c;我是电商花花。 在我印象中&#xff0c;每年都有人唱衰抖音小店不好做了&#xff0c;太卷了&#xff0c;普通人没有机会了&#xff0c;但是现在直播电商时代&#xff0c;很多信息都会片面的&#xff0c;做不好并不是因为不好做&#xff0c;而是因为你做不好…

本地项目上传到gitee

1. 新建仓库&#xff0c;不要勾选 2. git init git add . git commit -m "test" git remote add origin 【url】 git push --set-upstream origin master

什么样的行业适合做私域?

私域营销适用于各种行业&#xff0c;但以下几个行业尤其适合进行私域营销&#xff1a; 1、零售行业&#xff1a;私域营销可以帮助零售企业建立与顾客的直接联系&#xff0c;提高顾客忠诚度和复购率。通过私域营销&#xff0c;零售企业可以进行个性化推荐、定制化服务&#xff…

为什么创业青年,集体选择抖音小店?是藏在抖音里的财富密码!

哈喽~我是电商月月 为什么创业青年&#xff0c;集体选择抖音小店&#xff1f;因为在这开店不需要自己直播卖货做引流&#xff0c;也不需要自己手里有商品呀 是不是很匪夷所思&#xff0c;别怀疑&#xff0c;给我俩分钟你们绝对不后悔自己的停留&#xff01; 首先就是社会的现…

WEB基础--JDBC基础

JDBC简介 JDBC概述 数据库持久化介绍 jdbc是java做数据库持久化的规范&#xff0c;持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备(断电之后&#xff0c;数据还在&#xff0c;比如硬盘&#xff0c;U盘)中以供之后使用。大多数情况下&#xff0c;特别是企业级…

Jackson 中使用 Optional

介绍 在本文中&#xff0c;我们会对 Optional 类进行一些说明&#xff0c;并且会解释下如果在使用 Optional 类的时候可能在 Jackson 中进行序列化和反序列化的过程中出现的问题。 针对上面的问题&#xff0c;本文会将会介绍在 Jackson 中如何处理 Optional 对象&#xff0c;…

追踪攻击数据包中的真实IP地址:方法与技巧

在网络安全领域&#xff0c;追踪攻击数据包中的真实IP地址是一项至关重要的任务。通过确定攻击者的真实IP地址&#xff0c;可以有效地识别和阻止网络攻击行为&#xff0c;提高网络安全防御水平。IP数据云IP地址查询将介绍几种常用的方法和技巧&#xff0c;帮助安全人员有效追踪…

创建禁止操作区域并且添加水印

css 设置 &#xff1a; 引用换成自己就好 .overlay {z-index: 1000;cursor: none; /*设置为不可点击*/user-select: none; /*设置为不可选择*/contenteditable: false; /*设置为不可编辑*/draggable: false; /*设置为不可拖动*/position: absolute;top: 0;left: 0;width: 100…

gpt_academic的使用——含一键安装和接入其他API以及本地模型

https://github.com/binary-husky/gpt_academic/releases/ https://github.com/binary-husky/gpt_academic/wiki 安装

计算机组成原理(超详解!!) 第七节 中央处理器(上)

1.CPU的功能和组成 CPU的功能&#xff1a; 指令控制&#xff1a;程序的顺序控制。 操作控制&#xff1a;管理并产生每条指令的操作信号&#xff0c;并把它们送到相应部件&#xff0c;控制这些部件按要求进行动作。 时间控制&#xff1a;对各种操作实施…

SpringBoot项目部署到阿里云服务器

部署步骤 步骤分以下&#xff1a; 将SpringBoot项目打包Linux上准备好Java环境、可用的MySql数据库项目上传到服务器启动项目停止项目 1.SpringBoot项目打包 数据库的链接&#xff0c;账户和密码需要和Linux上一致。 如上图打包即可。 2.Linux上准备好Java环境以及Mysql环境…

软件可靠度计算

软件的整体可靠度依据&#xff1a;若是单个就是当前部件的可靠度。若是多个部件&#xff0c;就需要多个部件的可靠度相乘。若是多个部件且有相同备份&#xff0c;那么计算公式更加不一样。 计算公式&#xff1a; 部件数&#xff1a;N 部件可靠度均为&#xff1a;R 单个部件的可…

uniapp + vue3 使用axios

场景 uniapp自带的uni.request不太好用&#xff0c;也有可能是自己用axios用的太熟悉了&#xff0c;所以还是用axios趁手点&#xff0c;所以尝试在uniapp中使用axios。 操作 因为uniapp项目没有package.json&#xff0c;所以先在项目根目录下执行 npm init, 执行完毕后直接…

【京东电商API接口】 | 京东某商品销量数据分析可视化

Python当打之年 当打之年&#xff0c;专注于各领域Python技术&#xff0c;量的积累&#xff0c;质的飞跃。后台回复&#xff1a;【可视化项目源码】可获取可视化系列文章源码和数据 本期将利用Python分析「京东商品数据接口」&#xff0c;希望对大家有所帮助&#xff0c;如有疑…

电商风口的最后一班快车?有些人甚至正在All in视频号!

我是王路飞。 当抖音、快手、淘宝上的商家还在内卷的时候&#xff0c;有些人却转移了阵地&#xff0c;搭上了电商风口的“最后一般列车”&#xff0c;甚至正在All in 视频号。 内容来源于【醒醒团队-电商王路飞】 随着“微视”想要三分天下野心的失败&#xff08;与抖音、快手…

编辑员工信息——后端

需求&#xff1a; 在员工管理列表页面点击编辑按钮&#xff0c;跳转到编辑页面&#xff0c;在编辑页面回显员工信息并进行修改&#xff0c;最后点击保存按钮完成编辑操作。 代码开发流程&#xff1a; 点击编辑按钮&#xff0c;页面跳转到add.html&#xff0c;并在url中携带参…