爬取的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()
如有不足,欢迎交流。
最终爬取的图片如下: