pyspider 教程怎么停止某个任务

当前位置:
pyspider控制台使用说明
pyspider控制台使用说明
<dd data-toggle='tooltip' data-placement='top' data-original-title='添加时间:
16:00:00 &&'>
<dd data-toggle='tooltip' data-placement='top' data-original-title='作者: manbuheiniu &&'> manbuheiniu
<span class='label label-warning' data-toggle='tooltip' data-placement='top' data-original-title=' 阅读:1566'> 1566
功能强大所以很多朋友刚打开pyspider控制台不知道怎么操作了,尤其是用过scrapy的朋友更是摸不到头脑.为了让大家快速入门,特此分享pyspider控制台的使用说明.
队列统计是为了方便查看爬虫状态,优化爬虫爬取速度新增的状态统计.每个组件之间的数字就是对应不同队列的排队数量.通常来是0或是个位数.如果达到了几十甚至一百说明下游组件出现了瓶颈或错误,需要分析处理.
新建项目:pyspider与scrapy最大的区别就在这,pyspider新建项目调试项目完全在web下进行,而scrapy是在命令行下开发并运行测试.
组名:项目新建后一般来说是不能修改项目名的,如果需要特殊标记可修改组名.直接在组名上点鼠标左键进行修改.注意:组名改为delete后如果状态为stop状态,24小时后项目会被系统删除.
运行状态:这一栏显示的是当前项目的运行状态.每个项目的运行状态都是单独设置的.直接在每个项目的运行状态上点鼠标左键进行修改.运行分为五个状态:TODO,STOP,CHECKING,DEBUG,RUNNING.各状态说明:TODO是新建项目后的默认状态,不会运行项目.STOP状态是停止状态,也不会运行.CHECHING是修改项目代码后自动变的状态.DEBUG是调试模式,遇到错误信息会停止继续运行,RUNNING是运行状态,遇到错误会自动尝试,如果还是错误会跳过错误的任务继续运行.
速度控制:很多朋友安装好用说爬的慢,多数情况是速度被限制了.这个功能就是速度设置项.rate是每秒爬取页面数,burst是并发数.如1/3是三个并发,每秒爬取一个页面.
简单统计:这个功能只是简单的做的运行状态统计,5m是五分钟内任务执行情况,1h是一小时内运行任务统计,1d是一天内运行统计,all是所有的任务统计.
运行:run按钮是项目初次运行需要点的按钮,这个功能会运行项目的on_start方法来生成入口任务.
任务列表:显示最新任务列表,方便查看状态,查看错误等
结果查看:查看项目爬取的结果.
pip install pyspider
安装成功后运行
打开http://localhost:5000/&访问控制台
控制台截图
更多请参考或
在github上提交&, 或发送 PR今天看啥 热点:
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法,pythonpyspider在这篇文章中,我们将分析一个网络爬虫。
网络爬虫是一个扫描网络内容并记录其有用信息的工具。它能打开一大堆网页,分析每个页面的内容以便寻找所有感兴趣的数据,并将这些数据存储在一个数据库中,然后对其他网页进行同样的操作。
如果爬虫正在分析的网页中有一些链接,那么爬虫将会根据这些链接分析更多的页面。
搜索引擎就是基于这样的原理实现的。
这篇文章中,我特别选了一个稳定的、”年轻”的开源项目pyspider,它是由 binux 编码实现的。
注:据认为pyspider持续监控网络,它假定网页在一段时间后会发生变化,因此一段时间后它将会重新访问相同的网页。
爬虫pyspider主要由四个组件组成。包括调度程序(scheduler),抓取程序(fetcher),内容处理程序(processor)以及一个监控组件。
调度程序接受任务并决定该做什么。这里有几种可能性,它可以丢弃一个任务(可能这个特定的网页刚刚被抓取过了),或者给任务分配不同的优先级。
当各个任务的优先级确定之后,它们被传入抓取程序。它重新抓取网页。这个过程很复杂,但逻辑上比较简单。
当网络上的资源被抓取下来,内容处理程序就负责抽取有用的信息。它运行一个用户编写的Python脚本,这个脚本并不像沙盒一样被隔离。它的职责还包括捕获异常或日志,并适当地管理它们。
最后,爬虫pyspider中有一个监控组件。
爬虫pyspider提供一个异常强大的网页界面(web ui),它允许你编辑和调试你的脚本,管理整个抓取过程,监控正在进行的任务,并最终输出结果。
项目和任务
在pyspider中,我们有项目和任务的概念。
一个任务指的是一个需要从网站检索并进行分析的单独页面。
一个项目指的是一个更大的实体,它包括爬虫涉及到的所有页面,分析网页所需要的python脚本,以及用于存储数据的数据库等等。
在pyspider中我们可以同时运行多个项目。
代码结构分析
在根目录中可以找到的文件夹有:
data,空文件夹,它是存放由爬虫所生成的数据的地方。
docs,包含该项目文档,里边有一些markdown代码。
pyspider,包含项目实际的代码。
test,包含相当多的测试代码。
这里我将重点介绍一些重要的文件:
.travis.yml,一个很棒的、连续性测试的整合。你如何确定你的项目确实有效?毕竟仅在你自己的带有固定版本的库的机器上进行测试是不够的。
Dockerfile,同样很棒的工具!如果我想在我的机器上尝试一个项目,我只需要运行Docker,我不需要手动安装任何东西,这是一个使开发者参与到你的项目中的很好的方式。
LICENSE,对于任何开源项目都是必需的,(如果你自己有开源项目的话)不要忘记自己项目中的该文件。
requirements.txt,在Python世界中,该文件用于指明为了运行该软件,需要在你的系统中安装什么Python包,在任何的Python项目中该文件都是必须的。
run.py,该软件的主入口点。
setup.py,该文件是一个Python脚本,用于在你的系统中安装pyspider项目。
已经分析完项目的根目录了,仅根目录就能说明该项目是以一种非常专业的方式进行开发的。如果你正在开发任何的开源程序,希望你能达到这样的水准。
文件夹pyspider
让我们更深入一点儿,一起来分析实际的代码。
在这个文件夹中还能找到其他的文件夹,整个软件背后的逻辑已经被分割,以便更容易的进行管理和扩展。
这些文件夹是:database、fetcher、libs、processor、result、scheduler、webui。
在这个文件夹中我们也能找到整个项目的主入口点,run.py。
文件run.py
这个文件首先完成所有必需的杂事,以保证爬虫成功地运行。最终它产生所有必需的计算单元。向下滚动我们可以看到整个项目的入口点,cli()。
这个函数好像很复杂,但与我相随,你会发现它并没有你想象中复杂。函数cli()的主要目的是创建数据库和消息系统的所有连接。它主要解析命令行参数,并利用所有我们需要的东西创建一个大字典。最后,我们通过调用函数all()开始真正的工作。
一个网络爬虫会进行大量的IO操作,因此一个好的想法是产生不同的线程或子进程来管理所有的这些工作。通过这种方式,你可以在等待网络获取你当前html页面的同时,提取前一个页面的有用信息。
函数all()决定是否运行子进程或者线程,然后调用不同的线程或子进程里的所有的必要函数。这时pyspider将产生包括webui在内的,爬虫的所有逻辑模块所需要的,足够数量的线程。当我们完成项目并关闭webui时,我们将干净漂亮地关闭每一个进程。
现在我们的爬虫就开始运行了,让我们进行更深入一点儿的探索。
调度程序从两个不同的队列中获取任务(newtask_queue和status_queue),并把任务加入到另外一个队列(out_queue),这个队列稍后会被抓取程序读取。
调度程序做的第一件事情是从数据库中加载所需要完成的所有的任务。之后,它开始一个无限循环。在这个循环中会调用几个方法:
1._update_projects():尝试更新的各种设置,例如,我们想在爬虫工作的时候调整爬取速度。
2._check_task_done():分析已完成的任务并将其保存到数据库,它从status_queue中获取任务。
3._check_request():如果内容处理程序要求分析更多的页面,把这些页面放在队列newtask_queue中,该函数会从该队列中获得新的任务。
4._check_select():把新的网页加入到抓取程序的队列中。
5._check_delete():删除已被用户标记的任务和项目。
6._try_dump_cnt():记录一个文件中已完成任务的数量。对于防止程序异常所导致的数据丢失,这是有必要的。
def run(self):
while not self._quit:
time.sleep(self.LOOP_INTERVAL)
self._update_projects()
self._check_task_done()
self._check_request()
while self._check_cronjob():
self._check_select()
self._check_delete()
self._try_dump_cnt()
self._exceptions = 0
except KeyboardInterrupt:
except Exception as e:
logger.exception(e)
self._exceptions += 1
if self._exceptions & self.EXCEPTION_LIMIT:
循环也会检查运行过程中的异常,或者我们是否要求python停止处理。
# exit components run in subprocess
for each in threads:
if not each.is_alive():
if hasattr(each, 'terminate'):
each.terminate()
each.join()
抓取程序的目的是检索网络资源。
pyspider能够处理普通HTML文本页面和基于AJAX的页面。只有抓取程序能意识到这种差异,了解这一点非常重要。我们将仅专注于普通的html文本抓取,然而大部分的想法可以很容易地移植到Ajax抓取器。
这里的想法在某种形式上类似于调度程序,我们有分别用于输入和输出的两个队列,以及一个大的循环。对于输入队列中的所有元素,抓取程序生成一个请求,并将结果放入输出队列中。
它听起来简单但有一个大问题。网络通常是极其缓慢的,如果因为等待一个网页而阻止了所有的计算,那么整个过程将会运行的极其缓慢。解决方法非常的简单,即不要在等待网络的时候阻塞所有的计算。这个想法即在网络上发送大量消息,并且相当一部分消息是同时发送的,然后异步等待响应的返回。一旦我们收回一个响应,我们将会调用另外的回调函数,回调函数将会以最适合的方式管理这样的响应。
爬虫pyspider中的所有的复杂的异步调度都是由另一个优秀的开源项目
http://www.tornadoweb.org/en/stable/
现在我们的脑海里已经有了极好的想法了,让我们更深入地探索这是如何实现的。
def run(self):
def queue_loop():
if not self.outqueue or not self.inqueue:
while not self._quit:
if self.outqueue.full():
task = self.inqueue.get_nowait()
task = utils.decode_unicode_obj(task)
self.fetch(task)
except queue.Empty:
tornado.ioloop.PeriodicCallback(queue_loop, 100, io_loop=self.ioloop).start()
self._running = True
self.ioloop.start()
函数run()&/strong&
函数run()是抓取程序fetcher中的一个大的循环程序。
函数run()中定义了另外一个函数queue_loop(),该函数接收输入队列中的所有任务,并抓取它们。同时该函数也监听中断信号。函数queue_loop()作为参数传递给tornado的类PeriodicCallback,如你所猜,PeriodicCallback会每隔一段具体的时间调用一次queue_loop()函数。函数queue_loop()也会调用另一个能使我们更接近于实际检索Web资源操作的函数:fetch()。
函数fetch(self, task, callback=None)
网络上的资源必须使用函数phantomjs_fetch()或简单的http_fetch()函数检索,函数fetch()只决定检索该资源的正确方法是什么。接下来我们看一下函数http_fetch()。
函数http_fetch(self, url, task, callback)
def http_fetch(self, url, task, callback):
'''HTTP fetcher'''
fetch = copy.deepcopy(self.default_options)
fetch['url'] = url
fetch['headers']['User-Agent'] = self.user_agent
def handle_response(response):
return task, result
request = tornado.httpclient.HTTPRequest(header_callback=header_callback, **fetch)
if self.async:
self.http_client.fetch(request, handle_response)
return handle_response(self.http_client.fetch(request))
终于,这里才是完成真正工作的地方。这个函数的代码有点长,但有清晰的结构,容易阅读。
在函数的开始部分,它设置了抓取请求的header,比如User-Agent、超时timeout等等。然后定义一个处理响应response的函数:handle_response(),后边我们会分析这个函数。最后我们得到一个tornado的请求对象request,并发送这个请求对象。请注意在异步和非异步的情况下,是如何使用相同的函数来处理响应response的。
让我们往回看一下,分析一下函数handle_response()做了什么。
函数handle_response(response)
def handle_response(response):
result = {}
result['orig_url'] = url
result['content'] = response.body or ''
callback('http', task, result)
return task, result
这个函数以字典的形式保存一个response的所有相关信息,例如url,状态码和实际响应等,然后调用回调函数。这里的回调函数是一个小方法:send_result()。
函数send_result(self, type, task, result)
def send_result(self, type, task, result):
if self.outqueue:
self.outqueue.put((task, result))
这个最后的函数将结果放入到输出队列中,等待内容处理程序processor的读取。
内容处理程序processor
内容处理程序的目的是分析已经抓取回来的页面。它的过程同样也是一个大循环,但输出中有三个队列(status_queue, newtask_queue 以及result_queue)而输入中只有一个队列(inqueue)。
让我们稍微深入地分析一下函数run()中的循环过程。
函数run(self)
def run(self):
task, response = self.inqueue.get(timeout=1)
self.on_task(task, response)
self._exceptions = 0
except KeyboardInterrupt:
except Exception as e:
self._exceptions += 1
if self._exceptions & self.EXCEPTION_LIMIT:
这个函数的代码比较少,易于理解,它简单地从队列中得到需要被分析的下一个任务,并利用on_task(task, response)函数对其进行分析。这个循环监听中断信号,只要我们给Python发送这样的信号,这个循环就会终止。最后这个循环统计它引发的异常的数量,异常数量过多会终止这个循环。
函数on_task(self, task, response)
def on_task(self, task, response):
response = rebuild_response(response)
project = task['project']
project_data = self.project_manager.get(project, updatetime)
ret = project_data['instance'].run(
status_pack = {
'taskid': task['taskid'],
'project': task['project'],
'url': task.get('url'),
self.status_queue.put(utils.unicode_obj(status_pack))
if ret.follows:
self.newtask_queue.put(
[utils.unicode_obj(newtask) for newtask in ret.follows])
for project, msg, url in ret.messages:
self.inqueue.put(({...},{...}))
return True
函数on_task()是真正干活的方法。
它尝试利用输入的任务找到任务所属的项目。然后它运行项目中的定制脚本。最后它分析定制脚本返回的响应response。如果一切顺利,将会创建一个包含所有我们从网页上得到的信息的字典。最后将字典放到队列status_queue中,稍后它会被调度程序重新使用。
如果在分析的页面中有一些新的链接需要处理,新链接会被放入到队列newtask_queue中,并在稍后被调度程序使用。
现在,如果有需要的话,pyspider会将结果发送给其他项目。
最后如果发生了一些错误,像页面返回错误,错误信息会被添加到日志中。
相关搜索:
相关阅读:
相关频道:
&&&&&&&&&&&&&&&&
Python教程最近更新> 博客详情
摘要: PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI。采用 Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。
PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI。采用 Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。在线示 例:http://demo.pyspider.org/ 在线手册:http://docs.pyspider.org & 如有问题请加入QQ群讨论:
强大的python接口
强大的WEBUI可视化代码编写,任务监控,项目管理和结果查看功能
MySQL, MongoDB, SQLite 作为后台数据库
Javascript 页面支持
支持任务优先级队列,错误重复抓取,周期性重复抓取和过期抓取
支持分布式部署
pyspider爬取功能很强大只是用的人少点所以案例比较少。笔者推荐想学习使用的朋友直接查看demo.pyspider.org上的案例,常用的功能上面都有案例。下面我们分享一下使用pyspider采集js解析后页面的案例。
#!/usr/bin/env&python
#&-*-&encoding:&utf-8&-*-
#&vim:&set&et&sw=4&ts=4&sts=4&ff=unix&fenc=utf8:
#&Created&on&&13:05:52
from&libs.base_handler&import&*
class&Handler(BaseHandler):
&&&&this&is&a&sample&handler
&&&&crawl_config&=&{
&&&&&&&&"headers":&{
&&&&&&&&&&&&"User-Agent":&"BaiDuSpider",&#配置用户代理,模拟百度蜘蛛
&&&&def&on_start(self):
&&&&&&&&self.crawl('http://www.jishubu.net/science/article/pii/S5741',
&&&&&&&&&&&&&&&&&&&callback=self.detail_page)
&&&&&&&&&&&
&&&&def&index_page(self,&response):
&&&&&&&&for&each&in&response.doc('a').items():
&&&&&&&&&&&&if&re.match('http://www.jishubu.net/science/article/pii/\w+$',&each.attr.href):
&&&&&&&&&&&&&&&&self.crawl(each.attr.href,&callback=self.detail_page)
&&&&&&&&&&&
&&&&@config(fetch_type="js")&&#添加配置启用js解析功能
&&&&def&detail_page(self,&response):
&&&&&&&&self.index_page(response)
&&&&&&&&self.crawl(response.doc('HTML&BODY&DIV#page-area&DIV#rightPane&DIV#rightOuter&DIV#rightInner&DIV.innerPadding&DIV#recommend_related_articles&OL#relArtList&LI&A.viewMoreArticles.cLink').attr.href,&callback=self.index_page)
&&&&&&&&&&&
&&&&&&&&return&{
&&&&&&&&&&&&&&&&"url":&response.url,
&&&&&&&&&&&&&&&&"title":&response.doc('HTML&BODY&DIV#page-area&DIV#centerPane&DIV#centerContent&DIV#centerInner&DIV#frag_1&H1.svTitle').text(),
&&&&&&&&&&&&&&&&"authors":&[x.text()&for&x&in&response.doc('HTML&BODY&DIV#page-area&DIV#centerPane&DIV#centerContent&DIV#centerInner&DIV#frag_1&UL.authorGroup.noCollab&LI.smh5&A.authorName').items()],
&&&&&&&&&&&&&&&&"abstract":&response.doc('HTML&BODY&DIV#page-area&DIV#centerPane&DIV#centerContent&DIV#centerInner&DIV#frag_2&DIV.abstract.svAbstract&P').text(),
&&&&&&&&&&&&&&&&"keywords":&[x.text()&for&x&in&response.doc('HTML&BODY&DIV#page-area&DIV#centerPane&DIV#centerContent&DIV#centerInner&DIV#frag_2&UL.keyword&LI.svKeywords&SPAN').items()],
&&&&&&&&&&&&&&&&}
人打赏支持
码字总数 511
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区}

我要回帖

更多关于 pyspider安装教程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信