Python:Spider爬虫工程化入门到进阶(2)使用Spider Admin Pro管理scrapy爬虫项目

Python:Spider爬虫工程化入门到进阶系列:

  • Python:Spider爬虫工程化入门到进阶(1)创建Scrapy爬虫项目
  • Python:Spider爬虫工程化入门到进阶(2)使用Spider Admin Pro管理scrapy爬虫项目

目录

    • 1、使用scrapyd运行爬虫
    • 2、部署Scrapy爬虫项目
      • 2.1、修改配置文件
      • 2.2、部署项目
    • 3、使用Spider Admin Pro定时执行爬虫
      • 3.1、安装Spider Admin Pro
      • 3.2、添加定时任务
      • 3.3、查看调度日志
    • 4、收集爬虫数据
      • 4.1、返回Item对象
      • 4.2、收集Item数据
    • 5、总结

本文需要用到上文提到的scrapy-project 目录文件,需要提前创建

Python:Spider爬虫工程化入门到进阶(1)创建Scrapy爬虫项目

本文涉及3个文件目录,可以提前创建好

$ tree -L 1
.
├── scrapy-project
├── scrapyd-project
└── spider-admin-project

1、使用scrapyd运行爬虫

scrapyd可以管理scrapy爬虫项目

安装环境准备

# 创建目录,并进入
$ mkdir scrapyd-project && cd scrapyd-project# 创建虚拟环境,并激活
$ python3 -m venv venv && source venv/bin/activate

安装scrapyd

# 安装 scrapyd
$ pip install scrapyd$ scrapyd --version
Scrapyd 1.4.2

启动scrapyd服务

$ scrapyd

浏览器访问:http://127.0.0.1:6800/

在这里插入图片描述

2、部署Scrapy爬虫项目

2.1、修改配置文件

回到爬虫项目目录scrapy-project,修改配置文件 scrapy.cfg

deploy.url的注释去掉,6800 端口就是上面我们启动的scrapyd 端口

# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.io/en/latest/deploy.html[settings]
default = web_spiders.settings[deploy]
# url = http://localhost:6800/
url = http://localhost:6800/
project = web_spiders

2.2、部署项目

安装 scrapyd-client

pip install scrapyd-client

部署项目

$ scrapyd-deployPacking version 1691131715
Deploying to project "web_spiders" in http://localhost:6800/addversion.json
Server response (200):
{"node_name": "bogon", "status": "ok", "project": "web_spiders", "version": "1691131715", "spiders": 1}

看到返回"status": "ok" 就是部署成功

3、使用Spider Admin Pro定时执行爬虫

Spider Admin Pro项目利用了scrapyd提供的api接口实现了一个可视化的爬虫管理平台,便于我们管理和调度爬虫

3.1、安装Spider Admin Pro

此时,我们需要再新建一个目录:spider-admin-project

# 创建目录,并进入
$ mkdir spider-admin-project && cd spider-admin-project# 创建虚拟环境,并激活
$ python3 -m venv venv && source venv/bin/activate

安装 spider-admin-pro

pip3 install spider-admin-pro

启动 spider-admin-pro

gunicorn 'spider_admin_pro.main:app'

浏览器访问:http://127.0.0.1:8000/

默认的

  • 账号 admin
  • 密码 123456

在这里插入图片描述

3.2、添加定时任务

我们点击左边tab栏:定时任务, 添加一个任务

我们的项目只有一个爬虫,默认会选中我们的爬虫名字

cron表达式表示的是每分钟执行一次

全部都是默认的,我们只需要点击确定 即可,因为现在还没有运行,所以日志都是空的,我们需要等待一会

在这里插入图片描述

3.3、查看调度日志

点击左侧tab栏:调度日志,过一会就能看到爬虫项目被执行了,可以在这里查看调度日志
在这里插入图片描述
需要注意的是,我们代码中使用 print 打印的内容,并不会出现在日志文件中

我们修改代码文件,将print修改为self.logger.debug

web_spiders/spiders/wallpaper.py

