吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1908|回复: 8
收起左侧

[已解决] pool.map()问题

 关闭 [复制链接]
Zeaf 发表于 2020-7-10 23:48
本帖最后由 Zeaf 于 2020-7-11 11:29 编辑

解决方法:
1.进程相关代码前加入
[Python] 纯文本查看 复制代码
if __name__ == '__main__':

2.去掉input

已有列表downloadpool,里面是下载链接
已有下载函数download

想用pool.map来多进程下载
[Python] 纯文本查看 复制代码
pool = Pool(processes=3) # 设置进程数
pool.map(download, downloadpool) # 运用map函数开启多进程

这样却不报错,也无法进行下载,就是卡住不动,单独用列表中的每一个参数调用下载函数是可以成功下载图片的,不知道如何解决

求大佬们指点一二
以下三种方法我只成功了第三种多线程的...
[Python] 纯文本查看 复制代码
'''        
pool = Pool(processes=3)
for x in downloadpool:
    pool.apply_async(download, downloadpool)
'''
'''
pool = Pool(processes=3) # 设置进程数
pool.map(download, downloadpool) # 运用map函数开启多进程
input('<按任意键退出>')
'''
'''
for x in downloadpool:
    threading.Thread(target=download, args=(x,)).start() # 启动多线程
'''

完整代码
[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
"""
Created on Fri Jul 10 14:22:03 2020

@author: Zeaf
"""

import requests  # 导入requests库
import re  # 导入正则表达式库
import os # 保存文件
#from multiprocessing import Pool #导入pool库
#import threading    #导入多线程库

os.system('title pixiv画师爬取@Zeaf')#设置窗口标题
if not os.path.exists('pixivimg'):  # 判断文件夹是否存在,如果不存在:
    os.mkdir('pixivimg')  # 创建一个文件夹
print('原网站:https://pixivic.com/')
print('因本人只看插画,所以为名字与插画对应,实际上获得的图片少于原页面上应有的图片。')

VNK = '7d3dc86d' # 默认的VNK
tag = input('请输入你想爬取的关键词,可加入热度(如女子5000users入り):') # 获取关键词
pages = int(input('你想爬取的页数,每页大概30张图片:')) # 因为异步加载,所以实际上是多页
    
downloadpool=[]#创建空列表便于存储参数
for page in [x for x in range(1,pages+1)]:#遍历每一页
    user = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36',
    } # 这里的ua随便写写就好,无限制
    url='https://api.pixivic.com/illustrations?illustType=illust&searchType=original&maxSanityLevel=4&page='+str(page)+'&keyword='+tag+'&pageSize=30' # 异步加载接口,返回json数组
    response = requests.get(url,headers=user) # 模拟访问
    response.encoding = response.apparent_encoding # 防止乱码
    html = response.text  # 用文本显示访问网页得到的内容
    if len(re.findall('{"message":"搜索结果获取成功"(.*?)}',html)[0]):#判断该页是否存在数据,如果存在            
        urls = re.findall('"original":"https://i.pximg.net/img-original/img/(..../../../../../../[0-9]*?_p0.*?g)"', html)  # 用正则表达式获得本页各网址
        names = re.findall('"artistId":.*?,"title":"(.*?)","type"', html) # 获取图片名字
        ids = re.findall('"original":"https://i.pximg.net/img-original/img/..../../../../../../([0-9]*?)_p0.*?g"', html) # 获取图片id,为后面referer做准备
        if not os.path.exists('pixivimg'+'/'+tag):  # 判断文件夹是否存在,如果不存在:
            os.mkdir('pixivimg'+'/'+tag)  # 创建一个文件夹   
        for name,url,id in zip(names,urls,ids): # 按顺序遍历每一个画作名称、下载链接和id
            url = 'https://original.img.cheerfun.dev/img-original/img/'+url # 真实的原图地址,抓包获得,无法直接访问
            try:
                # 防止创建文件时因名字问题失败
                name = name.replace('\\','_') 
                name = name.replace('/','_') 
                name = name.replace('?','过滤')
            except:
                name = name
            downloadpool.append((name,id,url))
    else: # 不存在数据时的输出
        print('所选页数超出实际范围!')

