爬取斗图网图片

import os

import requests
import re
from urllib import request
import queue
from threading import Thread

# 创建一个先进先出的队列
url_queue = queue.Queue()

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}



def get_img():

    # 不断去监听 url_queue 队列里面有没有值,如果有值就拿出来进行获取
    # 如果 url_queue 为空,那么就不再执行下面的代码
    while True:

        # 为空,不再执行代码
        if url_queue.empty():
            return


        # 不为空,就获取 url
        data = url_queue.get()

        req = requests.get(data[0], headers=headers)

        con = req.text


        # 非贪懒的 ?一定要加在 量词的后面
        # * + ? {n} {n,m} {n,}

        # 1,用正则匹配到 左边所有的图片区域
        img_area = re.search(r'<div class="page-content text-center">(.+?)<div class="text-center">', con, re.DOTALL)

        # 2,在 图片区域中 找到所有的 图片链接
        srcs = re.findall(r'<img.+?data-original="(.+?)".+?>', img_area.group(1), re.S)
        alts = re.findall(r'<img.+?alt="(.+?)".+?>', img_area.group(1), re.S)

        # 把每一页的图片 保存 以页码为值的 目录中
        # 判读目录是否存在,如果不存在就创建目录
        base_dir = os.path.dirname(os.path.abspath(__file__))
        dir_path = os.path.join(base_dir, str(data[1]))
        if not os.path.exists(dir_path):
            os.mkdir(dir_path)

        for src, alt in zip(srcs, alts):
            try:
                filename = alt + os.path.splitext(src)[1]
                file_path = os.path.join(dir_path, filename)
                request.urlretrieve(src, file_path)
            except:
                pass



if __name__ == '__main__':

    # 1,初始化把 6个页面地址 加入到 队列中
    for i in range(1, 7):
        url_queue.put([f'https://www.doutula.com/photo/list/?page={i}', i])

    # 2,创建3个线程,每个线程去队列中拿地址,知道队列为空
    t_list = []
    for i in range(0,3):
        t = Thread(target=get_img)
        t.start()
        t_list.append(t)

    for i in t_list:
        i.join()

优化:将获取网络资源和下载图片分开进行

import os

import requests
import re
from urllib import request
import queue
from threading import Thread

# 创建一个先进先出的队列
url_queue = queue.Queue()

# 创建一个保存图片信息的队列
img_queue = queue.Queue()

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}



def get_img():

    # 不断去监听 url_queue 队列里面有没有值,如果有值就拿出来进行获取
    # 如果 url_queue 为空,那么就不再执行下面的代码
    while True:

        # 为空,不再执行代码
        if url_queue.empty():
            return


        # 不为空,就获取 url
        data = url_queue.get()

        req = requests.get(data[0], headers=headers)

        con = req.text


        # 非贪懒的 ?一定要加在 量词的后面
        # * + ? {n} {n,m} {n,}

        # 1,用正则匹配到 左边所有的图片区域
        img_area = re.search(r'<div class="page-content text-center">(.+?)<div class="text-center">', con, re.DOTALL)

        # 2,在 图片区域中 找到所有的 图片链接
        srcs = re.findall(r'<img.+?data-original="(.+?)".+?>', img_area.group(1), re.S)
        alts = re.findall(r'<img.+?alt="(.+?)".+?>', img_area.group(1), re.S)

        # 把每一页的图片 保存 以页码为值的 目录中
        # 判读目录是否存在,如果不存在就创建目录
        base_dir = os.path.dirname(os.path.abspath(__file__))
        dir_path = os.path.join(base_dir, str(data[1]))
        if not os.path.exists(dir_path):
            os.mkdir(dir_path)

        # 把获取到的图片信息保存在 图片队列中
        for src, alt in zip(srcs, alts):
            img_queue.put([src, alt, dir_path])





# 创建下载图片的函数
def download_img():

    # 不断的监听 图片队列中有没有数据,如果有数据,就取出来下载
    # 如果没有数据,那就不执行代码
    while True:

        if url_queue.empty() and img_queue.empty():
            return

        data = img_queue.get()

        try:
            filename = data[1] + os.path.splitext(data[0])[1]
            file_path = os.path.join(data[2], filename)
            request.urlretrieve(data[0], file_path)
        except:
            pass




if __name__ == '__main__':

    # 1,初始化把 6个页面地址 加入到 队列中
    for i in range(1, 7):
        url_queue.put([f'https://www.doutula.com/photo/list/?page={i}', i])

    # 2,创建3个线程,每个线程去队列中拿地址,知道队列为空
    t_list = []
    for i in range(0,1):
        t = Thread(target=get_img)
        t.start()
        t_list.append(t)

    for i in range(0,1):
        t = Thread(target=download_img)
        t.start()
        t_list.append(t)


    for i in t_list:
        i.join()

    print('main')