import scrapy
from scrapy.http import Responseclass WallpaperSpider(scrapy.Spider):name = "wallpaper"allowed_domains = ["mouday.github.io"]# 替换爬虫开始爬取的地址为我们需要的地址# start_urls = ["https://mouday.github.io"]start_urls = ["https://mouday.github.io/wallpaper-database/2023/08/03.json"]# 将类型标注加上,便于我们在IDE中快速编写代码# def parse(self, response):def parse(self, response: Response, **kwargs):# 我们什么也不做,仅打印爬取的文本# 使用 `print` 打印的内容,并不会出现在日志文件中# print(response.text)self.logger.debug(response.text)

重新部署

$ scrapyd-deploy

等待刚刚部署的爬虫运行结束,就可以看到日志了

在这里插入图片描述

4、收集爬虫数据

4.1、返回Item对象

我们的目标网站返回的数据结构如下

{"date":"2023-08-03","headline":"绿松石般的泉水","title":"泽伦西自然保护区,斯洛文尼亚","description":"泽伦西温泉位于意大利、奥地利和斯洛文尼亚三国的交界处,多个泉眼汇集形成了这个清澈的海蓝色湖泊。在这里,游客们可以尽情欣赏大自然色彩瑰丽的调色盘。","image_url":"https://cn.bing.com/th?id=OHR.ZelenciSprings_ZH-CN8022746409_1920x1080.webp","main_text":"泽伦西自然保护区毗邻意大利和奥地利边境,距离斯洛文尼亚的克拉尼斯卡戈拉不到5公里。"
}

所以,根据对应字段建立如下的Item对象

web_spiders/items.py

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass WebSpidersItem(scrapy.Item):# define the fields for your item here like:date = scrapy.Field()headline = scrapy.Field()title = scrapy.Field()description = scrapy.Field()image_url = scrapy.Field()main_text = scrapy.Field()

同时,修改爬虫文件,将数据包装到Item的子类 WebSpidersItem 对象上,并返回

web_spiders/spiders/wallpaper.py

import jsonimport scrapy
from scrapy.http import Responsefrom web_spiders.items import WebSpidersItemclass WallpaperSpider(scrapy.Spider):name = "wallpaper"allowed_domains = ["mouday.github.io"]# 替换爬虫开始爬取的地址为我们需要的地址# start_urls = ["https://mouday.github.io"]start_urls = ["https://mouday.github.io/wallpaper-database/2023/08/03.json"]# 将类型标注加上,便于我们在IDE中快速编写代码# def parse(self, response):def parse(self, response: Response, **kwargs):# 我们什么也不做,仅打印爬取的文本# 使用 `print` 打印的内容,并不会出现在日志文件中# print(response.text)self.logger.debug(response.text)# 使用json反序列化字符串为dict对象data = json.loads(response.text)# 收集我们需要的数据item = WebSpidersItem()item['date'] = data['date']item['headline'] = data['headline']item['title'] = data['title']item['description'] = data['description']item['image_url'] = data['image_url']item['main_text'] = data['main_text']return item

重新部署

$ scrapyd-deploy

可以看到,除了打印的日志外,还多打印了一份数据,这就是我们刚返回的Item对象
在这里插入图片描述

4.2、收集Item数据

我们可以看到,运行状态一列,都是unknown,我们需要知道爬虫的运行状态,是成功还是失败
在这里插入图片描述

scrapy-util 可以帮助我们收集到程序运行的统计数据

返回项目scrapy-project

安装scrapy-util

pip install scrapy-util

修改配置文件 web_spiders/settings.py

将以下配置添加到配置文件中,端口号改为 spider-admin-pro 的实际端口号,这里是8000

# 设置收集运行日志的路径,会以post方式向 spider-admin-pro 提交json数据
# 注意:此处配置仅为示例,请设置为 spider-admin-pro 的真实路径
# 假设,我们的 spider-admin-pro 运行在http://127.0.0.1:8000
STATS_COLLECTION_URL = "http://127.0.0.1:8000/api/statsCollection/addItem"# 启用数据收集扩展
EXTENSIONS = {# ===========================================# 可选:如果收集到的时间是utc时间,可以使用本地时间扩展收集'scrapy.extensions.corestats.CoreStats': None,'scrapy_util.extensions.LocaltimeCoreStats': 0,# ===========================================# 可选,打印程序运行时长'scrapy_util.extensions.ShowDurationExtension': 100,# 启用数据收集扩展'scrapy_util.extensions.StatsCollectorExtension': 100
}

重新部署

$ scrapyd-deploy

