实现了爬虫的基本功能之后,必须要考虑性能上的改善和效率的提升。使用多线程的方法可以大大提高网络爬虫的效率。
Python中实现多线程有函数和类两种方式。
使用函数来实现多线程,主要是利用thread模块的start_new_thread()函数来创建进程,代码如下:
import urllib
import thread
def crawler(url, filename):
f = urllib.urlopen(url)
s = f.read()
fp = file(filename,'w')
fp.write(s)
fp.close()
def main():
urls = ["http://www.baidu.com","http://www.sina.com"]
for url in urls:
thread.start_new_thread(crawler, (url, str(url[11:16])+'.htm'))
return
if __name__ == "__main__":
main()
使用类来实现多线程,利用的是threading模块的线程对象,可以重载对象中的run()方法来实现功能,通过__init__()函数来实现传递参数,start()方法相当于调用run()方法来启动线程,代码如下:
import threading
import time
class MyCrawler(threading.Thread):
def __init__(self, url, filename):
threading.Thread.__init__(self)
self.url = url
self.filename = filename
def run(self):
f = urllib.urlopen(self.url)
s = f.read()
fp = file(self.filename,'w')
fp.write(s)
fp.close()
def main():
thread1 = MyCrawler("http://www.baidu.com", "baidu.htm")
thread2 = MyCrawler("http://www.sina.com", "sina.htm")
thread1.start()
thread2.start()
time.sleep(10)
thread1.stop()
thread2.stop()
return
if __name__ == "__main__":
main()
利用多线程的方法可以实现高并发的进行网页抓取,这篇笔记中仅仅是示范了两种多线程实现的方法,实际运用到网络爬虫程序中时,还是要考虑到实际参数传递、线程同步等比较严峻的问题。
嗯,就这样,慢慢学了。