网络爬虫08: PySpider爬虫框架

别等时光非礼了梦想. 提交于 2019-12-04 03:49:11

    爬虫的基础知识到这里,已经可以暂时告一段落,接下来就是学会使用框架来写爬虫,用框架会使爬虫代码更加简洁。在这之前,我也了解了一下关于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即可进入控制台页面
   

3.在web控制台点create按钮新建任务,项目名自定义,本例项目名为Web

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运行调试一下,即可看到
   

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

8.查看MongoDB数据库

原文出处:https://www.jzfblog.com/detail/73,文章的更新编辑以此链接为准。欢迎关注源站文章!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!