def download(name_url_id): # 定义一个下载函数
    name=name_url_id[0] # 提取元组的信息
    id=name_url_id[1]
    url=name_url_id[2]
    user = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362',
    'Referer': 'https://pixivic.com/illusts/'+id+'?VNK='+VNK, # 缺少此将返回403
    'Accept': 'image/png, image/svg+xml, image/*; q=0.8, */*; q=0.5',
    'Host': 'original.img.cheerfun.dev',
    'Cache-Control': 'max-age=0',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'Keep-Alive',
    'Accept-Language': 'zh-CN'
}   
    response = requests.get(url,headers=user)#模拟访问
    if response.status_code == 200: # 200即为成功
        if not os.path.exists('pixivimg'+ '/' +tag+ '/' +name+'.jpg'): # 判断该图片是否存在,如果不存在
            print('正在下载图片:'+name)
            with open('pixivimg'+ '/' +tag+ '/' +name+'.jpg', 'wb') as f: # 保存图片
                f.write(response.content) 
        else:
            print(name+'.jpg已存在,跳过。')
    else:
        print('错误代码'+str(response.status_code)+'下载图片'+name+'失败!')
'''        
pool = Pool(processes=3)
for x in downloadpool:
    pool.apply_async(download, downloadpool)
'''
'''
pool = Pool(processes=3) # 设置进程数
pool.map(download, downloadpool) # 运用map函数开启多进程
input('<按任意键退出>')
'''
'''
for x in downloadpool:
    threading.Thread(target=download, args=(x,)).start() # 启动多线程
'''

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wanghewen 发表于 2020-7-11 06:19
你把它写到py文件里然后加上在合适的位置加上def main() 和
if __name__ == '__main__:
    main()
试试

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Zeaf + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| Zeaf 发表于 2020-7-11 11:43
修改后的代码
[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
"""
Created on Fri Jul 10 14:22:03 2020

@author: Zeaf
"""

import requests  # 导入requests库
import re  # 导入正则表达式库
import os # 保存文件
from multiprocessing import Pool #导入pool库(第一、二种方法)
#import threading    #导入多线程库(第三种方法)

os.system('title pixiv画师爬取@Zeaf') # 设置窗口标题
if not os.path.exists('pixivimg'):  # 判断文件夹是否存在,如果不存在:
    os.mkdir('pixivimg')  # 创建一个文件夹
print('原网站:[url]https://pixivic.com/'[/url])
print('因本人只看插画,所以为名字与插画对应,实际上获得的图片少于原页面上应有的图片。')

VNK = '7d3dc86d' # 默认的VNK
#tag = input('请输入你想爬取的关键词,可加入热度(如女子5000users入り):') # 获取关键词
#pages = int(input('你想爬取的页数,每页大概30张图片:')) # 因为异步加载,所以实际上是多页
tag='女子5000users入り'
pages = 1
  
downloadpool=[]#创建空列表便于存储参数
for page in [x for x in range(1,pages+1)]: # 遍历每一页
    user = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36',
    } # 这里的ua随便写写就好,无限制
    url='https://api.pixivic.com/illustrations?illustType=illust&searchType=original&maxSanityLevel=4&page='+str(page)+'&keyword='+tag+'&pageSize=30' # 异步加载接口,返回json数组
    response = requests.get(url,headers=user) # 模拟访问
    response.encoding = response.apparent_encoding # 防止乱码
    html = response.text  # 用文本显示访问网页得到的内容
    if len(re.findall('{"message":"搜索结果获取成功"(.*?)}',html)[0]):#判断该页是否存在数据,如果存在            
        urls = re.findall('"original":"https://i.pximg.net/img-original/img/(..../../../../../../[0-9]*?_p0.*?g)"', html)  # 用正则表达式获得本页各网址
        names = re.findall('"artistId":.*?,"title":"(.*?)","type"', html) # 获取图片名字
        ids = re.findall('"original":"https://i.pximg.net/img-original/img/..../../../../../../([0-9]*?)_p0.*?g"', html) # 获取图片id,为后面referer做准备
        if not os.path.exists('pixivimg'+'/'+tag):  # 判断文件夹是否存在,如果不存在:
            os.mkdir('pixivimg'+'/'+tag)  # 创建一个文件夹   
        for name,url,id in zip(names,urls,ids): # 按顺序遍历每一个画作名称、下载链接和id
            url = 'https://original.img.cheerfun.dev/img-original/img/'+url # 真实的原图地址,抓包获得,无法直接访问
            try:
                # 防止创建文件时因名字问题失败
                name = name.replace('\\','_') 
                name = name.replace('/','_') 
                name = name.replace('?','')
            except:
                name = name
            downloadpool.append((name,id,url))
    else: # 不存在数据时的输出
        print('所选页数超出实际范围!')

