Python爬虫-15-案例:爬取手机壁纸网址所有图片(三)

前提:

本篇结合多线程threading模块来爬取,可以大大缩短下载时间

 

脚本

# coding:utf-8
import os
import time
import threading
import requests
from lxml import etree

cur_path = os.path.dirname(__file__)
file_path = os.path.join(cur_path, "image")
if not os.path.exists(file_path): os.mkdir(file_path)


class LoadImage():

    def __init__(self, page_num=1, base_url="http://sj.zol.com.cn/bizhi/new_%d.html"):
        """
        :param base_url: 爬取网页的url
        :param page_num: 爬取第几页数
        """
        # 这个网站貌似没有做什么限制,不加headers也是可以的,可以直接请求,以免爬取数据有限制,这里我加上了
        self.s = requests.session()
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
            "Upgrade-Insecure-Requests": "1"
        }

        self.base_url = base_url
        self.page_num = page_num

    def load_page(self):
        url = (self.base_url) % self.page_num  # 我们的请求地址进行拼接
        res = self.s.get(url, headers=self.headers).text  # 获取网页
        html = etree.HTML(res)  # 使用lxml转换为html格式的数据
        index_links = html.xpath("//div/ul[1]/li/a[@class='pic']/@href")  # 获取页面图片库url
        file_titles = html.xpath("//li[@class='photo-list-padding']/a[@class='pic']/@title")  # 获取页面图片库名称
        return index_links, file_titles

    def load_image(self):
        index_link, file_titles = self.load_page()
        url_and_title = zip(index_link, file_titles)  # 将返回的数据一一对应,下标0为图片库url,1为标题
        for u_t in url_and_title:
            save_path = os.path.join(file_path, u_t[1])  # 将标题与文件存放路径image拼接,后期爬取的图片会存放在对应目录下
            if os.path.exists(save_path):  # 判断目录是否存在,存在就创建文件名(1)
                os.mkdir("%s(1)" % save_path)
            else:  # 否则就创建这个目录
                os.mkdir(save_path)

            res_url = "http://sj.zol.com.cn%s" % u_t[0]  # 页面上获取的图片链接仅为路径,这里需要url拼接
            res = self.s.get(res_url, headers=self.headers).text
            html = etree.HTML(res)
            img_url_list = html.xpath("//ul[@id='showImg']/li/a/img/@src")  # 获取src属性的图片下载链接jpg结尾的
            img_url_list.extend(html.xpath("//ul[@id='showImg']/li/a/img/@srcs"))  # 获取srcs属性的图片链接并添加到列表后

            for img_url in img_url_list:  # 循环图片链接列表,依次写入文件中去
                img_url = img_url.replace("120x90", "640x960")
                img_res = self.s.get(img_url, headers=self.headers)
                img_name = img_url.split("/")[-1]  # 图片名称
                with open("%s/%s" % (save_path, img_name), "wb") as f:
                    f.write(img_res.content)
                    print("%s正在下载" % img_name)

def run(page_num):
    lo_img = LoadImage(page_num)
    lo_img.load_image()


if __name__ == '__main__':
    thread_list = []
    for i in range(1,5): # 添加4个线程,这里我爬取4个页面,所以开启4个,每个都同步进行
        t = threading.Thread(target=run,args=(i,))
        thread_list.append(t)

    # 循环线程列表,开启线程
    for t in thread_list:
        t.start()

运行了一下,时间对比,缩短了很多

博主也是小菜鸡,代码写的也很菜,这里就是简单记录下自己的学习过程,在慢慢努力中~~

这里我只是下载了手机最新壁纸的,要下载其他的一样的原理

你可能感兴趣的:(Python爬虫)