Python3 爬虫学习笔记第十七章 —— 【爬虫框架 pyspider — 基本使用】

文章目录

  • 【17.1】初识 pyspider
  • 【17.2】使用 pyspider
    • 【17.2.1】主界面
    • 【17.2.2】项目界面
  • 【17.3】使用 pyspider 爬取去哪儿网
    • 【17.3.1】爬取首页
    • 【17.3.2】信息匹配
    • 【17.3.3】抓取下一页数据
    • 【17.3.4】抓取JS渲染数据
    • 【17.3.5】抓取所有数据
    • 【17.3.6】启动爬虫项目

【17.1】初识 pyspider

pyspider 是由国人 Binux 编写的一个 Python 爬虫框架

  • GitHub:https://github.com/binux/pyspider
  • 官方文档(英文):http://docs.pyspider.org/
  • 非官方文档(中文):http://book.crifan.com/books/python_spider_pyspider/website/
  • 非官方文档(中文):https://www.cntofu.com/book/156/index.md

pyspider 特性:

  • python 脚本控制,可以使用任何 html 解析包(内置 pyquery)
  • WEB 界面编写调试脚本,起停脚本,监控执行状态,查看活动历史,获取结果产出
  • 支持 MySQL、MongoDB、Redis、SQLite、Elasticsearch、PostgreSQL
  • 对接了 PhantomJS,支持抓取 JavaScript 的页面
  • 组件可替换,支持单机和分布式部署,支持 Docker 部署
  • 提供优先级控制、失败重试、定时抓取等功能

Windows 系统安装 pyspider:

使用命令 pip install pyspider 安装,若报 PyCurl 相关错误,可访问 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl 下载对应 wheel 文件并使用命令 pip install whl文件名 安装即可

如果要爬取 JavaScrip 渲染的页面,还要下载 PhantomJS,并将 PhantomJS 的路径配置到环境变量里,或者直接复制到 Python 安装目录的 Scripts 文件夹,需要用到数据库储存的话,同样要安装好相应的数据库

准备就绪后,使用 pyspider all 命令可启动 pyspider,浏览器打开:http://localhost:5000/ 可以看到 pyspider 的 WebUI 管理界面


【17.2】使用 pyspider


【17.2.1】主界面

当成功创建了一个爬虫项目后,主界面如下所示:

  • Recent Active Tasks:查看最近活动的任务,会跳转到一个页面有列表显示

  • Create:创建一个新的爬虫项目

  • group:定义项目的分组,以方便管理,若 group 设置为 delete,则该项目将会在24小时之后删除

  • project name:爬虫项目名称

  • status:项目状态,各状态如下:
    TODO:一个爬虫项目刚刚创建时的状态,此状态下可以编辑 Python 代码
    STOP:中止项目的运行
    CHECKING:当一个运行中的项目被编辑时项目状态会被自动设置成此状态并中止运行
    DEBUG:会运行爬虫,顾名思义找 BUG,一般来说用于调试阶段
    RUNNING:运行爬虫项目
    PAUSED:当爬取过程中出现连续多次错误时,项目会自动设置为 PAUSE 状态,并等待一定时间后继续爬取,中途突然断网也会自动设置为此状态

  • rate/burst:当前的爬取速率,rate 代表 1 秒发出多少个请求,burst 相当于流量控制中的令牌桶算法的令牌数,rate 和 burst 设置的越大,爬取速率越快,速率的设定需要考虑本机性能和爬取过快被封的问题

  • avg time:任务平均时间

  • process:5m、1h、1d 分别指的是最近 5 分、1 小时、1 天内的请求情况,all 代表所有的请求情况,请求由不同颜色表示,蓝色的代表等待被执行的请求,绿色的代表成功的请求,黄色的代表请求失败后等待重试的请求,红色的代表失败次数过多而被忽略的请求

  • actions:对爬虫项目的操作,各操作如下:
    Run:立即执行任务,需要 status 为 RUNNING 或者 DEBUG 状态;假如在配置的调度执行时间内已经执行过,再点 run 是无效的,需要删除 task.db 里的数据才行
    Active Tasks:查看当前爬虫项目的活动任务
    Results:查看项目运行结果