我们看到scrapyd的控制台输出了如下信息

ModuleNotFoundError: No module named 'scrapy_util'

说明有问题,因为我们没有给scrapyd的运行环境安装依赖scrapy-util

停掉scrapyd,安装scrapy-util

pip install scrapy-util

安装完毕后,重新启动 scrapyd

让爬虫执行一会,我们就可以看到,调度日志列表多了一些信息,可以看到

  • 运行状态:finished,而不是unknown
  • item数量是1,我们返回了1个item对象
  • error错误时空的,说明程序没有报错
  • 持续时间是1秒,运行时间很短,很快就结束了

在这里插入图片描述

5、总结

本文用到了很多的第三方模块,将这些模块整合进我们的项目能极大提高工作效率

第三方库说明文档资料
scrapy创建工程化的爬虫项目github
scrapyd运行scrapy爬虫github、docs
scrapyd-client部署scrapy爬虫github
spider-admin-pro调度scrapy爬虫github
scrapy-util收集爬虫运行结果github
gunicorn执行spider-admin-pro应用docs

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

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

相关文章

使用Golang实现一套流程可配置,适用于广告、推荐系统的业务性框架——简单应用

在诸如广告、推荐等系统中,我们往往会涉及过滤、召回和排序等过程。随着系统业务变得复杂,代码的耦合和交错会让项目跌入难以维护的深渊。于是模块化设计是复杂系统的必备基础。这篇文章介绍的业务框架脱胎于线上多人协作开发、高并发的竞价广告系统&…

android kernel移植5-RK3568

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1.添加开发板默认配置文件前言 前面我们已经学会了移植uboot,其实就是把瑞芯微的关于uboot的一些文件的名字和编译指定的文件改为自己定义的问价和名字,那么接下来的Android kernel其实也是…

C语言笔记6

关于microsoft visual 的学习笔记 CtrlF5就是启动编译程序 先CtrlA进行全选&#xff0c;然后AitF8就自动的调节代码的格式 #include <stdio.h> #include <stdlib.h> int main() {//system启动程序(在一个程序中启动另外一个程序)//如果程序环境变量中找不到程序&am…

Java自定义校验注解实现List、set集合字段唯一性校验

文章目录 一&#xff1a; 使用场景二&#xff1a; 定义FieldUniqueValid注解2.1 FieldUniqueValid2.2 注解说明2.3 Constraint 注解介绍2.4 FieldUniqueValid注解使用 三&#xff1a;自定义FieldUniqueValidator校验类3.1 实现ConstraintValidator3.2 重写initialize方法3.3 重…

STM32(HAL)多串口进行重定向(printf函数发送数据)

目录 1、简介 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 串口外设配置 2.3 项目生成 3、KEIL端程序整合 4、效果测试 1、简介 在HAL库中&#xff0c;常用的printf函数是无法使用的。本文通过重映射实现在HAL库多个串口可进行类似printf函数的操作。 2.1 基础配置 2.…

【c++】VSCode配置 c++ 环境(重新制作)

上一篇帖子【c】VSCode配置 c 环境&#xff08;小白教程&#xff09;_vscode配置c/c环境_StudyWinter的博客-CSDN博客 大火&#xff0c;但是依旧有很多小伙伴反应没有配好环境&#xff0c;今天打算重新写一个教程&#xff0c;希望对大家有帮助。 1 MinGW下载安装 在CSDN上传了…

实现邮箱管理之gmail邮箱、office365(Azure)邮箱之披荆斩棘问题一览

要进行Office365邮箱的授权对接&#xff0c;你需要先申请一个应用&#xff0c;并获取授权访问令牌。 以下是一个简单的步骤&#xff1a; 登录 Azure 门户&#xff1a;https://portal.azure.com/创建一个新的应用程序&#xff0c;或者使用现有的应用程序。要创建新的应用程序&…

React Native从文本内容尾部截取显示省略号

<Textstyle{styles.mMeNickname}ellipsizeMode"tail"numberOfLines{1}>{userInfo.nickname}</Text> 参考链接&#xff1a; https://www.reactnative.cn/docs/text#ellipsizemode https://chat.xutongbao.top/

【ASP.NET MVC】使用动软(一)(9)

