在上一节我们回顾了python 多线程的知识。

queue这个线程安全的序列正是python用来实现线程池的关键。我们可以把爬虫需要解析的URL放入这个序列中,供其它空闲的线程获取并使用。

线程池的实现:

import ThreadPool.dlthreadclass threadpool:def __init__( self,queue,handlers,maxdepth,num_of_threads):self.queue = queueself.handlers=handlersself.maxdepth=maxdepthself.threads = []self.__createThreadPool(num_of_threads)def __createThreadPool( self, num_of_threads):for i in range(num_of_threads):thread = ThreadPool.dlthread.dlthread(self.queue,self.handlers,self.maxdepth)self.threads.append(thread)def wait_for_complete(self):while len(self.threads):thread = self.threads.pop()thread.setDaemon(True)thread.start()if thread.isAlive():thread.join()

可以看到python 的线程池还挺简单的。下面的代码是工作线程的实现:

import threading
import Crawler.propertybag
import copyclass dlthread(threading.Thread):def __init__(self, queue,handlers,maxdepth):super(dlthread,self).__init__()self.maxdepth=maxdepthself.queue=queueself.handlers=copy.deepcopy(handlers)#深表复制self.handlers_num=len(handlers)def run(self):while True:urltuple=self.queue.get()if self.handlers_num > 0:ps=Crawler.propertybag.propertybag(urltuple[1],self.queue,self.maxdepth)for i in range(0,self.handlers_num):self.handlers[i].Handle(urltuple[0],ps)self.queue.task_done()

其中propertybag是用来在管道(Handler)间传递数据用的。为了线程间不互相干扰,所有的Handler都是进行深表复制后才赋予线程操作的。 所有的管道(在NCrawler中叫pipeline,我这里叫Handler)实现的基类是:

class BaseHandler:def __init__(self):returndef Handle(self,url,pbags):pass

最后是Crawler类:

import queue
import time
from ThreadPool.threadpool import threadpool
import Handler.HTMLHandler
from Crawler.cyclethread import cyclethreadclass Crawler:def __init__(self,starturl, handles, threads_num=5, maxdepth=14):if handles is None or len(handles) == 0:raise Exception('No handlers is given')self.queue=queue.Queue()self.starturl=starturlself.queue.put((starturl,0))self.maxdepth=maxdepthif type(handles) is list and len(handles)>0:self.handlers=handleselse:raise Exception('no handlers is given')self.threads_num=threads_numdef crawl(self):tp=threadpool(maxdepth=self.maxdepth,queue=self.queue,handlers=self.handlers,num_of_threads=self.threads_num)tp.wait_for_complete()def cyclecrawl(self,period):ct=cyclethread(self.queue,(self.starturl,0),period)ct.setDaemon(True)ct.start()self.crawl()

它负责开启线程池并按照用户指定的方式运行爬虫。

转载于:https://www.cnblogs.com/rav009/p/5131143.html

