引言:Python爬虫的爬取过程中可以利用多线程来提高爬取效率,通过调节线程时间降低爬取失败的风险。
共同编写者:OOFFrankDura
首先介绍两个方法的区别:
1.setDaemon():
设置守护线程:当父线程结束的时候子线程无论是否执行完都要结束!
setDaemon()方法。主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有个要特别注意的:必须在start() 方法调用之前设置,如果不设置为守护线程,
程序会被无限挂起。注意推出和挂起不一样。
示例代码:
import threading
import time
class MyThread(threading.Thread):
def __init__(self, id):
threading.Thread.__init__(self)
def run(self):
time.sleep(5)
print "This is " + self.getName()
if __name__ == "__main__":
t1 = MyThread(999)
t1.setDaemon(True) #这里打印出"I am the father thread."就结束了。子线程连同父线程被一同关闭!
t1.start()
print "I am the father thread."
2. join():
保证此线程执行完之后再去执行下一个线程或者主线程
示例代码:# -*- coding: utf-8 -*-
import threading
import time
class MyThread(threading.Thread):
def __init__(self, id):
threading.Thread.__init__(self)
self.id = id
def run(self):
x = 0
time.sleep(10)
print self.id
if __name__ == "__main__":
t1 = MyThread(999)
t2 = MyThread(11)
t1.start()
t1.join()
t2.start()
t2.join()
# t1.join() #如果没有join() 先打印 12345 再去打印我们所定义的线程t1 id
#如果有join()就在主线程中等待子线程 t1 执行完毕之后在去继续执行主线程
# 方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),
# 那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接
# 着往下执行,那么在调用这个线程时可以使用被调用线程的join方法
然后自定义一个线程,在run()方法中编写爬虫即可
伪代码如下:
# -*- coding: UTF-8 -*- import threading import time class testThread (threading.Thread): #继承父类threading.Thread #构造器 def __init__(self,url): threading.Thread.__init__(self) self.url = url def run(self): time.sleep(5) function(url) #爬虫
if __name__ == "__main__": urlcon = [url1,url2,...] parserThread = [] for i in urlcon: t = testThread(i) parserThread.append(t) for i in parserThread: i.start() i.join()
#把要执行的代码(假设是function()函数执行具体爬虫的功能)写到run函数里面 线程在创建后会直接运行run函数#也就是说 start()方法后运行的是run方法