Python 爬虫(七):pyspider 使用

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Python 爬虫之pyspider

1 简介

pyspider 是一个支持任务监控、项目管理、多种数据库,具有 WebUI 的爬虫框架,它采用 Python 语言编写,分布式架构。详细特性如下:

  • 拥有 Web 脚本编辑界面,任务监控器,项目管理器和结构查看器;
  • 数据库支持 MySQL、MongoDB、Redis、SQLite、Elasticsearch、PostgreSQL、SQLAlchemy;
  • 队列服务支持 RabbitMQ、Beanstalk、Redis、Kombu;
  • 支持抓取 JavaScript 的页面;
  • 组件可替换,支持单机、分布式部署,支持 Docker 部署;
  • 强大的调度控制,支持超时重爬及优先级设置;
  • 支持 Python2&3。

pyspider 主要分为 Scheduler(调度器)、 Fetcher(抓取器)、 Processer(处理器)三个部分,整个爬取过程受到 Monitor(监控器)的监控,抓取的结果被 Result Worker(结果处理器)处理。基本流程为:Scheduler 发起任务调度,Fetcher 抓取网页内容,Processer 解析网页内容,再将新生成的 Request 发给 Scheduler 进行调度,将生成的提取结果输出保存。

2 pyspider vs scrapy

  • pyspider 拥有 WebUI,爬虫的编写、调试可在 WebUI 中进行;Scrapy 采用采用代码、命令行操作,实现可视化需对接 Portia。
  • pyspider 支持使用 PhantomJS 对 JavaScript 渲染页面的采集 ;Scrapy 需对接 Scrapy-Splash 组件。
  • pyspider 内置了 PyQuery(Python 爬虫(五):PyQuery 框架) 作为选择器;Scrapy 对接了 XPath、CSS 选择器、正则匹配。
  • pyspider 扩展性弱;Scrapy 模块之间耦合度低,扩展性强,如:对接 Middleware、 Pipeline 等组件实现更强功能。

总的来说,pyspider 更加便捷,Scrapy 扩展性更强,如果要快速实现爬取优选 pyspider,如果爬取规模较大、反爬机制较强,优选 scrapy。

3 安装

3.1 方式一

pip install pyspider

这种方式比较简单,不过在 Windows 系统上可能会出现错误:Command "python setup.py egg_info" failed with error ...,我在自己的 Windows 系统上安装时就遇到了该问题,因此,选择了下面第二种方式进行了安装。

3.2 方式二

使用 wheel 方式安装。步骤如下:

  • pip install wheel 安装 wheel
  • 打开网址 [https: //www.lfd.uci.edu/~gohlke/pythonlibs/],使用 Ctrl + F 搜索 pycurl,根据自己安装的 Python 版本,选择合适的版本下载,比如:我用的 Python3.6,就选择带有 cp36 标识的版本。如下图红框所示:

image.png

  • 使用 pip 安装下载文件,如:pip install E:\pycurl-7.43.0.3-cp36-cp36m-win_amd64.whl
  • 最后还是使用 pip install pyspider 安装。

执行以上安装步骤后,我们在控制台输入 pyspider,如图所示:

image.png

出现上述结果说明启动成功,如果启动时一直卡在 result_worker starting...,我们可以再打开一个控制台窗口,同样输入 pyspider 进行启动,启动成功后关掉之前的窗口即可。

启动成功后,我们再验证一下,打开浏览器,输入 http://localhost:5000 访问,如图所示:

image.png

我们发现确实启动成功了。

4 快速上手

4.1 创建项目

首先,我们点击图形界面中的 Create 按钮开始创建项目,如图中红框所示:

image.png

然后会跳出信息填写窗口,如图所示:

image.png

  • Project Name:项目名
  • Start URL(s):爬取链接地址

我们需要填写 Project NameStart URL(s),这里以链家网二手房信息为例:https://hz.lianjia.com/ershoufang/,填写完成后点击 Create 按钮。结果如图所示:

image.png

4.2 爬虫实现

pyspider 访问 https 协议的网站时会提示证书问题(通常为 HTTP 599),因此我们需要在 crawl 方法中添加参数 validate_cert=False 来屏蔽证书验证。如图所示:

image.png

我们计划获取房子的单价(unit_price)、描述标题(title)、卖点信息(sell_point),编写具体实现如下所示:

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()
        }
  • @every(minutes=24 * 60):通知 Scheduler 每天运行一次。
  • @config(age=10 24 60 * 60):设置任务的有效期限。
  • @config(priority=2):设定任务优先级
  • on_start(self):程序的入口。
  • self.crawl(url, callback):主方法,用于创建一个爬取任务。
  • index_page(self, response):用来抓取返回的 html 文档中对应标签的数据。
  • detail_page(self, response):返回一个 dict 对象作为结果。

