1.简单的介绍

pyspider是由国人binux编写的强大的网络爬虫系统,其GitHub地址为 https://github.com/binux/pyspider 官方文档地址为 http://docs.pyspider.org/

1)基本功能

♢ 提供方便易用的WebUI系统,可视化编写和调试爬虫。

♢ 提供爬取进度监控、爬取结果查看、爬虫项目管理等功能。

♢ 支持多种后端数据库,如MySQL、MongoDB、Redis、SQlite、Elasticsearch、PostgreSQL。

♢ 支持多种消息队列,如RabbitMQ、Beanstalk、Redis、Kombu。

♢ 提供优先级控制、失败重试、定时抓取等功能。

♢ 对接了PhantomJS,可以抓取JavaScript渲染的页面。

♢ 支持单机和分布式部署,支持Docket部署。

适合快速实现一个页面的抓取,开发便捷

2)架构

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

Scheduler发起任务调度,Fetcher负责抓取网页内容,Processer负责解析网页内容,然后将新生成的Request发给Scheduler进行调度,将生成的提取结果输出保存。

pyspider的任务执行流程:

  ♢ 每个pyspider的项目对应一个Python脚本,该脚本中定义了一个Handler类,它有一个on_start()方法。爬取首先调用on_start()方法生成最初的抓取任务,然后发送给Scheduler进行调度。

  ♢ Scheduler将抓取的任务分发给Fetcher进行抓取,Fetcher执行并得到响应,随后将响应发送给Pocesser。

  ♢ Pocesser处理响应并提取出新的URL生成新的抓取任务,然后通过消息队列的方式通知Scheduler当前抓取任务执行情况,并且新生成的住区任务发送给Scheduler。如果生成了新的提取结果,则将其发送到结果队列等待Result Worker处理。

  ♢ Scheduler接收到新的抓取任务,然后查询数据库,判断其如果是新的抓取任务或者需要重试的任务就继续进行调度,然后将其发送回Fetcher进行抓取。

  ♢ 不断重复以上工作,直到所有的任务都执行完毕,抓取结束。

  ♢ 抓取结束后,程序会回调on_finished()方法,这里可以定义后处理过程。

2.基本使用

命令行中输入 pyspider 开启服务

默认开启地址为http://localhost:5000

创建项目,点击create按钮

编辑与调试页面

左侧为代码调试页面,点击左侧右上角的run单步调试爬虫程序,在左侧下半部分可以玉兰当前的爬取页面。右侧为代码编辑页面,可以直接编辑代码和保存代码

from pyspider.libs.base_handler import *

class Handler(BaseHandler):
crawl_config = {
} @every(minutes=24 * 60)
def on_start(self):
self.crawl('https://docs.python.org/zh-cn/3/library/index.html', 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(),
}
创建项目即会生成

Handler就是pyspider爬虫的主类,定义爬取、解析、储存等逻辑。

crawl_config为爬取配置的定义

on_start()方法是爬取入口,出师的爬取请求会在这里生成,该方法通过调用crawl()方法即可新建一个爬取请求,crawl()方法还有存在回调函数callback,制定了这个页面爬取成功后用哪个方法进行解析

index_page()接收Response参数,Response对接了pyquery。可以直接调用doc()方法传入相应的css选择器,再次调用了crawl()方法生成了新的爬取请求,同时再指定了callback为detail_page。

detail_page()同样接收Response作为参数,抓取的是详情页的信息,只对Response对象做解析,将结果以字典形式返回。

3.注意事项

pyspider默认发送HTTP请求,网页中存在的图片等如果是由JavaScript产生,需要将index_page()中生成抓取详情页的请求方法添加一个参数fecth_type=‘js’,那么就会获取JS产物

4.命令行

http://docs.pyspider.org/en/latest/Command-Line/

5.crawl()方法

url                          要抓取的网址或者网址列表
callback 确定解析函数
age 任务的有效期
priority 爬取的优先级
exetime 设置定时任务
retries 定义重试次数
itag 设置判定网页是否发生变化的节点值
auto_recrawl 开启后,爬取任务在过期之后会重新执行,循环时间为age
method 请求方式
params GET请求数据
data POST请求数据
files 上传的文件
user_agent User-Agent
headers 请求头
cookies Cookies
connect_timeout 初始化连接时的最长等待时间
timeout 抓取网页时的最长等待时间
allow_redirects 确定是否自动处理重定向
validate_cert 确定是否验证证书
proxy 代理
fetch-type 开启PhantomJS
js_script 页面加载完毕后执行的js脚本
js_run_at js脚本运行的位置,是在页面节点开头还是结尾,默认是结尾
js_viewport_width/js_viewport_height js渲染时的窗口大小
load_images 加载js页面时确定是否加载图片
save 在不同的方法之间传递参数
cancel 取消任务
force_update 强制更新状
from pyspider.libs.base_handler import *

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,fetch_type='js')
next = response.doc(".next").attr.href
self.crawl(next, callback=self.index_page) @config(priority=2)
def detail_page(self, response):
return {
"url": response.url,
"title": response.doc('title').text(),
"date": response.doc(".when .data").text(),
"day": response.doc(".howlong .data").text(),
"who": response.doc(".head").text(),
"text": response.doc("#b_panel_schedule").text(),
"image":response.doc(".cover_img").attr.src
}

