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


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】主界面

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

  • 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】项目界面

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

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

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

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

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

  • 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 出现一个爬取请求
04
左边调试区域出现以下代码:

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

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

{"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 即可得到匹配语句
06
完成了 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 渲染后才出现的
07
针对 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 按钮即可启动爬虫
08
点击 Active Tasks,即可查看最近请求的详细状况:
09
点击 Results,即可查看所有的爬取结果:
10
另外,右上角还可以选择 JSON、CSV 格式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是RPA 现在都有哪些产品

作者&#xff1a;小金同学 链接&#xff1a;https://www.zhihu.com/question/264066539/answer/730946238 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 什么是RPA&#xff1f; 根据机器人流程自动化和人工智能研…

Sharepoint学习笔记—ECM系列—1 Content Type Syndication

我们可以通过Content Type Syndication来实现在Sharepoint Farm内的不同Site Collection之间共享内容类型(Content Types).也就是说&#xff0c;管理员可以为某个元数据服务(Metadata Service)指定一个网站集(Site Collection)来充当Content Type Hub&#xff0c;Content Type …

Python3 爬虫实战 — 猫眼电影TOP100【requests、lxml、Xpath、CSV 】

爬取时间&#xff1a;2019-09-23爬取难度&#xff1a;★☆☆☆☆☆请求链接&#xff1a;https://maoyan.com/board/4爬取目标&#xff1a;猫眼电影 TOP100 的电影名称、排名、主演、上映时间、评分、封面图地址&#xff0c;数据保存为 CSV 文件涉及知识&#xff1a;请求库 requ…

Sharepoint学习笔记—ECM系列--2 管理元数据服务应用Metadata Service Application

这里简单介绍一下Sharepoint2010的元数据服务应用Metadata Service Application的创建&#xff0c;修改和删除&#xff0c;在进行此类操作前&#xff0c;你必须是Sharepoint管理中心管理组的成员&#xff0c;即你有权限进入Sharepoint管理中心进行操作。 一、Metadata Service…

Python3 爬虫实战 — 豆瓣电影TOP250【requests、Xpath、正则表达式、CSV、二进制数据储存】

爬取时间&#xff1a;2019-09-27爬取难度&#xff1a;★★☆☆☆☆请求链接&#xff1a;https://movie.douban.com/top250 以及每部电影详情页爬取目标&#xff1a;爬取榜单上每一部电影详情页的数据&#xff0c;保存为 CSV 文件&#xff1b;下载所有电影海报到本地涉及知识&am…

Sharepoint学习笔记—ECM系列--3 从.CSV文件导入术语集(Term Sets)

Sharepoint2010支持直接从CSV文件导入术语集(Term Sets)&#xff0c;也就是说你可以先直接在Excel中创建和编辑术语集&#xff0c;然后保存为.CSV文件&#xff0c;再通过Sharepoint2010管理中心提供的管理界面导入术语集到指定的Metadata Service下的指定组中,下面我们来看看如…

使用 hexo-git-backup 插件备份你的 Hexo 博客

2022-01-25 更新&#xff1a;博客新地址&#xff1a;https://www.itbob.cn/&#xff0c;文章距上次编辑时间较远&#xff0c;部分内容可能已经过时&#xff01; 欢迎关注我的专栏&#xff1a;《个人博客搭建&#xff1a;HexoGithub Pages》&#xff0c;从搭建到美化一条龙&…

Sharepoint学习笔记—ECM系列--4 根据位置设置的默认元数据值(Location-Based Metadata Defaults)

如果有这样一个需求&#xff1a;客户在一个SharePoint 2010的站点的document library中创建了不同的文件夹FolderA和FolderB&#xff0c;对于上传到此文件夹的文件记录中有某一个列ColumnM,现在他实现当上传文件到不同的文件夹FolderA或FolderB时&#xff0c;列ColumnM使用不同…

Python3 爬虫实战 — 安居客武汉二手房【requests、Beautiful Soup、CSV】

爬取时间&#xff1a;2019-10-09爬取难度&#xff1a;★★☆☆☆☆请求链接&#xff1a;https://wuhan.anjuke.com/sale/爬取目标&#xff1a;爬取武汉二手房每一条售房信息&#xff0c;包含地理位置、价格、面积等&#xff0c;保存为 CSV 文件涉及知识&#xff1a;请求库 requ…

Sharepoint 修改密码

sharepoint安装在服务器上&#xff0c;比如windows 2008 R2(64), 但是在公司里面经常需要修改电脑的密码&#xff0c;电脑的密码一旦改变则相应的sharepoint服务器场密码也需改变&#xff0c;本文介绍修改sharepoint密码的简单方法&#xff0c;不用在命令行输入命令。 step1:打…

Python3 爬虫实战 — 虎扑论坛步行街【requests、Beautiful Soup、MongoDB】

爬取时间&#xff1a;2019-10-12爬取难度&#xff1a;★★☆☆☆☆请求链接&#xff1a;https://bbs.hupu.com/bxj爬取目标&#xff1a;爬取虎扑论坛步行街的帖子&#xff0c;包含主题&#xff0c;作者&#xff0c;发布时间等&#xff0c;数据保存到 MongoDB 数据库涉及知识&am…

Python3 爬虫实战 — 模拟登陆哔哩哔哩【滑动验证码对抗】

登陆时间&#xff1a;2019-10-21实现难度&#xff1a;★★★☆☆☆请求链接&#xff1a;https://passport.bilibili.com/login实现目标&#xff1a;模拟登陆哔哩哔哩&#xff0c;攻克滑动验证码涉及知识&#xff1a;滑动验证码的攻克、自动化测试工具 Selenium 的使用完整代码&…

Python3 爬虫实战 — 模拟登陆12306【点触验证码对抗】

登陆时间&#xff1a;2019-10-21实现难度&#xff1a;★★★☆☆☆请求链接&#xff1a;https://kyfw.12306.cn/otn/resources/login.html实现目标&#xff1a;模拟登陆中国铁路12306&#xff0c;攻克点触验证码涉及知识&#xff1a;点触验证码的攻克、自动化测试工具 Selenium…

SharePoint无代码工作流设计开发实例——交通费报销流程(一)

开发环境&#xff1a; (1)SharePoint Designer 2010 (2)SharePoint Online(Office 365) 关于Office 365和SharePoint Online的相关信息请参见以下链接 http://blog.csdn.net/miragesky2049/article/details/7242982 1、需求分析 组织结构&#xff1a; 用户类型&#xff1a…

Python3 爬虫实战 — 58同城武汉出租房【加密字体对抗】

爬取时间&#xff1a;2019-10-21爬取难度&#xff1a;★★★☆☆☆请求链接&#xff1a;https://wh.58.com/chuzu/爬取目标&#xff1a;58同城武汉出租房的所有信息涉及知识&#xff1a;网站加密字体的攻克、请求库 requests、解析库 Beautiful Soup、数据库 MySQL 的操作完整代…

SharePoint无代码工作流设计开发实例——交通费报销流程(二)

3、InfoPath表单的设计及发布 (1)数据源和页面设计 域&#xff08;元素&#xff09;和域&#xff08;属性&#xff09;如下&#xff1a; 白色为域&#xff08;元素&#xff09;&#xff0c;该类型的字段&#xff0c;发布时&#xff0c;提升成字段后&#xff0c;列表库的数据是…

SharePoint无代码工作流设计开发实例——交通费报销流程(三)

4、SharePoint Designer无代码工作流的设计 开发工具为SharePoint Designer 2010 新建“列表工作流”&#xff0c;绑定“交通费报销单”表单库 设置工作流启动选项“创建项目时自动启动工作流” 编辑工作流 &#xff08;关于以下工作流详细设计可参考http://blog.csdn.net/mi…

SharePoint学习札记[2] — MOSS2007体系结构概述

熟悉微软Office产品线的人都知道&#xff0c;MOSS 2007的上一个版本SPS 2003的全称是 Office Sharepoint Portal Server&#xff0c;在新版本中&#xff0c;微软去掉了Portal一个词。从这个角度很清楚地看到微软对MOSS 2007的定位&#xff0c;是的&#xff0c;MOSS 已经不再仅仅…

SharePoint学习札记[3] — Office SharePoint Server 2007部署

MOSS的第一步就是部署啦!《0ffice SharePoint Server 2007部署图示指南》图文并茂的展示了OSS2007的部署过程。虽然并不难&#xff0c;但对MOSS还摸不清方向的人来说是个不错的指导。手册的作者没有署名&#xff0c;也查不到出自谁手&#xff0c;在这里对他的劳动成果表示感谢…

SharePoint学习札记[4] — 创建SharePoint站点

为减少创建SharePoint站点过程中的麻烦&#xff0c;先打开IIS管理器&#xff0c;将“默认站点”停止或删除。后面的创建过程中&#xff0c;创建向导会自动创建端口为80的网站。 现在将&#xff1a; 1. 创建两个Web应用程序。 2. 创建共享服务。 3. 创建…