def download(name_url_id): # 定义一个下载函数
    name=name_url_id[0] # 提取元组的信息
    id=name_url_id[1]
    url=name_url_id[2]
    user = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362',
    'Referer': 'https://pixivic.com/illusts/'+id+'?VNK='+VNK, # 缺少此将返回403
    'Accept': 'image/png, image/svg+xml, image/*; q=0.8, */*; q=0.5',
    'Host': 'original.img.cheerfun.dev',
    'Cache-Control': 'max-age=0',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'Keep-Alive',
    'Accept-Language': 'zh-CN'
}   
    response = requests.get(url,headers=user)#模拟访问
    if response.status_code == 200: # 200即为成功
        if not os.path.exists('pixivimg'+ '/' +tag+ '/' +name+'.jpg'): # 判断该图片是否存在,如果不存在
            print('正在下载图片:'+name)
            with open('pixivimg'+ '/' +tag+ '/' +name+'.jpg', 'wb') as f: # 保存图片
                f.write(response.content) 
        else:
            print(name+'.jpg已存在,跳过。')
    else:
        print('错误代码'+str(response.status_code)+'下载图片'+name+'失败!')

#以上执行结果为:获得一个下载函数download,一个有着下载链接的列表downloadpool
''' 
#第一种方法       
pool = Pool(processes=3)
for x in downloadpool:
    pool.apply_async(download, downloadpool)
'''

#不能加input
if __name__ == '__main__':
    #第二种方法
    pool = Pool(processes=3) # 设置进程数
    pool.map(download, downloadpool) # 运用map函数开启多进程
    input('<按任意键退出>')

'''
#第三种方法
for x in downloadpool:
    threading.Thread(target=download, args=(x,)).start() # 启动多线程
'''
kof21411 发表于 2020-7-11 06:47
兄弟,你就发两行代码,你要别人怎么指导啊?
 楼主| Zeaf 发表于 2020-7-11 09:14
wanghewen 发表于 2020-7-11 06:19
你把它写到py文件里然后加上在合适的位置加上def main() 和
if __name__ == '__main__:
    main()

我有点想知道为什么一定要这样啊,这样起初不是为了写其他时方便调用这次写的么
 楼主| Zeaf 发表于 2020-7-11 09:15
本帖最后由 Zeaf 于 2020-7-11 09:26 编辑
kof21411 发表于 2020-7-11 06:47
兄弟,你就发两行代码,你要别人怎么指导啊?

我觉得够了啊。。其它的没什么说的,该给的已知条件都给了,我前面都是对的,我多线程是已经弄好的,现在就是这个多进程不会
 楼主| Zeaf 发表于 2020-7-11 09:25
wanghewen 发表于 2020-7-11 06:19
你把它写到py文件里然后加上在合适的位置加上def main() 和
if __name__ == '__main__:
    main()

试过了,没用
 楼主| Zeaf 发表于 2020-7-11 10:59
wanghewen 发表于 2020-7-11 06:19
你把它写到py文件里然后加上在合适的位置加上def main() 和
if __name__ == '__main__:
    main()

不得不说,你这个建议很关键,但我还是没有解决
 楼主| Zeaf 发表于 2020-7-11 11:51
wanghewen 发表于 2020-7-11 06:19
你把它写到py文件里然后加上在合适的位置加上def main() 和
if __name__ == '__main__:
    main()

解决以后我发现你说的好有道理。。
分开文件写就能解决
大佬大佬
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-20 07:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表