【17.2.2】项目界面

创建一个爬虫项目,界面如下所示:

  • 创建项目:点击 Create 即可新建一个爬虫项目
  • Project Name:爬虫项目名称
  • Start URL(s) :爬虫入口地址,选填,可在项目中更改

项目创建完成进入调试界面:

  • 调试界面右边:编写代码的区域

  • 调试界面左边:调试的区域,用于执行代码,显示输出信息等用途

  • run:单步调试爬虫程序,点击就可运行当前任务

  • < > 箭头:上一步、下一步,用于调试过程中切换到上一步骤或者下一步骤

  • save:保存当前代码,当代码变更后只有保存了再运行才能得到最新结果

  • enable css selector helper: CSS 选择器辅助程序

  • web:页面预览

  • html:可以查看页面源代码

  • follows:表示爬取请求,点击可查看所有的请求

在新建一个爬虫项目的时候,pyspider 已经自动生成了如下代码:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2019-09-17 21:18:13
# Project: 2from pyspider.libs.base_handler import *class Handler(BaseHandler):crawl_config = {}@every(minutes=24 * 60)def on_start(self):self.crawl('__START_URL__', 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(),}
  • class Handler():pyspider 爬虫的主类,可以在此处定义爬取、解析、存储的逻辑。整个爬虫的功能只需要一个 Handler 即可完成

  • crawl_config 属性:项目的所有爬取配置将会统一定义到这里,如定义 headers、设置代理等,配置之后全局生效

  • on_start() 方法:爬取入口,初始的爬取请求会在这里产生,该方法通过调用 crawl() 方法即可新建一个爬取请求,第一个参数是爬取的 URL,另一个参数 callback 指定了这个页面爬取成功后用哪个方法进行解析,默认指定为 index_page() 方法,即如果这个 URL 对应的页面爬取成功了,那 Response 将交给 index_page() 方法解析

  • index_page() 方法:接收 Response 参数,Response 对接了 pyquery。直接调用 doc() 方法传入相应的 CSS 选择器,就可以像 pyquery 一样解析此页面,代码中默认是 a[href^="http"],即解析页面的所有链接,然后将链接遍历,再次调用了 crawl() 方法生成了新的爬取请求,同时再指定了 callback 为 detail_page,表示这些页面爬取成功了就调用 detail_page() 方法解析。index_page() 实现了两个功能,一是将爬取的结果进行解析,二是生成新的爬取请求

  • detail_page() 方法:同样接收 Response 作为参数。detail_page() 抓取的就是详情页的信息,就不会生成新的请求,只对 Response 对象做解析,解析之后将结果以字典的形式返回。当然也可以进行后续处理,如将结果保存到数据库等操作

PS:pyspider 默认的 web 预览页面窗口较小,可以找到 pyspider 文件夹有个 debug.min.css 文件(如:E:\Python\Lib\site-packages\pyspider\webui\static\debug.min.css),搜索 iframe,将原样式:iframe{border-width:0;width:100%} 改为 iframe{border-width:0;width:100%;height:400px !important} 即可,清除浏览器缓存后就会生效!


【17.3】使用 pyspider 爬取去哪儿网

爬取地址:http://travel.qunar.com/travelbook/list.htm
爬取目标:去哪儿网旅游攻略,发帖作者、标题、正文等


【17.3.1】爬取首页

创建一个名为 qunar 的爬虫项目,Start URL 设置为 http://travel.qunar.com/travelbook/list.htm ,点击 run 出现一个爬取请求

左边调试区域出现以下代码:

{"process": {"callback": "on_start"},"project": "qunar","taskid": "data:,on_start","url": "data:,on_start"
}

callback 为 on_start,表示此时执行了 on_start() 方法。在 on_start() 方法中,利用 crawl() 方法即可生成一个爬取请求,点击 index_page 链接后面的箭头会出现许多新的爬取请求,即首页所包含的所有链接

此时左边调试区域代码变为:

{"fetch": {},"process": {"callback": "index_page"},"project": "qunar","schedule": {"age": 864000},"taskid": "73a789f99528a2bdc3ab83a13902962a","url": "http://travel.qunar.com/travelbook/list.htm"
}