例子:爬取去哪儿网

爬虫之pyspider的更多相关文章

  1. Python的两个爬虫框架PySpider与Scrapy安装

    Python的两个爬虫框架PySpider与Scrapy安装 win10安装pyspider: 最好以管理员身份运行CMD,不然可能会出现拒绝访问文件夹的情况! pyspider:pip instal ...

  2. Python爬虫之PySpider框架

    概述 pyspider 是一个支持任务监控.项目管理.多种数据库,具有 WebUI 的爬虫框架,它采用 Python 语言编写,分布式架构.详细特性如下: 拥有 Web 脚本编辑界面,任务监控器,项目 ...

  3. [转]Python爬虫框架--pyspider初体验

    标签: python爬虫pyspider 2015-09-05 10:57 9752人阅读 评论(0) 收藏 举报  分类: Python(8)  版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  4. 我们的爬虫从pyspider开始说起(一)

    看各种爬虫文献也有好几天了,总是感觉下不了手,总结一句“提笔忘字,总是因为看的太多而写的太少”.所以从现在开始,把看到的想到的,需要总结的东西慢慢的都沉淀下来,扎扎实实的走好每一步. 先来说这几天遇到 ...

  5. 爬虫框架pyspider的使用

    j概要:了解了爬虫的基础知识后,接下来我们来使用框架来写爬虫,用框架会使我们写爬虫更加简单,接下来我们来了解一下,pyspider框架的使用,了解了该框架,妈妈再也不用担心我们的学习了. 前期准备: ...

  6. Python爬虫之一 PySpider 抓取淘宝MM的个人信息和图片

    ySpider 是一个非常方便并且功能强大的爬虫框架,支持多线程爬取.JS动态解析,提供了可操作界面.出错重试.定时爬取等等的功能,使用非常人性化. 本篇通过做一个PySpider 项目,来理解 Py ...

  7. Python爬虫框架--pyspider初体验

    之前接触scrapy本来是想也许scrapy能够让我的爬虫更快,但是也许是我没有掌握scrapy的要领,所以爬虫运行起来并没有我想象的那么快,看这篇文章就是之前使用scrapy的写得爬虫.然后昨天我又 ...

  8. 爬虫之pyspider 安装

    解决方法: 利用wheel安装 S1: pip install wheelS2: 进入www.lfd.uci.edu/~gohlke/pythonlibs/,Ctrl + F查找pycurl S3:这 ...

  9. python爬虫框架Pyspider初次接触

    pyspider网站地址:http://docs.pyspider.org/en/latest/.文档比较好,安装起来也非常方便.既然是基于python的框架,那么首先得安装python.微软出的一款 ...

随机推荐

  1. jquery 获取name一样的值

    $("input[name=test]").map(function(){return this.value;}).get().join(",")

  2. IO队列深度max_queue_depth对系统性能的影响

    前段时间,发生了一个问题引起了我对IO队列深度的研究. 存储服务器中linux kernel的mpt2sas驱动模块,将max_queue_depth设置为1024时,引起系统加载驱动时卡死,而调整为 ...

  3. 交互课件用什么软件------承接教育类k12/幼儿html5交互课件/动画外包

    flash交互课件能生动表达教学内容,也深受广大教育工作者的喜爱,但是目前flash课件只能在pc电脑平台上进行展示,随着移动网络的发展,Adobe宣布2020年停止对flash更新和维护,越来越多的 ...

  4. mysql主从原理及配置

    一.mysql集群架构: 1.一主一从 2.双主 3.一主多从(扩展mysql的读性能) 4.多主一从(5.7开始支持) 5.联机复制 关系图: 二.配置主从用途及条件 2.1用途 1.保障可用性,故 ...

  5. centos7远程安装oracle11g R2详细教程-解决一切问题

    相关链接与资源: sqldevelper(各种操作系统的oracle客户端) http://www.oracle.com/technetwork/cn/developer-tools/sql-deve ...

  6. Azure CosmosDB (13) CosmosDB数据建模

    <Windows Azure Platform 系列文章目录> 我们在使用NoSQL的时候,如Azure Cosmos DB,可以非常快速的查询非结构化,或半结构化的数据.我们需要花一些时 ...

  7. win10 家庭版 升级 win10企业版

    更改秘钥 我的电脑(右键)->属性-> 更改产品秘钥 -> 96YNV-9X4RP-2YYKB-RMQH4-6Q72D->重启系统 如果秘钥过期了,就百度按时间搜索,总有一个是 ...

  8. 【java】之算法复杂度o(1), o(n), o(logn), o(nlogn)

    在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: 这是算法的时空复杂度的表示.不仅仅用于表示时间复杂 ...

  9. (引用)!Unicode,GBK以及UTF8的联系和区别

    在实现单片机显示汉字的操作时,了解到有关汉字编码的相关概念. Unicode是一种字符集,该字符集可以涵盖世界上所有的语言.最常见的字符集是ASC II-0~127(0x00~0x7f).Unicod ...

  10. MFC如何添加背景图片

    1.在xxDlg.h中定义CBrush m_brush 2.在对话框的消息响应中添加一个ON_WM_CTLCOLOR消息响应 3.添加背景图(方法前一篇随笔有讲到) 4.OnCtlColor消息响应函 ...