当前位置: 首页 > news >正文

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

相关文章:

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

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

CubeMap convert into Octahedral思路

看了一些介绍,大多都是如何采样Octahedral的,那么如何把cubemap转成为这个呢 首先,我们想想 Vec4 Sample(Vec3 direction) { // Some logicwait wait wait think about what weve got here UV UV UV! return SampleTexture(Image, UV); }这个…...

vue项目实战-脑图编辑管理系统kitymind百度脑图

前言 项目为前端vue项目,把kitymind百度脑图整合到前端vue项目中,显示了脑图的绘制,编辑,到处为json,png,text等格式的功能 文章末尾有相关的代码链接,代码只包含前端项目,在原始的…...

c++调用ffmpeg api录屏 并进行rtmp推流

代码及工程见https://download.csdn.net/download/daqinzl/88156528 开发工具:visual studio 2019 记得启动rtmp流媒体服务 nginx的rtmp服务见https://download.csdn.net/download/daqinzl/20478812 播放,采用ffmpeg工具集里的ffplay.exe, 执行命令 f…...

SQL分类及通用语法数据类型(超详细版)

一、SQL分类 SQL是结构化查询语言(Structured Query Language)的缩写。它是一种用于管理和操作关系型数据库系统的标准化语言。SQL分类如下: DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)DML:…...

配置Hive远程服务详细步骤

HiveServer2支持多客户端的并发和认证&#xff0c;为开放API客户端如JDBC、ODBC提供了更好的支持。 &#xff08;1&#xff09;修改hive-site.xml&#xff0c;在文件中添加以下内容&#xff1a; <property><name>hive.metastore.event.db.notification.api.auth&l…...

Java中实现图片和Base64的互相转化

文章目录 前言一、代码二、测试三、结果 前言 公司项目中用到了实名认证此&#xff0c;采用的第三方平台。后端中用到的单项功能为身份证信息人像对比功能&#xff0c;在写demo的过程中发现&#xff0c;它们所要求的图片信息为base64编码格式。 一、代码 package com.bajiao…...

视频添加字幕

1、依靠ffmpeg 命令 package zimu;import java.io.IOException;public class TestSrt {public static void main(String[] args) {String videoFile "/test/test1.mp4";String subtitleFile "/test/test1.SRT";String outputFile "/test/testout13…...

Vue VS React:两大前端框架的对比与分析

Vue和React是当前最流行的前端框架之一&#xff0c;它们都有着广泛的应用和开发者社区。下面是Vue和React之间的深度对比与分析&#xff1a; 学习曲线&#xff1a; Vue&#xff1a;Vue拥有简单直观的API和文档&#xff0c;对初学者友好。Vue的设计初衷是逐步增强的&#xff0c;…...

【机密计算标准解读】 基于TEE的安全计算(IEEE 2952)

目录 1.概述2.定义、术语、缩略语3.技术框架3.1 架构框架3.2 分层功能4.基础组件4.1 基础层4.2 平台层4.3 应用层4.4 服务层4.5 交叉层5.安全计算参考过程6.技术和安全要求6.1 隔离要求6.2 互操作要求6.3 性能要求6.4 可用性要求6.5 数据安全要求6.6 密码学要求 1. 概述 随着…...

程序员编写文档的 10 个技巧

编写好的文档在软件开发领域具有重大意义。文档是概述特定问题陈述、方法、功能、工作流程、架构、挑战和开发过程的书面数据或指令。文档可以让你全面了解解决方案的功能、安装和配置。 文档不仅是为其他人编写的&#xff0c;也是为自己编写的。它让我们自己知道我们以前做过什…...

【ES问题总结】

文章目录 1、什么是ElasticSearch;2、ElasticSearch的基本概念&#xff1b;3、什么是倒排索引&#xff1b;4、DocValue的作用&#xff1b;5、text和keyword类型的区别&#xff1b;7、query和filter的区别&#xff1b;8、es写数据的过程&#xff1b;9、es的更新和删除流程&#…...

数据结构----结构--线性结构--顺序存储--数组

数据结构----结构–线性结构–顺序存储–数组 数组&#xff1a;类型相同&#xff0c;空间连续&#xff0c;长度固定 搜索&#xff1a; &#xff08;1&#xff09;基于索引搜索&#xff0c;时间复杂度O(1) &#xff08;2&#xff09;基于数值搜索&#xff1a; ​ 1.有序的&…...

docker 启动kitex 的opentelemetry

https://github.com/cloudwego/kitex-examples/blob/main/opentelemetry/docker-compose.yaml 下载两个yaml文件&#xff1a;docker-compose.yaml otel-collector-config.yaml 在该目录下执行 docker-compose up -d...

Excel中——日期列后添加星期

需求&#xff1a;在日期列中添加星期几&#xff1f; 第一步&#xff1a;打开需要添加星期的Excel文件&#xff0c;在日期后面添加日期 第二步&#xff1a;选择日期列&#xff0c;点击鼠标右键&#xff0c;在下拉列表中&#xff0c;选择“设置单元格格式” 第三步&#xff1a; 在…...

谈谈DNS是什么?它的作用以及工作流程

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、DNS是什么&#xff1f; 二、DNS的作用 三、DNS查询流程 1、查看浏览器缓存 2、查看系统缓存 3、查看路由器缓存 4、查看ISP …...

Qt小项目贪吃蛇实线,主要掌握定时器、信号与槽、按键事件、绘制事件、坐标运算、随机数生成等

Qt小项目贪吃蛇实线&#xff0c;主要掌握定时器、信号与槽、按键事件、绘制事件、坐标运算、随机数生成等 Qt 贪吃蛇演示QWidget 绘制界面项目源文件 注释清晰widget.hwidget.cpp 拓展QTimerQKeyEventQRectFQPointFQPainterQIcon Qt 贪吃蛇演示 QWidget 绘制界面 项目源文件 注…...

使用HTTP隧道时如何应对目标网站的反爬虫监测?

在进行网络抓取时&#xff0c;我们常常会遇到目标网站对反爬虫的监测和封禁。为了规避这些风险&#xff0c;使用代理IP成为一种常见的方法。然而&#xff0c;如何应对目标网站的反爬虫监测&#xff0c;既能保证数据的稳定性&#xff0c;又能确保抓取过程的安全性呢&#xff1f;…...

怎么样通过Bootstrap已经编译好(压缩好)的源码去查看符合阅读习惯的源码【通过Source Map(源映射)文件实现】

阅读本篇博文前&#xff0c;建议大家先看看下面这篇博文&#xff1a; https://blog.csdn.net/wenhao_ir/article/details/132089650 Bootstrap经编译(压缩)后的源码百度网盘下载地址&#xff1a; https://pan.baidu.com/s/14BM9gpC3K-LKxhyLGh4J9Q?pwdm02m Bootstrap未经编译…...

【排序算法】python之冒泡,选择,插入,快速,归并

参考资料&#xff1a; 《Python实现5大排序算法》《六大排序算法&#xff1a;插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序》 --代码似乎是C语言 ———————— 本文介绍5种常见的排序算法和基于Python实现&#xff1a; 冒泡排序&#xff08;Bubble Sort&am…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...