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

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

本文需要用到上文提到的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-deploy

Packing 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 Response


class 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.html

import scrapy


class 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 json

import scrapy
from scrapy.http import Response

from web_spiders.items import WebSpidersItem


class 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爬虫githubdocs
scrapyd-client部署scrapy爬虫github
spider-admin-pro调度scrapy爬虫github
scrapy-util收集爬虫运行结果github
gunicorn执行spider-admin-pro应用docs
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python爬虫Scrapy项目入门是一个非常好的学习资源,它可以帮助初学者快速入门Scrapy框架,掌握爬虫的基本原理和技巧。在学习过程中,我们需要掌握Scrapy的基本组成部分,如Spider、Item、Pipeline等,同时还需要了解如何使用XPath和CSS选择器来解析网页内容。此外,我们还需要学习如何使用Scrapy的中间件来处理请求和响应,以及如何使用Scrapy的调度器来管理爬虫任务。总之,Python爬虫Scrapy项目入门是一个非常实用的学习资源,可以帮助我们快速掌握Scrapy框架的基本知识和技能。 ### 回答2: Python爬虫是一种程序,可以自动化地从互联网上抓取数据,并将其保存到本地或者数据库中。它主要是用于处理一些大量数据的项目,例如搜索引擎、在线商店等等。 Scrapy是一个Python爬虫框架,提供了强大的数据提取和处理工具。Scrapy是用Python编写的,因此可以利用Python编程语言提供的强大功能,从而轻松地编写和维护大规模的网络爬虫项目。 下面是Python爬虫Scrapy项目入门的基本步骤: 1. 安装Scrapy 在安装Scrapy之前,需要先安装Python,然后使用以下命令安装Scrapy: pip install scrapy 2. 创建一个新的Scrapy项目 使用以下命令创建一个新的Scrapy项目scrapy startproject project_name 3. 编写爬虫程序 进入新创建的项目目录,使用以下命令创建一个新的spider爬虫): scrapy genspider spider_name website_name 然后针对所爬取的页面编写爬虫程序。该程序需要指定爬取的起始URL,以及如何爬取和处理数据。 4. 运行爬虫程序 使用以下命令运行爬虫程序: scrapy crawl spider_name 可以在命令行中查看程序输出信息以及收集到的数据。 5. 存储数据 通过编写pipeline来将所爬取的数据存储到本地文件或数据库中。pipeline也可以用于对数据进行清洗、去重等处理。 6. 优化项目 可以通过调整Scrapy的配置来优化项目。例如设置User-Agent、延迟请求等,防止被目标网站识别出是爬虫,并被封禁。 通过以上步骤,可以轻松地入门Python爬虫Scrapy项目,并编写自己的爬虫程序,收集所需的数据。Scrapy提供了很多丰富的功能和工具,使得爬虫开发更加简单、高效。 ### 回答3: ScrapyPython下用于数据挖掘和数据爬取的一个开源框架,其崇尚规范的设计和高效的性能,使得开发者可以更加快捷、高效、可靠地获取大量数据。 在使用Scrapy进行爬虫项目入门时,首先需要安装Scrapy和依赖的库。在安装好Scrapy后,我们可以通过命令行工具开始新建一个爬虫项目,在新建的项目中,我们可以构建爬虫的main流程,包括Scrapy框架的各个模块以及管道和中间件。 然后我们需要编写爬虫规则,制定爬虫的起始URL、要爬取的数据、数据的处理方法等等。此外,如果需要登录、翻页等高级功能的话,我们还需要对爬虫规则进行扩展和调整。 编写好爬虫规则后,我们可以通过Scrapy提供的各种调试工具进行调试,在确定爬虫的工作正常后,我们可以通过配置Scrapy中间件和管道,将爬取到的数据进行清洗、处理和存储。 总体来说,Scrapy是一个强大的数据爬取工具,它简化了数据爬取过程中各种繁琐的操作,让开发者可以专注于爬取和处理数据本身。而对于初学者来说,要掌握Scrapy使用,需要多动手实践,积极与开发者社区互动和交流,逐步提高对Scrapy框架的理解和应用水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值