Python爬虫扫盲篇——如何批量采集网站中的图片数据
Python爬虫扫盲篇——如何批量采集网站中的图片数据
爬虫的热门专栏已经是完结了,但是群里面有朋友在学习后问到如果要用爬虫去下载图片的话应该如何实现?这个呢也算是鄙人的一个失误,仅仅是在最后的scrapy中体现了图片的采集,还是用已经封装好的图片管道来实现的,所以导致了一些从来没有接触过爬虫相关的朋友出现了这样的疑惑,那么今天我们就来为这些存在相同困惑的朋友来扫扫盲。
声明:由于数据的敏感度问题,在本次文章中若出现某些存在版权争议的图片,还请联系本人删除,同时,本文章仅供学习参考使用,严禁用于任何商业用途!
一、看穿万物本质
要爬取图片数据,那么就要知道图片数据本身和往常采集的数据有什么样的区别。首先,图片是什么,究其本质来看的话,图片就是文件的一种表现形式,那么在网络传输过程中,文件的传输与文本的传书是存在着一定的区别的。
文件通常是二进制数据,而文本则是以字符作为基础。文本在传输的时候通过字符编码将字符转换为二进制数据进行传输。
同时要知道的是文件通常情况下比文本更大,因此在文件传输的时候需要更长的时间以及更大的带宽。
以此来看的话如果要去采集图片数据,最关键的点在于什么呢?就在于去找到这个文件的“路径”,只有找到这个正确的文件路径,我们才能够去“打开”这个文件。
所以,在网站中如何去找到图片并将其下载下来保存到我们本地计算机中呢?接下来我们以ZZSC网站为例,来采集一下网站中的图片数据。
二、网站分析
主页:aHR0cHM6Ly9zYy5jaGluYXouY29tL3R1cGlhbi94aWFuZ2N1bnRpYW55dWFuLmh0bWw=

打开开发者工具,首先分析当前页面中看到的结构,从肉眼观察来看的话我们可以看到在当前页面有着各种各样的图片,那么就存在着图片的地址位于当前页面之中的可能,不过具体如何的话肯定是需要我们结合开发者工具分析之后才能够判断下来。
老规矩,打开开发者工具之后直接刷新页面然后定位到DOC,先查看当前页面中是否有关于图片的相关地址信息。

查看这个包去预览一下

从预览结果来看,当前页面中是存在着图片相关的数据的,并且也有着超链接的存在,只不过这个超链接是否是图片所在的地址我们就不得而知了,因为在预览时图片并没有成功加载出来。所以我们需要进一步来到Response中去查看是否在当前的页面中存在着图片的准确路径信息。

经搜索发现,这里面存在着图片相关的数据,但是其图片链接并不是某一张图片的具体地址。眼尖的朋友就发现了,在箭头指向的下方还有一个a标签,该标签中有一个url,但是问题来了,我们在刚刚已经说过,图片本质上来说他就是一个文件,既然是文件的话大家有见过扩展为htm的图片吗?所以直接排除掉这个url是图片地址的可能。然后再看截图中还存在一个data-original属性,该属性也有一个url,那么这个URL会不会就是图片的地址呢?而且这个URL是有一个jpg扩展的,所以十有八九这就是这张图片的地址,我们来验证一下,将这个url复制下来去访问一下。

是不是就有了,那么也就是说图片的地址就是这个data-original属性值!
所以我们只需要访问当前页面,将这个data-original的值从文本中解析出来再去访问就可以成功下载这张图片了。而批量的话则是从文本中拿出所有的data-original即可。接下来我们就来看代码的实现。
三、代码实现
首先,构造主页访问的请求,并实现翻页操作。判断翻页的方式为点击到下一页之后查看下一页的数据包与第一页的数据包存在的不同。

从抓包情况来看的话,不难看出第二页的包和第一页的不同之处就在于其URL的变化上,多了一个_2那么以此猜测一下,第三页是否就是_3呢?

没跑了,那么翻页就是这样的规律了,接下来直接代码构造起来。
主页的访问与翻页实现
import requests
from lxml import etreeurl = 'aHR0cHM6Ly9zYy5jaGluYXouY29tL3R1cGlhbi94aWFuZ2N1bnRpYW55dWFuLmh0bWw='
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
}
page = 1 # 控制翻页def indexDeal(url):"""请求主页"""response = requests.get(url, headers=headers) # 请求text_html = response.content.decode()tree = etree.HTML(text_html)data_original = tree.xpath('/html/body/div[3]/div[2]/div/img/@data-original')img_urls = ['https:' + u for u in data_original] # 由于缺少协议头所以需要将协议头补充上去print(img_urls)return img_urlswhile page < 3: # 翻三页if page == 1:indexDeal(url)page += 1else:url = 'aHR0cHM6Ly9zYy5jaGluYXouY29tL3R1cGlhbi94aWFuZ2N1bnRpYW55dWFuXyVzLmh0bWw=' % pageindexDeal(url)page += 1
图片保存
def saveImages(url, title):response = requests.get(url, headers=headers)img = response.content # 获取图片字节数据with open('imgs/'+title+'.jpg', 'wb')as f:f.write(img)
四、完整代码
import requests
import os
from lxml import etreeif not os.path.exists('imgs'): # 判断当前路径中是否存在imgs文件夹,如果不存在则创建os.mkdir('imgs') # 创建一个名为imgs的文件夹url = 'aHR0cHM6Ly9zYy5jaGluYXouY29tL3R1cGlhbi94aWFuZ2N1bnRpYW55dWFuLmh0bWw='
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
}
page = 1 # 控制翻页def saveImages(url, title):response = requests.get(url, headers=headers)img = response.content # 获取图片字节数据with open('imgs/'+title+'.jpg', 'wb')as f:f.write(img)def indexDeal(url):"""请求主页"""response = requests.get(url, headers=headers) # 请求text_html = response.content.decode()tree = etree.HTML(text_html)data_original = tree.xpath('/html/body/div[3]/div[2]/div/img/@data-original')titles = tree.xpath('/html/body/div[3]/div[2]/div/img/@alt') # 获取图片名img_urls = ['https:' + u for u in data_original] # 由于缺少协议头所以需要将协议头补充上去for img_url, title in zip(img_urls, titles): # 同时遍历两个列表saveImages(img_url, title)while page < 3:if page == 1:indexDeal(url)page += 1else:url = 'aHR0cHM6Ly9zYy5jaGluYXouY29tL3R1cGlhbi94aWFuZ2N1bnRpYW55dWFuXyVzLmh0bWw=' % pageindexDeal(url)page += 1
到这里,本篇文章就结束了,有任何疑惑的地方大家可联系本人讲解。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
