Python爬虫之旅——pyspider入门

/ Python / 没有评论 / 45浏览

pyspider是一个用python实现的功能强大的网络爬虫系统,能在浏览器界面上进行脚本的编写,功能的调度和爬取结果的实时查看,后端使用常用的数据库进行爬取结果的存储,还能定时设置任务与任务优先级等。

快速开始

提示:会在当前目录下生成data文件夹,存放数据。当然,我们爬取到的数据,生产下是需要存放在数据库的。

启动后,界面如下:

界面

爬取博客园

调试爬虫

我们创建一个爬虫,用于爬取博客园首页的博客标题和链接,下面点击Create按钮。输入以下信息:

创建爬虫

之后会跳转到编辑界面,供在线编辑以及调试。

编辑

下面我们将代码修改为:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from pyspider.libs.base_handler import BaseHandler, every, config


class Handler(BaseHandler):
    crawl_config = {
    }

    @every(minutes=24 * 60)
    def on_start(self):
        # def on_start(self) is the entry point of the script.
        # It will be called when you click the run button on dashboard.

        # It will add a new task to be crawled
        self.crawl('http://www.cnblogs.com', callback=self.index_page, validate_cert=False)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc('a[class="titlelnk"]').items():
            self.crawl(each.attr.href, callback=self.detail_page, validate_cert=False)

        # 翻页爬取
        # for each in response.doc('div[id="paging_block"]>div[class="pager"]>a').items():
        #    self.crawl(each.attr.href, callback=self.index_page, validate_cert=False)

    @config(priority=2)
    def detail_page(self, response):
        return {
            'url': response.url,
            'title': response.doc('title').text(),
        }

点击save进行保存。

代码简单分析:

更多知识:

下面我们点击Run按钮调试:

点击Run

再点击下面的Follows:

Follows

它识别了我们的index_page,因为点击Run调用了def on_start(self)方法,下面我们再点击index_page后面的执行按钮,会调用def index_page(self, response)方法,获取到首页上的博客链接,如下:

index_page

可以看到,将首页上的博客链接后抓取了,下面我们随便点击某一个detail_page后的执行按钮,将会调用def detail_page(self, response)方法,获取博客详细内容,这里我们只获取了url和title。

detail_page

可以发现某一篇博客信息被我们抓取了。

运行爬虫

上面我们一步一步的调试了我们写的爬虫程序,如果程序有问题,那么会直接进行提示。

下面我们来运行爬虫,得到首页的博客。

我们先回到首页:

alt

可以发现多了一条爬虫信息,它的状态为TODO,将其修改为RUNNINGDEBUG后,点击Run按钮运行爬虫。

运行爬虫

看下控制台显示运行完了,点击Results查看结果:

Results

结果保存在哪里呢?开始说过,数据保存在当前目录的data文件夹下:

data

即默认数据都保存在sqlite数据库的db文件中。

MongoDB存储

下面,我们关闭pyspider,然后创建一个config.json文件:

{
  "taskdb": "mongodb+taskdb://127.0.0.1:27017/pyspider_taskdb",
  "projectdb": "mongodb+projectdb://127.0.0.1:27017/pyspider_projectdb",
  "resultdb": "mongodb+resultdb://127.0.0.1:27017/pyspider_resultdb",
  "message_queue": "redis://127.0.0.1:6379/0",
  "webui": {
    "port": 5000,
    "username": "admin",
    "password": "admin",
    "need-auth": true
  }
}

上面我采用mongo存储,redis作为消息队列。

当然,pyspider支持Mysql、ES、MQ等多种存储介质。点我,查看更多配置

运行: pyspider --config config.json

接下来,将上面注释的分页爬取代码还原,开始爬虫之旅吧!

参考