文章目录
- 前言
- [一、 概述](#一、 概述)
-
- [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 界面。其主要特点包括:
- 提供 Web 脚本编辑界面,集成任务监控、项目管理和结构查看功能;
- 支持多种数据库:MySQL、MongoDB、Redis、SQLite、Elasticsearch、PostgreSQL、SQLAlchemy;
- 支持多种队列服务:RabbitMQ、Beanstalk、Redis、Kombu;
- 支持抓取 JavaScript 渲染的页面;
- 组件可替换,支持单机、分布式及 Docker 部署;
- 提供强大的调度控制,支持超时重爬与优先级设置;
- 兼容 Python 2 和 Python 3。
1.2 Pyspider 主要由以下模块组成:
- Scheduler(调度器):负责任务调度;
- Fetcher(抓取器):负责抓取网页内容;
- Processer(处理器):负责解析网页内容;
- Monitor(监控器):监控整个爬取过程;
- Result Worker(结果处理器):处理抓取结果。
- 工作流程为:调度器发起任务调度,抓取器获取网页内容,处理器解析内容并生成新的请求交给调度器,同时将提取结果输出保存。
二、 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 并执行自动爬取与存储。