《Python网路爬虫实战》一书上的源代码虽然都是在Linux系统下编写的,但对于Windows系统,大部分代码依然可以很好的运行,但由于系统差异的原因,在少数情况下还是出现不能运行的情况。
在第三章讲到用多线程方式输出的时候,课本的源代码如下:
#!/usr/bin/env python3
#-- coding:utf-8 --
import time
import threading
#多线程
def showName(threadNum,name):
nowtime = time.strftime(’%H:%M:%S’,time.localtime(time.time()))
print(‘i am thread-%d, My name is function-%s, now tiem: %s’ %(threadNum,name,nowtime))
time.sleep(1)
if name == “main”:
print("i am main ...")
names = range(20)
'''
print(names)
name = names.pop()
print(name)
'''
threadNum = 1 #是指 线程执行的批次
threadPool = []
while names:
for i in range(6):
try:
name = names.pop()
except IndexError as e:
print('The list is empty')
break
else:
t = threading.Thread(target=showName,args=(i,name, ))
threadPool.append(t)
t.start()
while threadPool:
t = threadPool.pop()
t.join()
threadNum += 1
print("main is over")
相信很多人在Windows系统下运行会出现bug,如图所示
说明names = range(20)这一句出现问题。
而我们知道,在Python3中整合了range()方法,在这里原本是想定义names为一个有20个元素的列表。返回结果显示names的属性不是一个列表,不能使用pop()方法。我们试着输出names的类型。得到如下结果:
返回的range(0,20)的类型并不是一个列表,修改方式为
names = list(range(20))
让names是一个列表类型。这样处理之后,就能正常运行,得到的names的类型为一个list,结果正常。
**另外一定要注意,不要讲文件名定义为什么threading.py与要导入的库名字重复造成错误。