1. 采集网站:
壁纸360
采集内容:
壁纸360全网超高清壁纸
2.采集思路:
网页导航栏一共有16个分类,第一个分类包含了后面所有的,为了将图片按类型存储,所以就只采集了后面15个标签。
那么首先采集下分类标签及其名称(最基本的采集,不用多说啥了,直接一步到位)
接下来就是查找图片链接,查看列表页中每张图片
从上面链接中我们可以看到图片是被缩放成 208x130像素的,那么如何抓到原像素图片?
点击图片到图片详情页,此时发现图片像素高一点了,可以达到800x580
还是不能达到想要的像素?
仔细观察该页面的按钮,还有个点击下载壁纸大图,如下图
点击后检查网络请求,可以看到已经将最高清图片请求过来了
最后根据需要采集不同清晰度的图片接口
最低像素采集列表页链接,格式: http://www.bizhi360.com/allimg/litimg/6730_1.jpg
普通像素采集详情页链接, 格式:http://www.bizhi360.com/allimg/bpic/30/6730.jpg
高清像素采集点击下载壁纸获取到的连接,格式: http://pic.bizhi360.com/bbpic/30/6730.jpg
多次观察,发现路由是有规律的,照着处理就行,已高清为例
在列表页中,我们能抓到 /allimg/litimg/6730_1.jpg
高清图片的链接是: http://pic.bizhi360.com/bbpic/30/6730.jpg
http://pic.bizhi360.com/bbpic/ + 链接中整数(6730后两位) + 链接中整数部分(6730) + ".jpg"
realImgUrl = sourceUrl2 + url1[0][-2:] + "/" +url1[0] + ".jpg"
最后一个的话可能就是翻页问题了,观察一下倒数第二页和最后一页的网页结构
所以采集页数和终止条件如下:
3.整体代码:
采集最高清的图片,本人采集用了代理,我不确定不用代理采集会不会封IP,建议带上IP代理。以下是去除代理厚后的整体代码:
# -*- coding: UTF-8 -*-
'''
@Author :Jason
@Desc :http://www.bizhi360.com/
360壁纸采集
网站壁纸一共15个类
'''
import requests
from lxml import etree
import os
import re
import timedef getImageTypeAndName():'''主要抓取壁纸分类链接 和 壁纸分类名称:返回壁纸分类连接 壁纸分类名称'''url = "http://www.bizhi360.com"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36",}res = requests.get(url=url,headers = headers)res.encoding = "gbk"etreeHtml = etree.HTML(res.text)imageType = etreeHtml.xpath('//div[@id="tagnav"]//div[@class="container"]/a/@href')imageTypeName = etreeHtml.xpath('//div[@id="tagnav"]//div[@class="container"]/a/text()')return imageType[1:],imageTypeName[1:] #去掉/desk/ 和 壁纸图片大全 这一分类,包含所有图片def downloadImage():'''直接采集图片,根据图片分类保存到指定文件夹:return:None'''headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36",}sourceUrl1 = "http://www.bizhi360.com"sourceUrl2 = "http://pic.bizhi360.com/bbpic/"imageType, imageTypeName = getImageTypeAndName()for i,url in enumerate(imageType):if os.path.exists(imageTypeName[i]): #文件夹存在,不操作passelse:#文件夹不存在,创建文件夹os.mkdir(imageTypeName[i])print("创建文件夹")for page in range(1,1000): #先假设每个分类有1000页,后期增加判断条件可提前结束listUrl = sourceUrl1 + url + "list_" + str(page) + ".html"print(listUrl)res = requests.get(listUrl, headers = headers)res.encoding = "gbk"etreeHtml = etree.HTML(res.text)imageUrlList = etreeHtml.xpath('//*[@id="main"]/div/div[1]/ul/li/a/img/@src')for imageUrl in imageUrlList:url1 = re.findall(r'/(\d+).*?\.jpg',imageUrl)realImgUrl = sourceUrl2 + url1[0][-2:] + "/" +url1[0] + ".jpg"print(realImgUrl)resImg = requests.get(url=realImgUrl,headers=headers)with open("./"+imageTypeName[i] +"/"+ url1[0] + ".jpg","wb") as f:f.write(resImg.content)print("壁纸", url1[0] + ".jpg","保存完毕")if "<span>下一页</span>" in res.text:#判断抓取终止条件,存在那么就停止抓取breakif __name__ == "__main__":# getImageTypeAndName()downloadImage()print(" ")
4.最终采集效果:
5.说明:
没有用线程进程一是因为代理问题,二是本身不急,写完代码后直接扔服务器让他自己抓取去了。有需求的可以完善代码,加快抓取速度。异常这块也没有搞(#自信qaq)