Python爬虫 下载彼岸图网高清壁纸

学习了爬虫之后就迫不及待自己写了个爬虫,作用是爬取彼岸图1080p壁纸。因为是刚入门代码可能会比较乱,而且我中途遇到的一些问题都是通过最简单的方式去解决的,所以代码行数也比较多,望见谅。

下载部分如下

from urllib.request import urlretrieve
from bs4 import BeautifulSoup
import os
import requests
from urllib.error import HTTPError
from urllib.error import URLError
url="http://www.netbian.com/"
tempList=[]

#避开URL错误
def get_page_(imageLink,fileName):
    try:
        urlretrieve(imageLink, filename=fileName)
    except URLError as e:
        return None
#解析网页
def openhtml(label,attrs,end,url,sortUrl,urlList,):
    html = url + sortUrl + end
    page = requests.get(html)
    bso = BeautifulSoup(page.content, "html.parser")
    #找到要获取的标签
    for item in bso.findAll(label):
        if attrs in item.attrs:
            urlList.append(item.attrs[attrs])
#获取图片链接,并创建文件夹
def downimage(imageUrl,imageName,filepath):
    try:
        for index in range(0, len(imageUrl)):
            #去掉图片链接中.htm方便自定义链接
            imageUrl[index] = imageUrl[index].replace(".htm", "")
            #获取图片名称
            openhtml("img", "title", f"{imageUrl[index]}.htm", url=url, sortUrl="", urlList=imageName)
            #拼接链接
            image = requests.get(url + imageUrl[index] + "-1920x1080.htm")
            #解析图片链接获取.JPG链接
            page = BeautifulSoup(image.content, "html.parser")
            imageLink=(page.find("td").find("img").get("src"))
            #拼接下载时保存的文件名
            fileName="{}{}{}".format(filepath,imageName[index],".jpg")
            #下载到本地
            get_page_(imageLink=imageLink, fileName=fileName)
            print(imageName[index])
    except:
        print("图片异常,爬取失败")
#主体函数,整体流程在这
def wallpaperDown(sortname,sorturl,page,type):
    #新建保存到本地的文件夹
    filepath = f"E:\\1080p壁纸\\{sortname}\\"
    if not os.path.exists(filepath):
        os.makedirs(filepath)
    urlList=[]
    #打开壁纸分类地址
    openhtml("a","href",".htm",urlList=urlList,url=url,sortUrl=sorturl)
    #筛选出需要网页的连接
    urlList=[list for list in urlList if list is not None and f"{sorturl}" in list ]
    linkLength=len(sorturl)
    #获取网站页数用于循环
    if urlList==[]:
        end=""
    else:
        end = urlList[-2][2+linkLength:-4]
    #循环N页,获取下载链接

    for i in range(page,int(end)+1):
        # 下载第一页,上面的循环只能从第二页开始下载。
        if i>=int(end):
            print("正在下载第1页")
            homeImageUrl = []
            homeImageName = []
            #打开第一页
            openhtml("a", "href", ".htm", url=url, sortUrl=sorturl, urlList=homeImageUrl)
            #筛选出图片链接
            homeImageUrl=[list for list in homeImageUrl if list is not None and "/desk/" in list]
            #下载图片
            downimage(imageUrl=homeImageUrl, imageName=homeImageName, filepath=filepath)

        #判断下载类型,单类别下载则下载完尾页之后结束,多类别则继续下载其他类别
        if i >= int(end):
            if type==0:
                print(f"正在下载第{i}页",i,end)
                print(f"{sortname}壁纸已下载完毕")
                exit()
        else:
            print(f"正在下载第{i}页")
            imageUrl = []
            imageName = []
            # 找到包含下载链接的标签,并获取内容
            openhtml("a", "href", f"_{i}.htm", url=url, sortUrl=sorturl, urlList=imageUrl)
            # 筛选出需要的图片链接
            imageUrl = [list for list in imageUrl if list is not None and "/desk/" in list]
            # 下载图片
            downimage(imageUrl=imageUrl, imageName=imageName, filepath=filepath)

交互如下

import pic_1080p
import sys
#分类名称列表
sortlist=['动漫','游戏','日历', '风景', '美女', '影视', '唯美', '设计', '可爱', '汽车', '花卉',
      '动物', '节日', '人物', '美食', '水果', '建筑', '体育', '军事', '非主流', '其他',
      "王者荣耀","护眼","LOL"]
print(len(sortlist))
#子链接列表,对应分类列表
childlist=['dongman/index','youxi/index','rili/index', 'fengjing/index',
            'meinv/index',  'yingshi/index', 'weimei/index', 'sheji/index',
            'keai/index', 'qiche/index', 'huahui/index',
      'dongwu/index', 'jieri/index', 'renwu/index', 'meishi/index', 'shuiguo/index',
            'jianzhu/index', 'tiyu/index', 'junshi/index', 'feizhuliu/index', 'qita/index',
      "s/wangzherongyao/index","s/huyan/index","s/lol/index"]
#选择具体分类
def get(No,Type):
    childLink = childlist[No]
    pic_1080p.wallpaperDown(sortlist[No], childLink, page,Type)

#输出所有分类
for i in range(0,len(sortlist)):
    print(f"选择《{sortlist[i]}》请输入【{i}】")
    #输入选择的分类和起始页
sort=int(input("请输入数字选择要下载分类,输入【10086】将下载所有:"))
if sort == 10086:
    sort_=int(input("请输入将从那个分类开始依次下载:"))
page=int(input("请输入起始下载页:"))
#判断输入内容
for i in range(0, len(sortlist)):
    for item in sortlist:
        # 下载所有分类图片
        if sort == 10086:
            for j in range(sort_, len(sortlist)):
                folderName = sortlist[j]
                childLink = childlist[j]
                get(j,1)
        # 下载选中的分类
        elif sort >= 0 and sort <= 24:
            get(sort,0)
        else:
            print("请按提示输入!")
            sys.exit()

我测试下载了7G没出现什么问题
在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BlueQoQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值