java爬取网页并保存_第九讲:Python爬取网页图片并保存到本地

这篇博客讲述了如何使用Python爬取昵图网首页的图片并保存到本地。通过分析网页代码结构,找到图片链接的正则表达式,利用urllib.urlretrieve下载图片,并介绍了time.sleep用于设置下载间隔,os.makedirs用于创建多级目录,以及字符串切片技巧获取文件名。
摘要由CSDN通过智能技术生成

上一讲我们说了如何把网页的数据通过分析后存储到数据库,我们这次讲如何将网页上的图片提取并下载到本地。

思路如下:

我们本次要爬取的是昵图网首页的图片。

1、首先分析我们要爬取的网页的代码结构,每个网页的代码结构都不大一样,所以要做好分析。

我们进入昵图网的首页,http://www.nipic.com/index.html

按F12开启浏览器的调试模式,可以通过鼠标看到图片的后台代码:点击调试的小箭头,然后点击对应的图片,既可以看到图片在页面上对应的编码。

5de93438a1595427abc6d552731a3647.png

或者,直接“查看源代码”就可以看到整个网页的源码

6be41c75048dad2e80e82584a727ab6c.png

我们可以在源代码界面看到很多.jpg结尾的图片

8624d1e1e60ed31815a0720735867964.png

我们可以直接通过查找来查看到底有多少张图片在页面上,我本次用的是360浏览器,每个浏览器的使用方法大同小异。

查找的快捷方式是Ctrl+F  同时按住两个按键就可以在提示框中输入查找的信息。

或者右击菜单“查找”

8809f2fbbe8b73f8361d665cfedc99ea.png

在关键词框中输入".jpg"

7a22c6d4bc33d67a88fd74b757273371.png

我们可以看到,系统提示是14张图片的链接。

2、编写代码,获取网页的图片,首先我们要这个页面的图片的大体格式是怎样的。

我们看下几个图片链接的代码格式:

9983b0b50e29eb8d75bfdc27c2f05893.png

上面三张图片的格式都是常见的:http://.......jpg,则我们可以把这个做成正则表达式的形式如:http:\S{1,}.jpg

则,我们利用前面两讲的代码,编写如下:

2bdebb6f9b57c0e36b8d816d4222691f.png

3、效果如下:

点击运行后,系统自动在D盘的image文件夹下载对应的图片

eb4e4ff6ea41fa475747bf5c2701b2b8.png

最终下载完后:

0c8c5683370db2ae869d5b2b0eb9abe2.png

最后,其实你网速快的话,程序不设置休眠也可以。

最后,总结下我们本次用到的新知识:

1、函数:urllib.urlretrieve(url[, filename[, reporthook[, data]]])

函数说明

将URL表示的网络对象复制到本地文件。如果URL指向本地文件,则对象将不会被复制,除非提供文件名。返回一个元组()(filename,header),其中filename是可以找到对象的本地文件名,header是urlopen()返回的对象的info()方法(用于远程对象)。

第二个参数(如果存在)指定要复制到的文件位置(如果没有,该位置将是一个生成名称的tempfile)。第三个参数,如果存在,则是一个回调函数,它将在建立网络连接时调用一次,并且在此后每个块读取后调用一次。这个回调函数将传递三个参数;到目前为止传输的块计数,以字节为单位的块大小,以及文件的总大小。第三个参数可能是-1,在旧的FTP服务器上,它不返回文件大小以响应检索请求。

参数说明:

url:外部或者本地url

filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);

reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。

data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。

2、time.sleep(secs)

Python time sleep() 函数推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起的时间。

3、os.makedirs()函数

语法格式:

os.makedirs(name[, mode=0o777][, exist_ok=False])

递归目录创建函数,和mkdir()很像,但是所有中间级目录都要包含叶目录。

递归创建目录,题中应有之意即路径中哪一层不存在,则自动创建。

区别于os.mkdir(path, mode=0o777, *, dir_fd=None),只创建最后一层的目录。

name:所要创建的目录

参数mode表示权限;

如果exist_ok是False(默认),当目标目录(即要创建的目录)已经存在,会抛出一个OSError。

4、b=a.split('/')[-1]

我们不确定图片链接的长度,所以如果从左边开始取下标,则最后一个文件名的下标值是不一样的,不好操作,但是如果写的是-1,则说明要取得是右边第一个。

57d0537671b87c0a484b5e71199d8a3d.png

本节课没有课堂视频,因为新的教室没有带多余的麦克风。

以下是使用Python爬取百度图片保存的示例代码: ```python # 导入依赖库 import requests import re import os # 设置搜索关键字 keyword = "美食" # 设置图片保存路径 save_path = "./images/" # 构造百度图片搜索的URL url = "https://image.baidu.com/search/index?tn=baiduimage&word={}".format(keyword) # 发送HTTP请求并获取响应 response = requests.get(url) # 使用正则表达式从响应内容中提取图片URL列表 img_urls = re.findall('"objURL":"(.*?)",', response.text, re.S) # 遍历图片URL列表并下载保存图片 for i, img_url in enumerate(img_urls): try: # 发送HTTP请求并获取响应 response = requests.get(img_url, timeout=10) # 设置图片保存路径 img_path = os.path.join(save_path, "{}.jpg".format(i)) # 保存图片 with open(img_path, "wb") as f: f.write(response.content) print("成功下载第{:>3d}张图片!".format(i+1)) except Exception as e: print("下载第{:>3d}张图片失败:{}".format(i+1, e)) ``` 解释一下上述代码的主要步骤: 1. 设置搜索关键字和图片保存路径 2. 构造百度图片搜索的URL 3. 发送HTTP请求并获取响应 4. 使用正则表达式从响应内容中提取图片URL列表 5. 遍历图片URL列表并下载保存图片 需要注意的是,这种方式只是简单的使用正则表达式从响应内容中提取图片URL,而没有使用任何API,因此可能存在一些不稳定性和容易被反爬虫机制封禁的风险。建议在使用时注意合理使用代理、设置请求头等防反爬措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值