蒋振飞的博客 - 网络爬虫08:PySpider爬虫框架   
正在加载蒋振飞的博客...
V3.0
蒋振飞的博客

网络爬虫08:PySpider爬虫框架

发布时间: 2018年08月10日 发布人: 蒋振飞 热度: 678 ℃ 评论数: 0

    爬虫的基础知识到这里,已经可以暂时告一段落,接下来就是学会使用框架来写爬虫,用框架会使爬虫代码更加简洁。在这之前,我也了解了一下关于Python爬虫都有哪些框架。

一、Python常用爬虫框架

1.scrapy (推荐)  

    地址:https://scrapy.org/
    Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。另外,Scrap,是碎片的意思,这个Python的爬虫框架叫Scrapy。

2.Crawley

    地址:http://project.crawley-cloud.com/
    高速爬取对应网站的内容,支持关系和非关系数据库,数据可以导出为JSON、XML等。

3.Portia

    地址:https://scrapinghub.com/portia
    Portia 是 scrapyhub 开源的一款可视化爬虫规则编写工具。Portia 提供了可视化的 Web 页面,只需通过简单点击,标注页面上需提取的相应数据,无需任何编程知识即可完成爬取规则的开发。这些规则还可在 Scrapy 中使用,用于抓取页面。

4.PySpider

    地址:http://www.pyspider.cn/
    PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI。采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。

5.grab

    地址:http://www.imscraping.ninja/posts/introducing-grab-framework-python-webscraping/
    网络爬虫框架(基于pycurl/multicur)。
    接下来我首先选择了pyspider框架的使用来了解爬虫框架,第一次使用该框架,发现妈妈再也不用担心我学不会爬虫了。

二、PySpdier的前期准备

1.安装pyspider

pip3 install pyspider

2.安装Phantomjs

    在官网下载解压后,并将pathtomjs mv到usr/bin路径下。
    下载地址:https://phantomjs.org/dowmload.html
    官方API地址:http://www.pyspider.cn/book/pyspider/self.crawl-16.html

3.PySpider

    ①多进程处理。
    ②去重处理。
    ③错误尝试。
    ④PyQuery提取。
    ⑤结果监控。
    ⑥WebUI管理。
    ⑦代码简洁。
    ⑧JavaScript渲染。

三、使用方法

1.首先启动pyspider

pyspider all

2.访问localhost:5000

    启动成功后出现如下图所示,提醒我们在浏览器输入localhost:5000即可进入控制台页面。
   QQ截图20180810102423.png

3.新建任务

    在web控制台点create按钮新建任务,项目名自定义,本例项目名为Web。
QQ截图20180810103822.png

4.进入创建的项目

    可以看到如下所示的一些函数

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2015-10-08 12:45:44
# Project: test

from pyspider.libs.base_handler import *


class Handler(BaseHandler):
    crawl_config = {
    }

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

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

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

    代码简单分析:
        ①def on_start(self) 方法是入口代码。当在web控制台点击run按钮时会执行此方法。
        ②self.crawl(url, callback=self.index_page)这个方法是调用API生成一个新的爬取任务,这个任务被添加到待抓取队列。
        ③def index_page(self, response) 这个方法获取一个Response对象。 response.doc是pyquery对象的一个扩展方法。pyquery是一个类似于jQuery的对象选择器。
        ④def detail_page(self, response)返回一个结果集对象。这个结果默认会被添加到resultdb数据库(如果启动时没有指定数据库默认调用sqlite数据库),也可以重写。 
        ⑤on_result(self,result)方法来指定保存位置。

    更多知识:
        ①@every(minutes=24*60, seconds=0) 这个设置是告诉scheduler(调度器)on_start方法每天执行一次。
        ②@config(age=10 * 24 * 60 * 60) 这个设置告诉scheduler(调度器)这个request(请求)过期时间是10天,10天内再遇到这个请求直接忽略。这个参数也可以在self.crawl(url, age=10*24*60*60) 和 crawl_config中设置。
        ③@config(priority=2) 这个是优先级设置。数字越大越先执行。

5.举例使用

    上面已经编写的代码使用了response.doc,不难发现其用的是PyQuery的解析库,以访问我的个人网站为例,将http://scrapy.org/改为:http://www.jzfblog.com/,并将文章信息存储到MongoDB数据库中。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2018-08-10 08:25:51
# Project: MyWeb

from pyspider.libs.base_handler import *
import pymongo


class Handler(BaseHandler):
    crawl_config = {
    }
    client = pymongo.MongoClient('localhost')
    db = client['myWeb']
    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl('http://www.jzfblog.com/blog', callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc('.blog-title > a').items():
            self.crawl(each.attr.href, callback=self.detail_page)
        next = response.doc('div.paginator > ul > li:last-child > a').attr.href
        print(next)
        self.crawl(next,callback=self.index_page)
        

    @config(priority=2)
    def detail_page(self, response):
        name = response.doc('.blog-name').text()
        detail = response.doc('.blog-info-description > li').text()
        
        return {
            "name": name,
            "detail": detail,
        }
    def on_result(self,result):
        # 有结果就执行
        if result:
            self.save_to_mongo(result)
            
    def save_to_mongo(self,result):
        if self.db['blog'].insert(result):
            print('Saved to Mongo', result)

6.点击run运行调试

    即可看到

   QQ截图20180810105541.png

7.修改status

    返回到全部项目首页,将status修改为debug或running,然后点击run即可将代码一键回调执行。

 QQ截图20180810110028.png     

    ①TODO- 当一个脚本刚刚被创建时的状态。
    ②STOP- 你可以设置项目状态为STOP让项目停止运行。
    ③CHECKING- 当一个运行中的项目被编辑时项目状态会被自动设置成此状态并停止运行。
    ④DEBUG/RUNNING- 这两状态都会运行爬虫,但是他们之间是有区别的.一般来说调试阶段用DEBUG状态,线上用RUNNING状态。
    ⑤rate- 每秒执行多少个请求。
    ⑥burst- 设置并发数,如:rate/burst = 0.1/3,这个的意思是爬虫10秒爬一个页面.但是开始时前三个任务会同时时行,不会等10秒,第四个任务爬取前会等10秒。 
    ⑦项目删除:把group设置成delete并把项目状态设置成STOP,24小时后系统会自动删除此项目。

8.查看MongoDB数据库

QQ截图20180810110127.png

打赏 蒋振飞

取消

感谢您的支持,我会继续努力的!

扫码支持
一分也是爱     一块不嫌多

点击 支付宝 或 微信 打赏蒋振飞

打开支付宝扫一扫,即可进行扫码打赏哦

评论列表