callback 变为了 index_page,表示此时执行了 index_page() 方法。传入 index_page() 方法的 response 参数为刚才生成的第一个爬取请求的 response 对象,然后调用 doc() 方法,传入提取所有 a 节点的 CSS 选择器,获取 a 节点的属性 href,实现了页面所有链接的提取,随后遍历所有链接,调用 crawl() 方法,把每个链接构造成新的爬取请求,可以看到 follows 新生成了 229 个爬取请求。点击 web 按钮可以直接预览当前页面,点击 html 按钮可以查看此页面源代码


【17.3.2】信息匹配

代码 for each in response.doc('a[href^="http"]').items(): 实现了对整个页面链接的获取,我们需要提取网页的攻略的标题,内容等信息,那么直接替换 doc() 方法里的匹配语句即可,pyspider 提供了非常方便的 CSS 选择器,点击 enable css selector helper 按钮后,选择要匹配的信息并点击,再点击箭头 add to editor 即可得到匹配语句

完成了 CSS 选择器的替换,点击 save 保存,再次点击 run 重新执行 index_page() 方法,可以看到 follows 变为了 10 个,即抓取到了 10 篇攻略


【17.3.3】抓取下一页数据

每一页只有 10 篇攻略,想要爬取所有页面的攻略,必须要得到下一页的数据,优化 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 = response.doc('.next').attr.hrefself.crawl(next, callback=self.index_page)

匹配下一页按钮,获取下一页按钮的 URL 并赋值给 next,将该 URL 传给 crawl() 方法,指定回调函数为 index_page() 方法,这样会再次调用 index_page() 方法,提取下一页的攻略标题


【17.3.4】抓取JS渲染数据

随便点击一个获取到的攻略,预览该页面,可以观察到头图一直在加载中,切换到 html 查看源代码页面,可以观察到没有 img 节点,那么此处就是后期经过 JavaScript 渲染后才出现的

针对 JavaScript 渲染页面,可以通过 PhantomJS 来实现,具体到 pyspider 中,只需要在 index_page()crawl() 抓取方法中添加一个参数 fetch_type 即可:

    @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.hrefself.crawl(next, callback=self.index_page)

保存之后再次运行即可看到正常页面


【17.3.5】抓取所有数据

改写 detail_page() 方法,同样通过 CSS 选择器提取 URL、标题、日期、作者、正文、图片等信息:

    @config(priority=2)def detail_page(self, response):return {'url': response.url,'title': response.doc('#booktitle').text(),'date': response.doc('.when .data').text(),'day': response.doc('.howlong .data').text(),'who': response.doc('.who .data').text(),'text': response.doc('#b_panel_schedule').text(),'image': response.doc('.cover_img').attr.src}

【17.3.6】启动爬虫项目

该爬虫项目完整代码如下:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2019-09-18 09:48:29
# Project: qunarfrom 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.hrefself.crawl(next, callback=self.index_page)@config(priority=2)def detail_page(self, response):return {'url': response.url,'title': response.doc('#booktitle').text(),'date': response.doc('.when .data').text(),'day': response.doc('.howlong .data').text(),'who': response.doc('.who .data').text(),'text': response.doc('#b_panel_schedule').text(),'image': response.doc('.cover_img').attr.src}

保存代码后,回到主界面,将项目 status 修改为 RUNNING ,点击 actions 的 run 按钮即可启动爬虫

点击 Active Tasks,即可查看最近请求的详细状况:

点击 Results,即可查看所有的爬取结果:

另外,右上角还可以选择 JSON、CSV 格式

