from pyspider.libs.base_handler import *
# pyspider的实现类需要继承BaseHandler,实现基本的几个接口
class Handler(BaseHandler):
# 放一些self.crawl函数请求页面时的http请求头:referer,user-agent等
crawl_config = {
}
# pipline的起点,这里请求的url最好是下文请求的父级url,否则爬取不了,我出过这样的问题,不知道是不是就是这样的机制
# 只会执行一次,即如果on_start中有循环self.crawl,只会执行最后一次
@every(minutes=24 * 60) # 任务运行之间的间隔,用来不停的补采过期的数据
def on_start(self):
# 爬取网页的核心函数,支持phantomjs解析,需配置fetch_type='js'
self.crawl('http://scrapy.org/', callback=self.index_page)
# 理论上是爬取分页的,但是如果有多层爬取也得靠index_page,需要在self.crawl中设置callback为index_page,形成递归,当然如果逻辑不通,用if-else分开即可,如果有人发现了更好的多层爬取的方式,拜托告诉我一声...
@config(age=10 * 24 * 60 * 60) # 爬取结果的有效期
def index_page(self, response):
# response.doc得到一个pyquery对象,和操作一个jquery对象相似,相关api看pyquery官网即可
for each in response.doc('a[href^="http"]').items():
self.crawl(each.attr.href, callback=self.detail_page)
# 输出解析结果,如果用默认的sqlite,只能return一个dict,如果自己复写了on_result,就可以随意返回了
@config(priority=2)
def detail_page(self, response):
return {
"url": response.url,
"title": response.doc('title').text(),
}
# 自定义结果处理方式
def on_result(self, result):
...
# 处理结果
...
# task结束时调用
def on_finished(self, response, task):
...
# 任务关闭时的操作,可以用来关数据库连接之类
...
pyspider创建项目详细注释
最新推荐文章于 2024-05-09 08:24:26 发布