多线程爬取壁纸,再也不用担心没有好看的壁纸了

爬取的url:https://www.h128.com/list/game/0/2/1/4/t/1.html
本人选取了自己想要的分类图片,如果要爬取其他的类型壁纸而已自行选择分类,并更改代码中的url即可
在这里插入图片描述
话不多说,直接上代码,关键地方代码中都有注释。

import requests
from lxml import etree
import threading
from queue import Queue  # 先进先出队列(本例使用)


# 创建一个类继承Thread线程类
class Picture_spider(threading.Thread):
    def __init__(self, base_url, page_queue):
        # 若重写了__init__()方法,必须调用父类的__init__()方法初始化线程
        super().__init__()
        self.base_url = base_url
        self.page_queue = page_queue
        self.headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
        }

    def get_html(self, url):
        """
        获取页面
        :param url:
        :return:
        """
        # 模拟请求
        response = requests.get(url=url, headers=self.headers)
        # print(response.text)
        return response.text

    def get_tree(self, html):
        """
        获取xpath对象
        :param html:
        :return:
        """
        tree = etree.HTML(html)
        return tree

    def save_picture(self, picture_link_list):
        """
        保存图片
        :param picture_link_list:
        :return:
        """
        # print(picture_link_list)
        for picture_link in picture_link_list:
            print(picture_link)
            # 从图片链接获取图片名称用以保存
            picture_name = picture_link.split('?')[0].split('/')[-1]
            print(picture_name)
            path = './picture/' + picture_name
            response = requests.get(url=picture_link)
            # 获取二进制响应对象
            picture = response.content
            # 保存
            with open(path, mode='wb') as f:
                f.write(picture)

    def parse(self, tree):
        """
        解析页面
        :param tree:
        :return:
        """
        picture_link_list = tree.xpath('//ul[@id="tiles"]/li/a/img[last()]/@src')
        print(picture_link_list)
        self.save_picture(picture_link_list)

    def run(self):
        """
        主函数
        :return:
        """
        while True:
            # 循环控制条件:当队列为空的时候
            if self.page_queue.empty():
                break
            # 从队列中取出一个任务(页码)
            page_num = self.page_queue.get()
            # 把页码拼到url中
            url = self.base_url.format(page_num)
            # 获取页面的html
            page_html = self.get_html(url)
            # 获取xpath对象
            page_tree = self.get_tree(page_html)
            # 解析页面获取图片链接
            self.parse(page_tree)


if __name__ == '__main__':
    # 确定爬取的url  t后面的参数为页码
    base_url = 'https://www.h128.com/list/game/0/2/1/4/t/{}.html'
    # 创建先进先出队列 保证不会爬取同一页
    page_queue = Queue()
    # 把页码存进队列中 共50页
    for i in range(1, 51):
        page_queue.put(i)
    # 循环创建线程 创建5条线程
    for i in range(5):
        # 实例化线程类
        spider = Picture_spider(base_url, page_queue)
        # 调用线程类的start方法 会执行run函数里面的内容
        spider.start()

如有不足,欢迎交流。
最终爬取的图片如下:
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值