Python3 爬虫学习笔记 C17【爬虫框架 pyspider — 基本使用】相关推荐

  1. python爬虫学习笔记-网络爬虫的三种数据解析方式

    爬虫的分类 1.通用爬虫:通用爬虫是搜索引擎(Baidu.Google.Yahoo等)"抓取系统"的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份 ...

  2. 从0到1爬虫学习笔记:04Scrapy框架

    文章目录 1 Scrapy概述 1.1 Scrapy架构图 1.2 Scrapy开发步骤 2 入门案例 2.1 学习目标 2.2 新建项目(scrapy startproject) 2.3 明确目标( ...

  3. Python爬虫学习笔记_DAY_23_Python爬虫之bs4解析的基本使用介绍【Python爬虫】

    目录 I.bs4的介绍 II.bs4的安装 III.bs4的基本语法使用 p.s.高产量博主,点个关注

  4. Python爬虫学习笔记_DAY_32_Python爬虫之Excel表的读写【Python爬虫】

    p.s.高产量博主,点个关注

  5. Python爬虫学习笔记_DAY_18_Python爬虫之handler处理器的使用【Python爬虫】

    p.s.高产量博主,点个关注

  6. 爬虫学习笔记1(超级详细)

    文章预览: 爬虫学习笔记 1 爬虫概念 2 爬虫作用 3 爬虫的分类 4 爬虫的流程 http协议复习 爬虫特别关注的请求头和响应头 常见的响应状态码 浏览器运行过程 如何查找数据 requests模 ...

  7. Python3 爬虫学习笔记 C18【爬虫框架 pyspider — 深入理解】

    Python3 爬虫学习笔记第十八章 -- [爬虫框架 pyspider - 深入理解] 文章目录 [18.1]启动参数 [18.2]运行单个组件 [18.2.1]运行 Scheduler [18.2 ...

  8. Python3 爬虫学习笔记 C04 【自动化测试工具 Selenium】

    Python3 爬虫学习笔记第四章 -- [自动化测试工具 Selenium] 文章目录 [4.1]下载驱动 [4.2]声明浏览器对象 [4.3]访问页面 [4.4]启动参数 [4.5]查找节点 [4 ...

  9. 爬虫学习笔记(十)—— Scrapy框架(五):下载中间件、用户/IP代理池、settings文件

    一.下载中间件 下载中间件是一个用来hooks进Scrapy的request/response处理过程的框架. 它是一个轻量级的底层系统,用来全局修改scrapy的request和response. ...

最新文章

  1. JSTL标签库学习笔记
  2. php 比较数组的不同的值,php array_udiff 比较两个数组的键值,并返回差集
  3. 1044 火星数字 PAT乙级 (C++)
  4. android开发基本知识,Android应用开发基本知识点汇总
  5. 热议|上海交大等6所“双一流”明确,博士生毕业,不再要求发表论文!
  6. phpcount数组报错_joomla中的PHP错误警告:count():参数必须是实现Countable的数组或对象-问答-阿里云开发者社区-阿里云...
  7. datetime与timestamp的区别
  8. toast弹窗_弹窗功能解析amp;设计指南 | 为弹窗正名
  9. java编程简单网络_Java网络编程之使用Socket搭建一个简易聊天室
  10. matlabsvd提取特征值_MATLAB中的SVD函数
  11. Java使用Spire.Doc实现Word转换Pdf
  12. 用*输出各种图形(c++版)(正方形,正三角形,倒三角形,菱形)
  13. 信息学奥赛一本通:1147:最高分数的学生姓名
  14. 使用StarUML画类图
  15. 【渝粤题库】广东开放大学Photoshop图像设计 形成性考核
  16. Java concurrent
  17. NoSQL——MongoDB增删改查、备份和恢复
  18. 优视科技招聘linux程序员的题目,UC优视(UC浏览器)软件工程师面试经验
  19. 复数的物理意义是什么?
  20. 【NJUPT】 马克思主义基本原理1/2

热门文章

  1. LeetCode OJ 160. Intersection of Two Linked Lists
  2. Srping MVC入门推荐
  3. Dx11DemoBase 基类(三) 实例应用 【已实现】【附带源码】
  4. 插座上的Linux充电器.不..Marvell Plug Computer
  5. 第二课 决策树与随机森林
  6. Ubuntu Linux 解决 bash ./ 没有那个文件或目录 的方法
  7. 服务器iis自动停止,IIS应用程序池老是自动停止
  8. oracle负数怎么比较大小,输出负数【oracle学习吧】_百度贴吧
  9. python批量转换图片格式_python批量将图片转换为JPEG格式
  10. linux内存管理的主要概念是虚拟内存,你知道linux内存管理基础及方法?