我们点击运行按钮,如图所示:
image.png

点击之后,我们发现 follows 按钮处出现了提示信息,如图所示:

image.png

点击 follows 按钮,结果如图所示:

image.png

点击上图中红框圈起来的三角号按钮,结果如图所示:

image.png

我们随意选一条 detail_page,点击其右侧三角号按钮,结果如图所示:

image.png

从结果来看,已经可以爬取到我们需要的信息了。

4.3 数据存储

获取到信息之后,需要将信息存储起来,我们计划将数据存储到 MySQL 数据库。

首先,安装 pymysql,命令如下:

pip install pymysql

接着添加保存代码,完整代码如下:

from pyspider.libs.base_handler import *
import pymysql

class Handler(BaseHandler):
    crawl_config = {
    }

    def __init__(self):
        # 下面参数修改成自己对应的 MySQL 信息 
        self.db = MySQLdb.connect(ip, username, password, 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")' % (title[0],unit_price[0],sell_point);  
            print(sql)
            cursor.execute(sql)
            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': response.doc('.main').text(),
            'unit_price':response.doc('.unitPrice').text(),
            'sell_point': response.doc('.baseattribute > .content').text()
        }

先测试一下是否能将数据保存到 MySQL 中,还是选一条 detail_page,如图所示:

image.png

点击其右侧三角号按钮,结果如图所示:

image.png

从输出结果来看是执行了保存操作,我们再到 MySQL 中看一下,如图所示:

image.png

数据已经存到了 MySQL 中了。

上面我们是手动操作保存的数据,接下来看一下如何通过设置任务保存。

点击当前页左上角的 pyspider 按钮,如图所示:

image.png

返回 dashboard 界面,如图所示:
image.png

我们点击 status 下方红框圈住的位置,将状态修改为 RUNNINGDEBUG,然后点击 actions 下方的 run 按钮即可。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
9天前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
1月前
|
数据采集 Web App开发 自然语言处理
新闻热点一目了然:Python爬虫数据可视化
新闻热点一目了然:Python爬虫数据可视化
|
2月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
228 0
|
28天前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
1月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
564 19
|
15天前
|
数据采集 存储 JSON
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
|
19天前
|
数据采集 存储 JavaScript
解析Python爬虫中的Cookies和Session管理
Cookies与Session是Python爬虫中实现状态保持的核心。Cookies由服务器发送、客户端存储,用于标识用户;Session则通过唯一ID在服务端记录会话信息。二者协同实现登录模拟与数据持久化。
|
1月前
|
数据采集 存储 Web App开发
处理Cookie和Session:让Python爬虫保持连贯的"身份"
处理Cookie和Session:让Python爬虫保持连贯的"身份"
|
1月前
|
数据采集 Web App开发 前端开发
处理动态Token:Python爬虫应对AJAX授权请求的策略
处理动态Token:Python爬虫应对AJAX授权请求的策略
|
1月前
|
数据采集 网络协议 API
协程+连接池:高并发Python爬虫的底层优化逻辑
协程+连接池:高并发Python爬虫的底层优化逻辑

推荐镜像

更多