10.7 pyspider 库入门


文章目录

  • 前言
  • [一、 概述](#一、 概述)
    • [1.1 Pyspider 特点](#1.1 Pyspider 特点)
    • [1.2 Pyspider 主要由以下模块组成:](#1.2 Pyspider 主要由以下模块组成:)
  • [二、 Pyspider 与 Scrapy 对比](#二、 Pyspider 与 Scrapy 对比)
  • [三、 安装指南](#三、 安装指南)
    • [3.1 直接安装](#3.1 直接安装)
    • [3.2 Wheel 安装(推荐用于 Windows)](#3.2 Wheel 安装(推荐用于 Windows))
  • [四、 快速入门](#四、 快速入门)
    • [4.1 创建项目](#4.1 创建项目)
    • [4.2 编写爬虫](#4.2 编写爬虫)
    • [4.3 数据存储(MySQL)](#4.3 数据存储(MySQL))

前言

本文介绍了Python爬虫框架Pyspider的特点、安装与使用方法。Pyspider是一款支持分布式架构的爬虫框架,提供WebUI界面、多数据库支持和JavaScript页面抓取功能。与Scrapy相比,Pyspider更便捷但扩展性较弱。文章详细说明了Windows和通用安装方法,并通过二手房爬取示例展示了项目创建、页面解析和MySQL数据存储的全流程。最后提供了完整的代码实现,帮助用户快速上手使用Pyspider进行数据采集。


一、 概述

1.1 Pyspider 特点

Pyspider 是一款采用 Python 编写、支持分布式架构的爬虫框架,具备任务监控、项目管理、多数据库支持以及 WebUI 界面。其主要特点包括:

  1. 提供 Web 脚本编辑界面,集成任务监控、项目管理和结构查看功能;
  2. 支持多种数据库:MySQL、MongoDB、Redis、SQLite、Elasticsearch、PostgreSQL、SQLAlchemy;
  3. 支持多种队列服务:RabbitMQ、Beanstalk、Redis、Kombu;
  4. 支持抓取 JavaScript 渲染的页面;
  5. 组件可替换,支持单机、分布式及 Docker 部署;
  6. 提供强大的调度控制,支持超时重爬与优先级设置;
  7. 兼容 Python 2 和 Python 3。

1.2 Pyspider 主要由以下模块组成:

  1. Scheduler(调度器):负责任务调度;
  2. Fetcher(抓取器):负责抓取网页内容;
  3. Processer(处理器):负责解析网页内容;
  4. Monitor(监控器):监控整个爬取过程;
  5. Result Worker(结果处理器):处理抓取结果。
  6. 工作流程为:调度器发起任务调度,抓取器获取网页内容,处理器解析内容并生成新的请求交给调度器,同时将提取结果输出保存。

二、 Pyspider 与 Scrapy 对比

特性 Pyspider Scrapy
操作界面 提供 WebUI,支持在线编写与调试爬虫 基于代码与命令行操作,可视化需借助 Portia
JavaScript 支持 内置 PhantomJS,可直接抓取 JS 渲染页面 需配合 Scrapy-Splash 组件
选择器 内置 PyQuery 支持 XPath、CSS 选择器及正则表达式
扩展性 相对较弱 模块耦合度低,扩展性强,可对接 Middleware、Pipeline 等组件
适用场景 适合快速实现爬取任务 适合大规模、反爬机制较强的爬取项目

总结:Pyspider 更加便捷,适合快速开发;Scrapy 扩展性更强,适合复杂、大规模的爬虫项目。

三、 安装指南

3.1 直接安装

执行以下命令:

bash 复制代码
bash
pip install pyspider

注:在 Windows 系统中可能因依赖问题安装失败,若遇到错误可尝试方式二。

3.2 Wheel 安装(推荐用于 Windows)

安装 wheel:

bash 复制代码
bash
pip install wheel

访问 https://www.lfd.uci.edu/\~gohlke/pythonlibs/,搜索 pycurl,根据 Python 版本下载对应的 .whl 文件(如:pycurl-7.43.0.3-cp36-cp36m-win_amd64.whl)。

安装下载的 .whl 文件:

bash 复制代码
bash
pip install 文件路径\pycurl-xxx.whl

安装 pyspider:

bash 复制代码
bash
pip install pyspider

验证安装

在命令行输入 pyspider,若显示服务启动信息,则安装成功。若启动时卡在 result_worker starting...,可另开命令行窗口再次执行 pyspider,启动后关闭原窗口即可。

访问 http://localhost:5000 可进入 WebUI 界面。

四、 快速入门

4.1 创建项目

点击 WebUI 中的 Create 按钮。

填写项目信息:

Project Name:项目名称

Start URL(s):起始爬取地址(示例:https://hz.lianjia.com/ershoufang/)

点击 Create 完成创建。

4.2 编写爬虫

为绕过 HTTPS 证书验证,需在 crawl 方法中添加 validate_cert=False 参数。示例代码:

python 复制代码
python
from pyspider.libs.base_handler import *

class Handler(BaseHandler):
    crawl_config = {}

    @every(minutes=24 * 60)  # 每天运行一次
    def on_start(self):
        self.crawl('https://hz.lianjia.com/ershoufang/', callback=self.index_page, validate_cert=False)

    @config(age=10 * 24 * 60 * 60)  # 设置任务有效期
    def index_page(self, response):
        for each in response.doc('.title').items():
            self.crawl(each.attr.href, callback=self.detail_page, validate_cert=False)

    @config(priority=2)  # 设置任务优先级
    def detail_page(self, response):
        yield {
            'unit_price': response.doc('.unitPrice').text(),
            'title': response.doc('.main').text(),
            'sell_point': response.doc('.baseattribute > .content').text()
        }

运行调试

在 WebUI 中点击运行按钮,通过 follows 功能可查看爬取链接,点击详情页查看提取结果。

4.3 数据存储(MySQL)

安装 MySQL 驱动:

bash 复制代码
bash
pip install pymysql

修改爬虫代码,添加存储逻辑:

python 复制代码
python
from pyspider.libs.base_handler import *
import pymysql

class Handler(BaseHandler):
    crawl_config = {}

    def __init__(self):
        # 修改为实际的数据库连接信息
        self.db = pymysql.connect(host='ip', user='username', password='password', database='db', charset='utf8')

    def add_mysql(self, title, unit_price, sell_point):
        try:
            cursor = self.db.cursor()
            sql = 'INSERT INTO house(title, unit_price, sell_point) VALUES (%s, %s, %s)'
            cursor.execute(sql, (title[0], unit_price[0], sell_point))
            self.db.commit()
        except Exception as e:
            print(e)
            self.db.rollback()

    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl('https://hz.lianjia.com/ershoufang/', callback=self.index_page, validate_cert=False)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc('.title').items():
            self.crawl(each.attr.href, callback=self.detail_page, validate_cert=False)

    @config(priority=2)
    def detail_page(self, response):
        title = response.doc('.main').text(),
        unit_price = response.doc('.unitPrice').text(),
        sell_point = response.doc('.baseattribute > .content').text()
        self.add_mysql(title, unit_price, sell_point)
        yield {
            'title': title,
            'unit_price': unit_price,
            'sell_point': sell_point
        }

在 WebUI 中手动测试数据保存,或通过 Dashboard 将任务状态设为 RUNNING 并执行自动爬取与存储。


相关推荐
跟着珅聪学java9 小时前
JavaScript 底层原理
java·开发语言
项目題供诗9 小时前
C语言基础(二)
c语言·开发语言
副露のmagic9 小时前
更弱智的算法学习 day25
python·学习·算法
J_liaty9 小时前
RabbitMQ面试题终极指南
开发语言·后端·面试·rabbitmq
JosieBook9 小时前
【开源】基于 C# 和 Halcon 机器视觉开发的车牌识别工具(附带源码)
开发语言·c#
华仔啊9 小时前
写 CSS 用 px?这 3 个单位能让页面自动适配屏幕
前端·css
hudawei9969 小时前
Flask 与 FastAPI 对比分析
python·flask·fastapi
逑之9 小时前
C语言笔记14:结构体、联合体、枚举
c语言·开发语言·笔记