C#开源爬虫NCrawler源代码解读以及将其移植到python3.2(4)相关推荐

  1. 33款你可能不知道的开源爬虫软件工具

    要玩大数据,没有数据怎么玩?这里推荐一些33款开源爬虫软件给大家. 2 爬虫,即网络爬虫,是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫而做出的优化. ...

  2. Java开源爬虫框架crawler4j

    花了两个小时把Java开源爬虫框架crawler4j文档翻译了一下,因为这几天一直在学习Java爬虫方面的知识,今天上课时突然感觉全英文可能会阻碍很多人学习的动力,刚好自己又正在接触这个爬虫框架,所以 ...

  3. 33款可用来抓数据的开源爬虫软件工具

    要玩大数据,没有数据怎么玩?这里推荐一些33款开源爬虫软件给大家. 爬虫,即网络爬虫,是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫而做出的优化. 网络 ...

  4. 可用来抓数据的开源爬虫软件工具

    原文地址:http://www.36dsj.com/archives/34383 要玩大数据,没有数据怎么玩?这里推荐一些33款开源爬虫软件给大家. 爬虫,即网络爬虫,是一种自动获取网页内容的程序.是 ...

  5. 要玩大数据,没有数据怎么玩?这里推荐一些33款开源爬虫软件给大家。

    爬虫,即网络爬虫,是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫而做出的优化. 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索 ...

  6. 主流编程语言的 33 款开源爬虫

    原文地址 去年,之前的同事,喜欢看小说,就想自己没事搞个网站,我告诉他,先用爬虫把别人网站的小说下载下来,放到自己的网站里~我同事编码能力很强,学东西相当快,给他大概讲一下,帮他下载个用 http 协 ...

  7. python 爬虫源代码-从零开始学Python网络爬虫_源代码.rar

    [实例简介] [实例截图] [核心代码] 从零开始学Python网络爬虫_源代码_1 ├── 58project │ ├── __pycache__ │ │ ├── channel_extract.c ...

  8. 并注册烧写钩子 获取启动介质类型_鸿蒙OS开源代码精要解读之—— 系统服务框架子系统(服务启动)...

    鸿蒙OS开源代码精要解读之-- 系统服务框架子系统(服务启动) 作者介绍: 中科创达OpenHarmony研究组 说明: 中科创达OpenHarmony研究组第一时间对https://codechin ...

  9. jqfactor_analyzer源代码解读02

    jqfactor_analyzer单因子分析02 首先jqfactor_analyzer源代码解读01中已经得到了self._clean_factor_data(注意binning_by_group参 ...

  10. 鸿蒙OS开源代码精要解读之——init

    鸿蒙OS开源代码精要解读之--init 作者介绍: 中科创达OpenHarmony研究组 说明: 中科创达OpenHarmony研究组第一时间对https://codechina.csdn.net/o ...

最新文章

  1. ueditor百度编辑器常见报错的解决方法
  2. Linux学习总结(54)——Red Hat Enterprise Linux与CentOS的区别
  3. 蓝桥杯 ALGO-54 算法训练 简单加法(基本型)
  4. 高继承性(HTML、CSS)
  5. 语音识别芯片的工作原理和分类
  6. KVO.非常简单的键值监听模式
  7. android驱动程序失败,android studio 3.0中的haxm错误需要数字签名的驱动程序
  8. 为了相同的前缀-麦迪时刻
  9. mysql sqlyog 乱码_SQLyog中文乱码的解决方法
  10. windows10自动更新后,设备管理器蓝牙消失“未知USB设备”
  11. DMIS 5.3 编程基本要义
  12. 使用git时报错schannel: next InitializeSecurityContext failed
  13. Talk预告 | 微软亚洲研究院王希廷:基于逻辑规则推理的深度自可解释模型
  14. 查询数据库空间(mysql和oracle)
  15. 施工企业选择智慧工地的有效方法
  16. 基于Netty的RPC架构实战演练
  17. 【BI学习心得13-淘宝定向广告演化与天猫用户复购预测】
  18. poj3270Cow Sorting(置换+贪心)
  19. python network programming tutorial
  20. c4droid中c语言编译器,c4droid怎么安装 c4droid安装教程及使用说明

热门文章

  1. win7 时间服务器地址修改,win7 时间服务器地址修改
  2. Py2,Py3的差异
  3. RNN 卷积神经网络- 吴恩达Andrew Ng 论文等资料汇总
  4. 极客大学架构师训练营-架构师技术图谱-大作业二
  5. 收到控制台警告:当我在iOS13.2中加载WKWebView时,[Process] kill() returned unexpected error 1
  6. linux挂载曙光存储,曙光I1620G30获取设备的cpu、内存、存储等参数信息。
  7. 高德地图android显示级别指定位置,获取地图中心点/级别
  8. amd玄冰400怎么拆图解_【装机帮扶站】第735期:“无货”当道的京东年底大预售来了(AMD篇)...
  9. 旋转图像 leetcode
  10. java多线程(1)----多线程的概述