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

it2025-05-05  9

爬取的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()

如有不足,欢迎交流。 最终爬取的图片如下:

最新回复(0)