说到这个报错,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 &lt; 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

最后修改:2021 年 04 月 19 日 04 : 47 PM
如果觉得我的文章对你有用,请随意赞赏