前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >元气壁纸壁纸下载爬虫

元气壁纸壁纸下载爬虫

作者头像
Andromeda
发布2022-10-27 14:36:44
9810
发布2022-10-27 14:36:44
举报
文章被收录于专栏:Andromeda的专栏Andromeda的专栏

网址:元气壁纸 - 电脑壁纸,手机壁纸,桌面壁纸,高级质感壁纸大全 (cheetahfun.com)

这是我的文章封面图片的主要来源地,里面的图片质量还是很高的。该爬虫能实现对其的高速批量下载。

相对于之前写的XKCD漫画获取爬虫 | tsuki の Blog,这次使用了模拟用户代理池,避免同一个UA的高频请求然后被封禁IP

使用面向对象的方法编写爬虫程序,主要编写五个函数,分别是请求函数、菜单函数、图片下载函数、翻页函数、主函数。

github地址:

仓库地址

https://github.com/cSuk1/WallpaperSpider

效果展示

源代码

模拟用户代理池

User-Agent (用户代理)池,就是把多个浏览器的UA信息放进列表中,然后再从中随机选择。构建用户代理池,能够避免总是使用一个 UA 来访问网站,因为短时间内总使用一个UA高频率访问的网站,可能会引起网站的警觉,从而封杀掉IP。

所以需要在项目目录中新建ua_info.py文件。

代码语言:javascript
复制
ua_list = [
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
    'User-Agent:Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
    'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
    'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
    'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0',
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
]

主程序

虽然实现过程和XKCD漫画获取爬虫 | tsuki の Blog基本相同,但是这段代码使用了面向对象的方法,程序的思路更加清晰、易懂,逻辑结构较为固定。

main.py

代码语言:javascript
复制
import requests
import random
import bs4
from ua_info import ua_list
import os


class YuanQi(object):

    # 初始化
    def __init__(self):
        self.url = None
        self.kind = None
        self.page_end = 0
        self.page_begin = 0
        self.page_now = 0

    # 选择下载漫画类型
    def select(self):
        print("请选择需要下载的壁纸类型:\n")
        print("1.动漫\n2.风景\n3.美女\n")
        slt = int(input())
        if slt == 1:
            self.url = 'https://bizhi.cheetahfun.com/dn/c2j/'
            self.kind = '动漫'
            path = 'E:/元气壁纸爬虫/' + self.kind
            self.mk_dir(path)
        elif slt == 2:
            self.url = 'https://bizhi.cheetahfun.com/dn/c1j/'
            self.kind = '风景'
            path = 'E:/元气壁纸爬虫/' + self.kind
            self.mk_dir(path)
        else:
            self.url = 'https://bizhi.cheetahfun.com/dn/c3j/'
            self.kind = '美女'
            path = 'E:/元气壁纸爬虫/' + self.kind
            self.mk_dir(path)
        print('选择成功!!!\n请输入下载的起始页:\n')
        self.page_begin = int(input())
        self.page_end = int(input())
        self.page_now = self.page_begin
        print('正在下载中……\n')

    # 请求函数
    def get_html(self, url):
        headers = {'User-Agent': random.choice(ua_list)}
        req = requests.get(url=url, headers=headers)
        # req = requests.get(url=url)
        html_file = open('index.html', 'wb')
        for chunk in req.iter_content(10000):
            html_file.write(chunk)

        html_file.close()

    def mk_dir(self, path):
        path = path.strip()
        isExists = os.path.exists(path)
        if not isExists:
            os.mkdir(path)
            return True
        else:
            return False

    # 下载图片
    def download_img(self):
        html_file = open('index.html', encoding='utf-8')
        soup = bs4.BeautifulSoup(html_file.read(), 'html.parser')
        elems = soup.select('img[class="w-full h-full object-fill"]')
        # 获取图片的资源地址
        for i in range(0, 18):
            headers = {'User-Agent': random.choice(ua_list)}
            img_url = elems[i].get('src')
            title = elems[i].get('title')
            img_req = requests.get(url=img_url, headers=headers)
            try:
                file_ad = self.kind + '/' + title.replace("?", "") + '.jpg'
                jpg = open(file_ad, 'wb')
                for chunk in img_req.iter_content(10000):
                    jpg.write(chunk)

                jpg.close()
            except:
                file_ad = self.kind + '/第' + str(self.page_begin) + '页第' + str(i) + '张' + '.jpg'
                jpg = open(file_ad, 'wb')
                for chunk in img_req.iter_content(10000):
                    jpg.write(chunk)

                jpg.close()

    # 翻页
    def next_page(self):
        self.page_now += 1
        next_url = self.url + 'p' + str(self.page_now)
        return next_url

    # 主函数
    def run(self):
        self.select()
        link = self.url + 'p' + str(self.page_begin)
        for i in range(self.page_begin, self.page_end + 1):
            self.get_html(link)
            self.download_img()
            link = self.next_page()

        print('下载完成!!!')


if __name__ == '__main__':
    # 捕捉异常错误
    try:
        spider = YuanQi()
        spider.run()
    except Exception as e:
        print("错误:", e)

请求函数get_html()

请求函数最终的结果是下载当前页面的HTML文件,以方便后续的函数调用它来获取图片的资源地址。

菜单函数select()

菜单函数顾名思义就是供用户选择下载壁纸的类型与起始页面。

图片下载函数download_img()

图片下载函数从下载的当前页面的HTML文件中选中包含壁纸资源地址的<img>元素,获取资源地址后将其下载在指定的文件夹。

翻页函数next_page()

翻页函数实现比较简单,该网站的页面URL规律很好找,所以下一页的URL拼接就非常容易了。

主函数run()

主函数充当整个爬虫程序的桥梁,通过调用不同的功能函数,实现数据的最终抓取,是整个程序的入口。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 效果展示
  • 源代码
    • 模拟用户代理池
      • 主程序
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档