Datehoer的博客
我本将心向明月,奈何明月照沟渠
Datehoer的博客

当前位置:主页 > 技术分享 > python报错local variable 'xxx' referenced before assignment怎么办

python报错local variable 'xxx' referenced before assignment怎么办

浏览: 作者:Datehoer 发布日期:2021-01-10 14:58:43 来源: 原创
说到这个报错,local variable 'xxx' referenced before assignment我确实没有遇到过,那么应该怎么办呢?
百度查询一下,不过其实简单看一下的话,应该是一个变量没有被定义就被使用了,那么为什么呢?


报错的出现是因为之前写的那个爬漫画的代码,闲的无聊又爬了点看,没想到就出现local variable 'xxx' referenced before assignment这个报错了。
首先先看一下出现的位置。


def get_pictureinfo(picture_link):
    """ 获取图片的信息 """
    num = 1
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
    }
    while num < 4:
        try:
            picture_info = requests.get(picture_link, headers=headers, proxies=ip_pool(), timeout=5).content
            break
        except requests.exceptions.RequestException:
            num += 1
    return picture_info


def downloads(newlink):
    """ 下载 """
    links = get_links(newlink)
 
    document_name = get_name(newlink)
    # # 获取单个链接
    picturefotmat = judge_picture(links)
    # print(type(picturefotmat))
    a = 1;
    if picturefotmat == "jpg":
        for link in range(len(links)):
            if a%50==0:
                time.sleep(30)
            onelink = links.pop()
            picture_info = get_pictureinfo(onelink)
            pictureid = re.findall(r'.*/([0-9]*).jpg', onelink)
            pictureid = pictureid.pop()
            with open(document_name + '/' + pictureid + '.jpg', 'wb') as mh:
                mh.write(picture_info)
            print("已完成" + pictureid + '.jpg')
            a+=1

是picture_info出现的错误,但是我变量都应该定义出来了啊,这是为什么呢?
后来仔细的看了一下get_pictureinfo这个函数,发现如果我num=4跳出循环的话,应该是没有picture_info这个变量的,那么下面调用的话就会报错了。
明白了问题出现在哪,应该怎么解决呢?



我首先想到的是既然报错,那么我们就判断一下num的值,如果它=4的话,我就给picture_info赋一个值,然后再在下面加上一个判断,如果等于我赋的值,那么跳出循环,继续爬下一个漫画。

    if num == 4:
        picture_info = "error"

 
     if picture_info == 'error':   #如果请求超时则跳出循环
        break

但是发现如果这样的话,可能有点草率了,毕竟我们要给漫画一个机会,所以我就修改了一下上面的代码,如果try失败,除了num要+1外,还需要sleep30s,这样的话,虽然会增加时间成本,但是会减少漫画不能爬的概率。为什么要sleep30s呢?这是因为我们的网站,如果反爬的话,最简单的就是判断你跟网站的请求了,如果短时间内疯狂请求的话,不用问,肯定有问题了,所以我们请求超时之后就暂停30s再请求。
然后呢,我又修改了一下如果还是不行,那么给picture_info赋值的判断。

    if num == 4:
        time.sleep(60)    #如果一直请求超时,等待1分钟后再次请求
        newnum = 1
        while newnum < 4:
            try:
                picture_info = requests.get(picture_link, headers=headers, proxies=ip_pool(), timeout=5).content
                break
            except requests.exceptions.RequestException:
                newnum += 1
                time.sleep(30)
        if newnum == 4:
            picture_info = "error"  # 如果给与新的机会后还是超时,那么返回error

如果还是请求了3次都出现超时,那么我们再给它3次机会,不过在这之前先休息1min,然后重复一下上面的请求,如果newnum还是=4了,那么只能说抱歉了。

之后再修改一下写入文件的记录

 
    with open('downloadinfo.txt', 'a')as info:
        if picture_info == 'error':
            with open('downloadinfo.txt', 'a')as info:
                info.write(totalinfo+'出现错误,大概率是因为请求超时6次进行,程序已进行跳过处理')
        else:
            info.write(totalinfo)

如果报错的话,那么我们记录哪些漫画下载好了不光记录信息了,还要记录是否出现错误,如果出现错误的话就进行记录,如果没有,那么就继续原来的操作了。
哈哈,写文章的时候发现了一个小错误在上面。
我们应该吧第三行的那个with给删掉就好了,因为前面已经有一个了,所以后面的就不需要了。

    with open('downloadinfo.txt', 'a')as info:
        if picture_info == 'error':
            info.write(totalinfo+'出现错误,大概率是因为请求超时6次进行,程序已进行跳过处理')
        else:
            info.write(totalinfo)
这样子就对了。


python报错local variable 'xxx' referenced before assignment怎么办
具体的代码会放在我的GitHub库里,可以去那里得到详细的代码--https://github.com/datehoer/yellow

如果有什么疑问可以在评论区留言,我会在看到的第一时间进行回复的。

版权:本文由Datehoer原创,著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接本文链接:https://zjzdmc.top/jsfx/118.html。

文章推荐

热门标签

返回顶部
下面为相关推荐
说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!