一、解决的问题 前文为解决数据库操作设计的 TestMysql 类&#xff0c;仅简单地封装了一个Query函数&#xff0c;代码如下&#xff1a; public class TestMysql{public static string SqlserverConnectStr "server127.0.0.1;charsetutf8;user idroot;persistsecurityin…

数据库数据恢复-Oracle数据库文件出现坏块的数据恢复案例

Oracle数据库故障&初检&分析&#xff1a; 打开Oracle数据库时报错&#xff0c;报错信息&#xff1a;“system01.dbf需要更多的恢复来保持一致性&#xff0c;数据库无法打开”。用户急需恢复zxfg用户下的数据。 出现上述报错的可能原因包括&#xff1a;控制文件损坏、数…

C高级--day3(shell中的输入、命令置换符、数组、算数运算、分支结构)

#!/bin/bash pls ~/ -l | grep "^-" | wc -l qls ~/ -l | grep "^d" | wc -l echo "普通文件个数&#xff1a;$p" echo "目录文件个数&#xff1a;$q"#!/bin/bash read file posexpr index $file \. strexpr substr $file $((pos1)) 2…

视频是如何做成gif动图的?1分钟快速转gif动画

常见的电影、电视剧等视频体积较大不易于传输和保存。为了方便大家使用可以将视频制作成GIF&#xff0c;可直接发送给对方非常的方便。那么&#xff0c;要怎么将视频转换成gif动画呢&#xff1f;很简单&#xff0c;使用专业的gif图片在线制作工具–GIF中文网&#xff0c;无需下…

企业电子招投标采购系统java spring cloud+spring boot功能模块功能描述+数字化采购管理 采购招投标

​功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外…

【IDEA】常用插件清单

【IDEA】常用插件清单 arthas ideaCodeium: AI Autocomplete for xxxCommit-MessageGenerateAllSetterMaven HelperMybatisPlusOne Dark themePDF ViewerRainbow BracketsRestfulToolSequenceDiagramSonarLintTranslation arthas idea 快捷生成arthas命令 Codeium: AI Autoc…

微信云托管(本地调试)⑥:nginx、vue刷新404问题

一、nginx默认路径 1.1、默认配置文件路径&#xff1a;/etc/nginx/nginx.conf 1.2、默认资源路径&#xff1a;/usr/share/nginx/html/index.html 二、修改nginx.conf配置 &#xff08;注意配置中的&#xff1a;include /etc/nginx/conf.d/*.conf; 里面包了一个server配置文件…

【flink】开启savepoint

先启动一个任务 flink run -c com.yang.flink.CDCJob test-cdc.jar开启savepoint 命令&#xff1a; flink savepoint JobID 文件地址 flink savepoint e929a11d79bdc5e6f140f2cfb92e1335 file:///workspace/flinkSavepoints/backend这样就开启好了 操作中的错误 详细信…

Day10-作业(SpringBootWeb案例)

作业1&#xff1a;完成课上预留给大家自己完成的功能 【部门管理的修改功能】 注意&#xff1a; 部门管理的修改功能&#xff0c;需要开发两个接口&#xff1a; 先开发根据ID查询部门信息的接口&#xff0c;该接口用户查询数据并展示 。(一定一定先做这个功能) 再开发根据ID…

【websocket - Tornado】简易聊天应用

1、背景 项目测试的过程中需要自己搭建一个webscoket站点,确保此类服务接入后台系统后访问不受影响。python的服务框架常用的有Flask、Django、Tornado,每个框架的侧重点不同,导致使用的场景就会有所差异。 Flask轻量级,采用常规的同步编程方式,需要安装其他模块辅助,主…

逆向时如何找到MingGW(GNU)编译程序的main函数

编译器是MingGW生成的可执行文件的显著特点是, 最终运行ZwContinue后程序就莫名其妙启动了, 也找不到main函数。 为了探究里面究竟怎么回事, 我找到了wrk-v1.2的源码, 其中包含了ZwContinue的实现, 首先先看一下注释, API界面包含了2个参数, 其中让人感兴趣的是PCONTEXT, 这是…

【MySQL】仓储--维护出入库流水、库存,去重数量逻辑修正

系列文章 C#底层库–MySQLBuilder脚本构建类&#xff08;select、insert、update、in、带条件的SQL自动生成&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类&#xff08;推荐阅读&#xff0…