Python实现在线程里运行scrapy的方法


Posted in Python onApril 07, 2015

本文实例讲述了Python实现在线程里运行scrapy的方法。分享给大家供大家参考。具体如下:

如果你希望在一个写好的程序里调用scrapy,就可以通过下面的代码,让scrapy运行在一个线程里。

"""
Code to run Scrapy crawler in a thread - works on Scrapy 0.8
"""
import threading, Queue
from twisted.internet import reactor
from scrapy.xlib.pydispatch import dispatcher
from scrapy.core.manager import scrapymanager
from scrapy.core.engine import scrapyengine
from scrapy.core import signals
class CrawlerThread(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
    self.running = False
  def run(self):
    self.running = True
    scrapymanager.configure(control_reactor=False)
    scrapymanager.start()
    reactor.run(installSignalHandlers=False)
  def crawl(self, *args):
    if not self.running:
      raise RuntimeError("CrawlerThread not running")
    self._call_and_block_until_signal(signals.spider_closed, \
      scrapymanager.crawl, *args)
  def stop(self):
    reactor.callFromThread(scrapyengine.stop)
  def _call_and_block_until_signal(self, signal, f, *a, **kw):
    q = Queue.Queue()
    def unblock():
      q.put(None)
    dispatcher.connect(unblock, signal=signal)
    reactor.callFromThread(f, *a, **kw)
    q.get()
# Usage example below:
 
import os
os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'myproject.settings')
from scrapy.xlib.pydispatch import dispatcher
from scrapy.core import signals
from scrapy.conf import settings
from scrapy.crawler import CrawlerThread
settings.overrides['LOG_ENABLED'] = False # avoid log noise
def item_passed(item):
  print "Just scraped item:", item
dispatcher.connect(item_passed, signal=signals.item_passed)
crawler = CrawlerThread()
print "Starting crawler thread..."
crawler.start()
print "Crawling somedomain.com...."
crawler.crawl('somedomain.com) # blocking call
print "Crawling anotherdomain.com..."
crawler.crawl('anotherdomain.com') # blocking call
print "Stopping crawler thread..."
crawler.stop()

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
使用Python生成url短链接的方法
May 04 Python
详解Python的Django框架中的中间件
Jul 24 Python
深入理解Python变量与常量
Jun 02 Python
Python中的迭代器与生成器高级用法解析
Jun 28 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
python判断设备是否联网的方法
Jun 29 Python
对Python subprocess.Popen子进程管道阻塞详解
Oct 29 Python
Pandas删除数据的几种情况(小结)
Jun 21 Python
python内置函数sorted()用法深入分析
Oct 08 Python
Python使用psutil获取进程信息的例子
Dec 17 Python
python四个坐标点对图片区域最小外接矩形进行裁剪
Jun 04 Python
Python预测分词的实现
Jun 18 Python
Python实现从脚本里运行scrapy的方法
Apr 07 #Python
Python自定义scrapy中间模块避免重复采集的方法
Apr 07 #Python
Python中用memcached来减少数据库查询次数的教程
Apr 07 #Python
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 #Python
Python中使用pprint函数进行格式化输出的教程
Apr 07 #Python
利用QT写一个极简单的图形化Python闹钟程序
Apr 07 #Python
分析Python编程时利用wxPython来支持多线程的方法
Apr 07 #Python
You might like
10条PHP编程习惯助你找工作
2008/09/29 PHP
php5.5中类级别的常量使用介绍
2013/10/02 PHP
CI框架中zip类应用示例
2014/06/17 PHP
值得分享的php+ajax实时聊天室
2016/07/20 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
Jquery焦点图实例代码
2014/11/25 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
angularjs下ng-repeat点击元素改变样式的实现方法
2018/09/12 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
python实现车牌识别的示例代码
2019/08/05 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
机械专业个人求职自荐信格式
2013/09/21 职场文书
建筑设计学生的自我评价
2014/01/16 职场文书
《苏珊的帽子》教学反思
2014/04/07 职场文书
环保建议书200字
2014/05/14 职场文书
小区推广策划方案
2014/06/06 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
高考1977观后感
2015/06/04 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript
k-means & DBSCAN 总结
2021/04/27 Python
浅谈golang 中time.After释放的问题
2021/05/05 Golang
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android
Python+pyaudio实现音频控制示例详解
2022/07/23 Python