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

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1282|回复: 5
收起左侧

[求助] pyhton多线程处理的错误?

[复制链接]
double07 发表于 2021-5-17 11:42
本帖最后由 double07 于 2021-5-17 12:12 编辑

使用concurrent.futures遇到两个问题:
1.单线程下载某一链接图片,每张图片名称均能按1/2/3/4/5命名并顺序保存。但多线程后图片名称保存名称错乱2/48/75/35/80,怎样在多线程下,使每个链接中图片命名方式顺序保存?
2.多线程下载的文件不完整,图片有5张,但部分链接只能下4张或更少,代码使用错误?

[Python] 纯文本查看 复制代码
import os,re,time,chardet,threading,requests
from lxml import etree
from concurrent.futures import ThreadPoolExecutor
p = 0
num = 0
pa = 0
n = 0
curPage = 2
data_list = []

def download_picture(u):    #下载图片
    global pa, p, n
    html_detail = gethtml_detail(u)
    html = etree.HTML(html_detail)
    try:
        picsrc_list = re.findall(r'data-ks-lazyload="(//[^\s]*)"', html_detail)
        folder_name = html.xpath('//*[@class="pm-main clearfix"]/h1/text()')[1].strip()
    except Exception as e:
        print(str(e), "无图片")
        folder_name = html.xpath('//*[@class="pm-main clearfix"]/h1/text()')[1].strip()
        os.makedirs('./Pictures and videos/' + folder_name, exist_ok=True)
        pa += 1
        return
    path = 'C:/Users/Administrator/Desktop/Python/AL-SF/Pictures and videos/'
    if os.path.exists(path + folder_name + '/' + str(n) + '.jpg') != True:
        time_start = time.time()
        os.makedirs('./Pictures and videos/' + folder_name,exist_ok=True)  # makedirs()里两个参数:第一个是所要创建的文件夹名称,第二个是当文件夹已经存在时不采取其他操作
        n = 0
        for picsrc in picsrc_list:
            n = n + 1
            pic_src = 'https:' + picsrc
            picsrc_resp = requests.get(pic_src)
            with open(os.path.join('./Pictures and videos/' + folder_name, str(n) + '.jpg'),'wb') as f:  # os.path.join()第一个参数是文件夹名称,第二个是要保存文件的名称,记得加上格式后缀。图片,视频,影音基本都是’wb’
                f.write(picsrc_resp.content)
                f.close()
                time.sleep(1)
        time_end = time.time()
        print('第%s页第%s条房产图片已保存!====用时%.1f秒' % (p, pa + 1,(time_end - time_start)))
        pa += 1

    else:
        print('图片重复', '第%s页第%s条房产图片已保存!' % (p, pa + 1))
        pa += 1
    return

def download_video(u):    #下载视频
     省略……



def run_AL():
    global p
    for i in url_list:
        html = gethtml(i)
        llist = parse_url(html) #获取第一页详情页链接
        with ThreadPoolExecutor(40) as t:
            for u in llist:
                t.submit(download_picture,u)

if __name__ == '__main__':
    run_AL()

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

keate23 发表于 2021-5-17 13:36
你是下载时已经命名,而不是完成后命名。
kof21411 发表于 2021-5-17 13:45
1,python多进程默认不能共享全局变量
2,我看你要集采的url图片应该是采用了懒加载模式,所以你从源码里是有可能采不到五张图片的

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
double07 + 1 + 1 我很赞同!

查看全部评分

 楼主| double07 发表于 2021-5-17 14:16
kof21411 发表于 2021-5-17 13:45
1,python多进程默认不能共享全局变量
2,我看你要集采的url图片应该是采用了懒加载模式,所以你从源码里 ...

第一个问题卡了几天,大佬一句话搞。对于第二个下载不全的问题,有解决方案?大佬
Cool_Breeze 发表于 2021-5-17 14:19
线程之间共享资源需要线程锁来保护资源(n = n + 1, pa += 1)
缘来画中人 发表于 2021-5-17 15:35
哎 python的设计缺陷,烦死了。
您需要登录后才可以回帖 登录 | 注册[Register]

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

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

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

GMT+8, 2024-5-17 04:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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