pspider-简单使用

功能简介

  • 提供方便易用的 WebUI 系统,可视化地编写和调式爬虫
  • 提供爬取进度监控、爬取结果查看、爬虫项目管理等功能。
  • 支持多种后端数据库,如 MySQL、MongoDB、Reids、SQLite、Elasticsearch、PostgreSQL。
  • 支持多种消息队列、如 RabbitMQ、Beanstalk、Redis、Kombu。
  • 提供优先级控制、失败重试、定时抓取等功能。
  • 对接了 PhantomJS、可以抓取 JavaScript 渲染的页面。
  • 支持单机和分布式部署、支持 Docker 部署

与Scrapy的对比

  • PySpider提供了WebUI,爬虫的编写、调试都是再WebUI中进行。而Scrapy原生是不具备这些功能的,它采取的是代码和命令行操作,但是可通过Portia实现可视化配置。
  • PySpider调试非常的方便。WebUI操作便捷直观。Scrapy则是使用parse命令进行调试,其方便程度不及PySpider。
  • PySpider支持PhantomJS来进行Javascript渲染也买你的额采集。Scrapy可以对接Scrapy-Splash组件,这需要额外配置。
  • PySpider内置了PyQuery作为选择器,Scrapy对接了XPath、CSS选择器和正则匹配。
  • PySpider的可扩展程度不足,可配置化程度不高。Scrapy可通过对接Middleware、Pipeline、Extension等组件实现非常强大的功能,模块之间的耦合程度低,可扩展程度极高。

架构

PySpider 的架构主要分为 Scheduler(调度器)、Fetcher(抓取器)、Processer(处理器)三个部分。整个爬取过程受到 Monitor(监控器)的监控,抓取的结果被 Result Worker(结果处理器)处理。

模块功能
WebUIweb的可视化任务监控web脚本编写,单步调试异常捕获,log捕获,print捕获等
Scheduler任务优先级周期定时任务流量控制基于时间周期 或 前链标签(例如更新时间)的重抓取调度
Fetcherdataurl支持,用于假抓取模拟传递method, header, cookie, proxy, etag, last_modified, timeout等抓取调度控制通过适配类似 phantomjs 的webkit引擎支持渲染
Processer内置的pyquery,以jQuery解析页面在脚本中完全控制调度抓取的各项参数,向后链传递信息异常捕获

抓取流程

  • 每个 PySpider项目对应一个 Python 脚本,该脚本定义了一个 Handler 类,它有一个 on_start() 方法。爬取首先调用 on_start() 方法生成最初的抓取任务,然后发送给 Scheduler。
  • Scheduler 将抓取任务分发给 Fetcher 进行抓取,Fetcher 执行并得到响应、随后将响应发送给 Processer。
  • Processer 处理响应并提取出新的 URL 生成新的抓取任务,然后通过消息队列的方式通知 Scheduler 当前抓取任务执行情况,并将新生成的抓取任务发送给 Scheduler。如果生成了新的提取结果,则将其发送到结果队列等待 Result Worker 处理。
  • Scheduler 接收到新的抓取任务,然后查询数据库,判断其如果是新的抓取任务或者是需要重试的任务就继续进行调度,然后将其发送回 Fetcher 进行抓取。
  • 不断重复以上工作、直到所有的任务都执行完毕,抓取结束。
  • 抓取结束后、程序会回调 on_finished() 方法,这里可以定义后处理过程。

实战

安装

# centos 7 python3
yum install python-devel curl-devel
pip install --upgrade pip
pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
pip install --compile pycurl

# windows python3
pip install pyspider

# 启动 pyspider
pyspider all
# 访问 http://localhost:4000

简单实现爬虫

爬取去哪网的信息

class Handler(BaseHandler):
    crawl_config = {
    }

    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl('http://travel.qunar.com/travelbook/list.htm', callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc("li > .tit > a").items():
            self.crawl(each.attr.href, callback=self.detail_page)
        next_href = response.doc(".next").attr.href
        self.crawl(next_href, callback=self.index_page)

    @config(priority=2)
    def detail_page(self, response):
        return {
            "url":response.url,
            "title":response.doc("#booktitle").text(),
            "content":response.doc(".imglst").text(),
            "foreword_list":response.doc(".foreword_list").text()
        }

使用phantomjs渲染页面

class Handler(BaseHandler):
    def on_start(self):
        self.crawl('http://www.pinterest.com/categories/popular/',
                   fetch_type='js', js_script="""
                   function() {
                       window.scrollTo(0,document.body.scrollHeight);
                   }
                   """, callback=self.index_page)

    def index_page(self, response):
        return {
            "url": response.url,
            "images": [{
                "title": x('.richPinGridTitle').text(),
                "img": x('.pinImg').attr('src'),
                "author": x('.creditName').text(),
            } for x in response.doc('.item').items() if x('.pinImg')]
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值