【Python3 爬虫学习笔记】pyspider框架的使用 6

任务区分

在pyspider判断两个任务是否是重复的是使用该任务对应的URL的MD5值作为任务的唯一ID,如果ID相同,那么两个任务就会判定为相同,其中一个就不会爬取了。很多情况下请求的链接可能是同一个,但是POST的参数不同。这时可以重写task_id()方法,改变这个ID的计算方式来实现不同的区分,如下所示:

import json
from pyspider.libs.utils import md5string
def get_taskid(self, task):
	return md5string(task['url']+json.dumps(task['fetch'].get('data', '')))

这里重写了get_taskid()方法,利用URL和POST的参数来生成ID。这样一来,即使URL相同,但是POST的参数不同,两个任务的ID就不同,它们就不会被识别成重复任务。

全局配置

pyspider可以使用crawl_config来指定全局的配置,配置中的参数会和crawl()方法创建任务时的参数合并。如要全局配置一个Headers,可以定义如下代码:

class Handler(BaseHandler):
	crawl_config = {
		'headers':{
			'User-Agent':'GoogleBot',
		}
	}
定时爬取

我们可以通过every属性来设置爬取的时间间隔,如下所示:

@every(minutes=24 * 60)
def on_start(self):
	for url in urllist:
		self.crawl(url, callback=self.index_page)

这里设置了每天执行一次爬取。
在上文中我们提到了任务的有效时间,在有效时间内爬取不会重复。所以要把有效时间设置得比重复时间更短,这样才可以实现定时爬取。
例如,下面的代码就无法做到每天爬取:

@every(minutes=24 * 60)
def on_start(self):
	self.crawl('http://www.example.org/', callback=self.index_page)

@config(age=10 * 24 * 60 * 60)
def index_page(self):
	pass

这里任务的过期时间为10天,而自动爬取的时间间隔为1天。当第二次尝试重新爬取的时候,pyspider会监测到此任务尚未过期,便不会执行爬取,所以我们需要将age设置得小于定时时间。

项目状态

每个项目都有6个状态,分别是TODO、STOP、CHECKING、DEBUG、RUNNING、PAUSE。

  • TODO:它是项目刚刚被创建还未实现时的状态。
  • STOP:如果想停止某项目的抓取,可以将项目的状态设置为STOP。
  • CHECKING:正在运行的项目被修改后就会变成CHECKING状态,项目在中途出错需要调整的时候会遇到这种情况。
  • DEBUG/RUNNING:这两个状态对项目的运行没有影响,状态设置为任意一个,项目都可以运行,但是可以用二者来区别项目是否已经测试通过。
  • PAUSE:当爬取过程中出现连续多次错误时,项目会自动设置为PAUSE状态,并等待一定时间后继续爬取。
删除项目

pyspider中没有直接删除项目的选项。如要删除任务,那么将项目的状态设置为STOP,将分组名称设置为delete,等待24小时,则项目会自动删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值