写网络爬虫学python(二)

本文介绍如何使用Python实现网络爬虫的多线程功能,包括使用thread模块的start_new_thread函数和threading模块创建线程类两种方法,旨在提高爬虫效率。

实现了爬虫的基本功能之后,必须要考虑性能上的改善和效率的提升。使用多线程的方法可以大大提高网络爬虫的效率。

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()

利用多线程的方法可以实现高并发的进行网页抓取,这篇笔记中仅仅是示范了两种多线程实现的方法,实际运用到网络爬虫程序中时,还是要考虑到实际参数传递、线程同步等比较严峻的问题。

嗯,就这样,慢慢学了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值