终于到这个时间了

养兵千日,用兵一时

学了这么久python了终于到它用武之地了

/**************************作者高产似母猪*******************************/

本脚本仅作学习交流,不能用于任何侵犯它人权益的行为。侵删!

如果您觉得侵犯您合法权益后,请联系TG:@Core_i0

我会进行删库操作,永不更新。或者您使用过程中遇到某些问题也请联系TG。因为作者经常水TG群,看不见github?

食用方法介绍:

一般开到64线程了,基本可以跑满带宽,下载速度取决于您本地(梯子?)的网速

经测试,网络条件较好的情况下,256张comic images下载速度基本在3s之内。

1、先上运行结果,

2、传入的url介绍:

您应该传入url应为如下举例

https://18comic.org/album/232758/%E7%B4%97%E5%A4%9C%E8%88%87%E6%97%A5%E8%8F%9C-bang-dream-ezr%E5%80%8B%E4%BA%BA%E6%BC%A2%E5%8C%96-ryu-minbs-%E6%B5%81%E6%B0%91-%E7%B4%97%E5%A4%9C%E3%81%95%E3%82%93%E3%81%A8%E6%97%A5%E8%8F%9C%E3%81%A1%E3%82%83%E3%82%93-bang-dream

或者

https://18comic.org/photo/232758/

!仅支持这两种url!

3、可用pyinstaller打包成exe文件(已兼容支持)

pyinstaller --onefile ****.py

2021/02/08更新 ver2.2:

额,最近又闲的没事上“gayhub”上找罪受。

看到有一位叫做jiekai0629的好朋友(lsp)在github上狂发issue。

玩笑归玩笑。很感谢这位朋友提出的“一系列问题”,比如下载无法实现多章同时下载,多进程的高强度io让cpu扛不住等等。让我看到这个脚本的各种不足。

这些问题其实只要是一个人使用的话是看不出来的。因为样本集太少了,比如我就用着很“爽”,没看见过什么错误。让很多人用就不一样了,真的会有各种错误,和解决过程中的各种不知道的玄学问题?

也许这就是开源吸引人的地方吧。

老规矩,言归正传...

提出下载会闪退报错的问题,而且某人通过tg给了我一个出错的下载链接进行测试。我不试不知道,一试吓一跳。在连续下载30话comic时,我的电脑直接死机了!

???

每一话就不超过10张,我的风扇疯狂转动,电脑直接无响应了。这链接有毒!?

最后大约等待了将近一小时之后无果,最后用8s强制关机大法重启了。

这可不行,这会出这种要人命的问题可怎么用啊。

经不断调试最终确定问题所在:

从结论上说就是cpu太垃圾了。开到64进程就抗不住了,比如你用太湖之光下载就不会出现问题。经测试的一个一个的下载是没有问题的,但是一经在同一程序下,下载次数超过13,我的cpu就扛不住了,io过于密集,导致操作系统调度出现了问题,导致死锁。而且开启多进程下载时还会有一点卡顿。多多权衡利弊,决定用多线程代替多进程下载。并且修改下载算法,使下载速度得到提升。

进行测试:

下载速度

由此可见下载速度得到进一步提升!

下面是ver2.2程序源码:

