全网采集壁纸360网站全网壁纸

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 time

def 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]): #文件夹存在,不操作
            pass
        else:#文件夹不存在,创建文件夹
            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:#判断抓取终止条件,存在那么就停止抓取
                break

if __name__ == "__main__":
    # getImageTypeAndName()
    downloadImage()
    print("  ")

4.最终采集效果:

 

5.说明:

        没有用线程进程一是因为代理问题,二是本身不急,写完代码后直接扔服务器让他自己抓取去了。有需求的可以完善代码,加快抓取速度。异常这块也没有搞(#自信qaq)
 

 

  

                        

 

 

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值