from requests import *
from bs4 import BeautifulSoup
from PIL import Image ##调用image库对有反转的图片进行转换
from io import BytesIO
import os #创建文件夹,保存下载好的图片
import re
import threading #多线程支持库,对于这种io密集操作相对于多进程还是换成多线程比较好
import time
'''
基于BeautifulSoup解析库的py爬虫爬取18comic
'''
public_headers = {
    'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}

ERROR_PAGE_LIST = [] #声明一个全局变量,用来储存因诸如网络等不可抗元素导致的下载失败,从而进行重新下载!(这个变量只是存储单次下载的错误)

def checkImgConvert(url): #判断图片是否做过反爬机制,比较狂野的使用id分析,没有对前端进行分析来判断
    pass

def convertImg(img_url):
        img = Image.open(img_url)
        img_size = img.size
        img_crop_size = int(img_size[1] / 10)
        img_crop_size_last = (img_size[1] / 10) - img_crop_size  # 解决图片height不能被10整除导致拼接后下方黑条
        img_crop_size_last = round(img_crop_size_last, 1)
        if img_crop_size_last > 0:  # 只有无法整除时才将新建图片进行画布纵向减小
            img_crop_size_last_sum = int(img_crop_size_last * 10)
        else:
            img_crop_size_last_sum = 0
        img_width = int(img_size[0])
        img_block_list = [] #定义一个列表用来存切割后图片
        for img_count in range(10):
            img_crop_box = (0, img_crop_size*img_count, img_width, img_crop_size*(img_count+1))
            img_crop_area = img.crop(img_crop_box)
            img_block_list.append(img_crop_area)
        img_new = Image.new('RGB', (img_size[0], img_size[1]-img_crop_size_last_sum))
        count = 0
        for img_block in reversed(img_block_list):
            img_new.paste(img_block, (0, count*img_crop_size))
            count += 1
        # img_new.show() # 调试显示转化后的图片
        img_new.save(img_url)



def get_url_list(url): #得到图片的下载链接
    response = get(url, headers=public_headers)
    html = response.text
    soup = BeautifulSoup(html, 'lxml')
    options_list = soup.find_all('select')[2].find_all('option') # 用来取出存放页数select中的option标签数量来计算页数
    pages = len(options_list) # 设置一个变量表征页数
    comic_page_urls = []     # 设置一个列表用来存储所有的最终url
    comic_page1_id = soup.find(id='album_photo_00001.jpg')['data-original']    # 存放每一页page图片 ## 取出第一页的页数根据页数的命名规则来自己计算出后面的页数的url,减少用库进行查的时间
    comic_page_url_head_temp = '/'.join(comic_page1_id.split('/')[:-1])     # 取出页数url判断之前的服务器路径
    comic_page_id_tail_temp = comic_page1_id.split('/')[-1].split('.')[-1]     # 用split取出判断页数的后半段url地址例如jpg?v=1602070382暂存
    for page in range(1, pages + 1):     # 对url地址后面的判断页数的url进行根据页数递增的规则进行拼接
        if page < 10:
            comic_page_url = comic_page_url_head_temp + '/0000' + str(page) + '.' + comic_page_id_tail_temp
        elif page >= 10 and page < 100:
            comic_page_url = comic_page_url_head_temp + '/000' + str(page) + '.' + comic_page_id_tail_temp
        elif page >= 100 and page < 1000:
            comic_page_url = comic_page_url_head_temp + '/00' + str(page) + '.' + comic_page_id_tail_temp
        elif page >= 1000 and page < 10000:
            comic_page_url = comic_page_url_head_temp + '/0' + str(page) + '.' + comic_page_id_tail_temp
        elif page >= 10000:
            comic_page_url = comic_page_url_head_temp + '/' + str(page) + '.' + comic_page_id_tail_temp
        #print(comic_page_url + '\n')         # 测试每个url是否正正常输出
        comic_page_urls.append(comic_page_url)         # 将每一个url加入到存储的列表中
    # print(comic_page_urls)     # 测试存储url的列表是否正常输出
    return comic_page_urls

def makeDir(url): # 根据传入的url创建以名称为根据的文件夹,返回文件夹路径
    response = get(url, headers=public_headers)
    html = response.text
    soup = BeautifulSoup(html, 'lxml')
    title = soup.title.string
    dir_name = title.split('|')[0]
    path = r'download/' + dir_name
    path = re.sub('[:*?"<>|]', '' ,path) # 去除特殊字符
    # print(path)
    folder = os.path.exists(path)
    if not folder:
        os.makedirs(path)
    return path

def download_image(url_path):# 下载图片,定义一个方法方便开启多线程,返回下载该图片的相对路径
    url = url_path[0]
    path = url_path[1]
    convert_status = url_path[2]
    global ERROR_PAGE_LIST #全局变量
    try:
        comic_page = get(url, headers=public_headers)
        if comic_page.status_code != 200:
            # print('!= 200')
            ERROR_PAGE_LIST.append(url_path)
            pass
    except Exception:
        # print('Download Error')
        ERROR_PAGE_LIST.append(url_path)
        pass
    comic_name = url.split('/')[-1].split('?')[0]
    comic_local_position = path + '/' + comic_name
    image_bytes = BytesIO(comic_page.content)
    if image_bytes.__sizeof__() >= 1: #防止下载的图片为0kb,玄学?!
        image_source = Image.open(image_bytes)
        image_source.save(comic_local_position)
    else:
        # print('content is lost')
        ERROR_PAGE_LIST.append(url_path)
        pass
    if convert_status:
        convertImg(comic_local_position) # 对“无耻”的以修改图片的反爬虫机制进行反制!
    if url_path in ERROR_PAGE_LIST: # 如果下载成功就再下载列表删除它
        ERROR_PAGE_LIST.remove(url_path)

def checkPluralPage(url): #判断是不是有复数章节需要下载,有返回True,无返回False
    response = get(url)
    html = response.text
    soup = BeautifulSoup(html, 'lxml')
    switch_btn_class = soup.find_all(name='a', attrs={'class': 'switch_btn'})
    if switch_btn_class:
        flag = True
    else:
        flag = False
    return flag

# 得到多章节comic所有的url返回一个列表
def getChapterList(url):
    response = get(url)
    html = response.text
    soup = BeautifulSoup(html, 'lxml')
    btn_toolbar_class = soup.find_all(name='ul', attrs={'class': 'btn-toolbar'})
    pattern = re.compile('<a href="/photo/(.*?)">.*?</a>', re.S)
    chapter_find = []
    for a in btn_toolbar_class[0].contents:
        id = re.findall(pattern, str(a))
        if id:
            chapter_find.append(id)
    last_chapter = []
    for chapter in chapter_find:  # findall查找的出的是返回列表,"暂时"这么让它返回列表,便于后续操作
        last_chapter.append(chapter[0])
    return last_chapter

# 调用此方法来判断开启多线程程的个数
def downloadByThread(comic_num, url_path_list):
    thread_list = []  # 用于存放线程的列表
    print('正在开始多线程下载(线程数量:' + str(comic_num) + ')请稍后......')
    start_time = time.time()
    for num in range(comic_num):
        # 根据页数动态创建线程
        thread_one = threading.Thread(target=download_image, name='DownloadPageIs' + str(num), args=(url_path_list[num],))
        thread_list.append(thread_one)
    for thread in thread_list:
        thread.start()  # 开始线程
    for thread in thread_list:
        thread.join()  # 同步线程

def main(id):
    convert_status = False #设置处理反爬机制的问题,False为未对comic进行切割
    id = int(id)
    comic_num = 0 # 根据下载的页数决定线程数量
    if id >= 220971:# 静态检测检测!!!有必要再改成动态
        convert_status = True
    url = 'https://18comic.org/photo/' + str(id)
    re_download_count = 1 #由于网络等种种原因而重新下载次数
    print('解析成功,开始下载',url)
    path = makeDir(url)
    print('成功创建目录', path)
    url_list = get_url_list(url)
    url_path_list = [] # 里面加入path等传入下载方法的信息
    for url_in_list in url_list:
        url_path_list.append((url_in_list, path, convert_status))
    comic_num = len(url_path_list)
    start_time = time.time()  # 开始执行时间
    downloadByThread(comic_num, url_path_list)
    while ERROR_PAGE_LIST:
        print('当前有' + str(len(ERROR_PAGE_LIST)) + '张comic image由于不可抗网络因素下载失败,正在第' + str(
            re_download_count) + '次重新下载...')
        re_download_count += 1
        comic_num = len(ERROR_PAGE_LIST)
        downloadByThread(comic_num, ERROR_PAGE_LIST)
    download_time = float(time.time() - start_time)
    print("所有comic image下载成功,共" + str(len(url_path_list)) + "张,下载用时:%.1fS。enjoy!\n\n" % download_time)

if __name__ == '__main__':
    print('18comic.vip Downloader by emptysuns.\n请不要用于任何非法用途,仅作学习交流\n版本:Version 2.2\n下载链接格式请参照:\nhttps://github.com/emptysuns/18comic-Download\thttps://blog.acglove.cloud/?p=35\n')
    download_count = 1
    while(1):
        url = input('第'+str(download_count)+'次下载,请输入您想要下载comic的下载链接:\n')
        flag = checkPluralPage(url)
        if flag: #有就进行解析,无就直接下载
            id = url.split('/')[4]
            check_all_download = input('Tips:检测到您输入的链接是包括多个章节的,请判断是否将所有章节都下载:\n输入数字1:下载全部章节\t输入数字0:只下载当前章节\n')
            if check_all_download == '1' or check_all_download == '0':
                if check_all_download == '1':
                    chapter_list = getChapterList(url)
                    # print(chapter_list) # 调试输出是否得到所有下载id
                    print('当前共有'+str(len(chapter_list))+'话需下载\n')
                    chapter_count = 1
                    for id in chapter_list:
                        print('正在下载第'+str(chapter_count)+'话,请稍后...')
                        main(id)
                        chapter_count += 1
                    print('共'+str(len(chapter_list))+'话下载完毕!\n')
                    download_count += 1
                else:
                    id = url.split('/')[4]
                    main(id)
                    download_count += 1
            else:
                print("请输入的合法字符")
                download_count += 1
                continue
        else:
            id = url.split('/')[4]
            main(id)
            download_count += 1

/************************以下是老版本*******************************/

2021/01/20更新:

昨天,闲的无聊上了‘GayHub’,看见有人对我的下载脚本提了issue。

???

我写的脚本居然有人看,开心,呵呵呵。

言归正传,查看issue,发现禁漫天堂,居然做了反扒机制。而且,反扒机制非常离谱,居然是将源图直接切片打乱反向顺序排列。前台再用,canvas再进行绘图拼接,我直呼内行...这种方法直接让人无法下载源链接。牛p,真的我这是第一次见这种狂野的反扒机制。但是还是用万能的python解决了。(用了PIL库的Image包,切割拼接,以其人之道,还其人之身)。讲真的,python这个东西真恶心。要是碰见这东西的爬虫,反制有点困难。侵删!

以下是2021/01/20更新源码

准备安装所需包
pip3 install beautifulsoup PIL
from requests import *
from bs4 import BeautifulSoup
from multiprocessing import Pool
from PIL import Image ##调用image库对有反转的图片进行转换
from io import BytesIO
import os #创建文件夹,保存下载好的图片
import re
import multiprocessing
'''
基于BeautifulSoup解析库的py爬虫爬取18comic
'''
public_headers = {
    'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}
def checkImgConvert(url): #判断图片是否做过反爬机制,比较狂野的使用id分析,没有对前端进行分析来判断
    pass

def convertImg(img_url):
        img = Image.open(img_url)
        img_size = img.size
        img_crop_size = int(img_size[1] / 10)
        img_crop_size_last = (img_size[1] / 10) - img_crop_size  # 解决图片height不能被10整除导致拼接后下方黑条
        img_crop_size_last = round(img_crop_size_last, 1)
        if img_crop_size_last > 0:  # 只有无法整除时才将新建图片进行画布纵向减小
            img_crop_size_last_sum = int(img_crop_size_last * 10)
        else:
            img_crop_size_last_sum = 0
        img_width = int(img_size[0])
        img_block_list = [] #定义一个列表用来存切割后图片
        for img_count in range(10):
            img_crop_box = (0, img_crop_size*img_count, img_width, img_crop_size*(img_count+1))
            img_crop_area = img.crop(img_crop_box)
            img_block_list.append(img_crop_area)
        img_new = Image.new('RGB', (img_size[0], img_size[1]-img_crop_size_last_sum))
        count = 0
        for img_block in reversed(img_block_list):
            img_new.paste(img_block, (0, count*img_crop_size))
            count += 1
        # img_new.show() # 调试显示转化后的图片
        img_new.save(img_url)



def get_url_list(url): #得到图片的下载链接
    response = get(url, headers=public_headers)
    html = response.text
    soup = BeautifulSoup(html, 'lxml')
    options_list = soup.find_all('select')[2].find_all('option') # 用来取出存放页数select中的option标签数量来计算页数
    pages = len(options_list) # 设置一个变量表征页数
    comic_page_urls = []     # 设置一个列表用来存储所有的最终url
    comic_page1_id = soup.find(id='album_photo_00001.jpg')['data-original']    # 存放每一页page图片 ## 取出第一页的页数根据页数的命名规则来自己计算出后面的页数的url,减少用库进行查的时间
    comic_page_url_head_temp = '/'.join(comic_page1_id.split('/')[:-1])     # 取出页数url判断之前的服务器路径
    comic_page_id_tail_temp = comic_page1_id.split('/')[-1].split('.')[-1]     # 用split取出判断页数的后半段url地址例如jpg?v=1602070382暂存
    for page in range(1, pages + 1):     # 对url地址后面的判断页数的url进行根据页数递增的规则进行拼接
        if page < 10:
            comic_page_url = comic_page_url_head_temp + '/0000' + str(page) + '.' + comic_page_id_tail_temp
        elif page >= 10 and page < 100:
            comic_page_url = comic_page_url_head_temp + '/000' + str(page) + '.' + comic_page_id_tail_temp
        elif page >= 100 and page < 1000:
            comic_page_url = comic_page_url_head_temp + '/00' + str(page) + '.' + comic_page_id_tail_temp
        elif page >= 1000 and page < 10000:
            comic_page_url = comic_page_url_head_temp + '/0' + str(page) + '.' + comic_page_id_tail_temp
        elif page >= 10000:
            comic_page_url = comic_page_url_head_temp + '/' + str(page) + '.' + comic_page_id_tail_temp
        #print(comic_page_url + '\n')         # 测试每个url是否正正常输出
        comic_page_urls.append(comic_page_url)         # 将每一个url加入到存储的列表中
    # print(comic_page_urls)     # 测试存储url的列表是否正常输出
    return comic_page_urls

def makeDir(url): # 根据传入的url创建以名称为根据的文件夹,返回文件夹路径
    response = get(url, headers=public_headers)
    html = response.text
    soup = BeautifulSoup(html, 'lxml')
    title = soup.title.string
    dir_name = title.split('|')[0]
    path = r'download/' + dir_name
    path = re.sub('[:*?"<>|]', '' ,path) # 去除特殊字符
    # print(path)
    folder = os.path.exists(path)
    if not folder:
        os.makedirs(path)
    return path

def download_image(url_path):# 下载图片,定义一个方法方便开启多线程,返回下载该图片的相对路径
    url = url_path[0]
    path = url_path[1]
    convert_status = url_path[2]
    try:
        comic_page = get(url, headers=public_headers)
        if comic_page.status_code != 200:
            # print('!= 200')
            return url_path
    except Exception:
        # print('Download Error')
        return url_path
    comic_name = url.split('/')[-1].split('?')[0]
    comic_local_position = path + '/' + comic_name
    image_bytes = BytesIO(comic_page.content)
    if image_bytes.__sizeof__() >= 1:
        image_source = Image.open(image_bytes)
        image_source.save(comic_local_position)
    else:
        # print('content is lost')
        return url_path
    if convert_status:
        convertImg(comic_local_position)
    return None # 成功返回None


def main(id):
    convert_status = False
    id = int(id)
    if id >= 220971:
        convert_status = True
    url = 'https://18comic.org/photo/' + str(id)
    print('解析成功,开始下载',url)
    path = makeDir(url)
    print('成功创建目录', path)
    url_list = get_url_list(url)
    url_path_list = [] # 这里创建一个列表作为传入map的值,里面加入path,屏蔽map只支持传入一个参数的问题
    for url_in_list in url_list:
        url_path_list.append((url_in_list, path, convert_status))
    print('正在开始多线程下载(默认64线程)请稍后......')
    pool = Pool(processes = 64) #改变下载进程数
    un_successful_list = pool.map(download_image, url_path_list) # 用于存放未下载成功图片路径
    while None in un_successful_list:
        un_successful_list.remove(None) #清洗None成功的下载
    while un_successful_list:
        re_download_count = 1
        print('当前有'+str(len(un_successful_list))+'张comic image由于不可抗网络因素下载失败,正在第'+str(re_download_count)+'次重新下载...')
        un_successful_list = pool.map(download_image, un_successful_list) #再进行下载
        while None in un_successful_list:
            un_successful_list.remove(None)
        re_download_count += 1
    print("所有comic image下载成功,共" + str(len(url_path_list)) + "张。enjoy!\n\n")

if __name__ == '__main__':
    multiprocessing.freeze_support() #防止pyinstaller()打包过程中出现由于开启多进程打包错误
    print('18comic.vip Downloader by emptysuns.\n请不要用于任何非法用途,仅作学习交流\n版本:Version 2.0\n下载链接格式请参照:\nhttps://github.com/emptysuns/18comic-Download\thttps://blog.acglove.cloud/?p=35\n')
    download_count = 1
    while(1):
        url = input('第'+str(download_count)+'次下载,请输入您想要下载comic的下载链接:\n')
        id = url.split('/')[4]
        main(id)
        download_count += 1

2021/01/20 之前版本(最lj版本,以上是最新版)

最近一直在学python爬虫的相关知识。

爬虫吧,以前也写过一点点,但是写的不够好,最近正在深入学习这一块的内容,正好学到了多线程这部分就把以前的写的代码拿出来了,改了改加上了多进程。但是也并没有优化的多么好,因为把这个脚本当作version 1.0来看。

请食用...

下面是代码部分:

from requests import *
from bs4 import BeautifulSoup
from multiprocessing import Pool
'''
基于BeautifulSoup解析库的py爬虫爬取18comic
'''
def get_url_list(url):
    response = get(url)
    # print(response.text)
    html = response.text
    # 用BeautifulSoup解析
    soup = BeautifulSoup(html, 'lxml')
    # 用来取出存放页数select中的option标签数量来计算页数
    options_list = soup.find_all('select')[2].find_all('option')
    # 设置一个变量表征页数
    pages = len(options_list)
    # 设置一个列表用来存储所有的最终url
    comic_page_urls = []
    # 存放每一页page图片
    # 取出第一页的页数根据页数的命名规则来自己计算出后面的页数的url,减少用库进行查的时间
    comic_page1_id = soup.find(id='album_photo_00001.jpg')['data-original']
    # 取出页数url判断之前的服务器路径
    comic_page_url_head_temp = '/'.join(comic_page1_id.split('/')[:-1])
    # 用split取出判断页数的后半段url地址例如jpg?v=1602070382暂存
    comic_page_id_tail_temp = comic_page1_id.split('/')[-1].split('.')[-1]
    # 对url地址后面的判断页数的url进行根据页数递增的规则进行拼接
    for page in range(1, pages + 1):
        if(page < 10):
            comic_page_url = comic_page_url_head_temp + '/0000' + str(page) + '.' + comic_page_id_tail_temp
        elif (page >= 10 and page < 100):
            comic_page_url = comic_page_url_head_temp + '/000' + str(page) + '.' + comic_page_id_tail_temp
        elif (page >= 100 and page < 1000):
            comic_page_url = comic_page_url_head_temp + '/00' + str(page) + '.' + comic_page_id_tail_temp
        elif (page >= 1000 and page < 10000):
            comic_page_url = comic_page_url_head_temp + '/0' + str(page) + '.' + comic_page_id_tail_temp
        elif (page >= 10000):
            comic_page_url = comic_page_url_head_temp + '/' + str(page) + '.' + comic_page_id_tail_temp
        # 测试每个url是否正正常输出
        #print(comic_page_url + '\n')
        # 将每一个url加入到存储的列表中
        comic_page_urls.append(comic_page_url)

    # 测试存储url的列表是否正常输出
    print(comic_page_urls)
    return comic_page_urls
'''
# 普通下载方式
# for comic_page_url in comic_page_urls:
#     # comic_page = get(comic_page_url)
#     print(comic_page_url,'\n')
#     comic_page = get(comic_page_url)
#     comic_name = comic_page_url.split('/')[-1].split('?')[0]
#     comic_local_position = r'./img download/' + comic_name
#     with open(comic_local_position, 'wb') as comic_img:
#         comic_img.write(comic_page.content)
#         comic_img.close()
#     print(comic_name + " This image DownLoad Successfully\n")
# print("\n*******DownLoad Successfully*******\n")
'''
# 下载图片,定义一个方法方便开启多线程
def download_image(url):
    comic_page = get(url)
    comic_name = url.split('/')[-1].split('?')[0]
    comic_local_position = r'./img download/' + comic_name
    with open(comic_local_position, 'wb') as comic_img:
        comic_img.write(comic_page.content)
        comic_img.close()
def main():
    url = '在这个里面输入您想要下载部分的地址'
    url_list = get_url_list(url)
    pool = Pool(processes = 64)
    pool.map(download_image, url_list)
    print("image DownLoad Successfully\n")
if __name__ == '__main__':
    main()

声明一下

这里的main方法里的url是指的,观看界面的url,其实也可以设置成别的,但是没有去找,毕竟现在我暂时没有这方面的要求。而且很多地方没有修改,没有去加上判断异常的操作什么的,这能看到就只有下载这个东西。

传入的url例如

在使用前你应该创建一个文件夹名为

img download

将它和脚本放在同一个目录

就先这样吧,如果有别的需求我再更新吧。


あなたは影に隠れます、私はあなたを祝福します