互联网分布式爬虫技术之pysipder框架使用详解与实战案例(文末加群)

目录

PySpider的特点

PySpider的作用和应用场景

PySpider架构

PySpider的使用

py2中安装PySpider

py3中安装PySpider

创建项目

爬虫实现

数据存储

PySpider实战案例1:爬取豆瓣电影

PySpider实战案例2:爬取百度首页

PySpider实战案例3:编写爬虫程序并将结果存储到数据库中

总结

参考链接


图片

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

原文:互联网分布式爬虫技术之pysipder框架使用详解与实战案例(文末加群)

图片

PySpider是一个用Python和PyQuery编写的强大的网络爬虫框架,它可以帮助开发者快速、高效地爬取各种网站上的数据并且支持多线程,多进程。PySpider具有简单易用、高度可定制、分布式部署等特点,被广泛用于数据挖掘、搜索引擎优化、信息收集等领域。

图片

                     

PySpider是一个支持任务监控、项目管理、多种数据库,具有WebUI的爬虫框架,WebUI支持脚本编辑器,支持分布式架构。本篇文章我将为大家从PySpider的特点、作用和应用场景,以及她的架构讲起,让后就是开始介绍它的环境安装和使用,并通过一个示例结合提供的内置WebUI页面编写一个爬虫示例,并将爬取的数据存储到MySQL中。最后再通过三个实战案例演示了下PySpider的爬虫功能。

图片

图片

PySpider的特点

1. 简单易用:PySpider提供了简单易用的API和命令行工具,开发者可以轻松地编写爬虫程序和管理任务。

2. 高度可定制:PySpider支持自定义下载器、解析器、存储器等组件,开发者可以根据自己的需求进行扩展和定制。

3. 分布式部署(支持):PySpider支持分布式部署和任务调度,可以通过配置多个爬虫节点来实现高并发的爬取任务,以及可以在多台机器上同时运行和管理任务,提高了爬取效率和可靠性。每个爬虫节点可以独立运行,通过消息队列进行通信,实现任务的分发和结果的收集。当然,也支持支持 Docker 部署。

4. 多种数据存储方式:PySpider支持多种数据存储方式,包括MySQL、MongoDB、SQLite、Redis、Elasticsearch、PostgreSQL、SQLAlchemy等,可以满足不同的数据存储需求。

5. 支持JavaScript渲染:PySpider支持使用PhantomJS或Selenium等工具进行JavaScript渲染,可以爬取动态网站上的数据,抓取JavaScript的页面。requests/urllib只能爬取静态网站。

6. 拥有 Web 脚本编辑界面,任务监控器,项目管理器和结构查看器;它提供了一个WebUI的爬虫任务管理界面,可以实现爬虫的停止,启动,调试,支持定时爬取任务。

7. 队列服务支持 RabbitMQ、Beanstalk、Redis、Kombu。

8. 强大的调度控制,支持超时重爬及优先级设置;

劣势

1. pyspider的不足之一在于环境安装比较麻烦,同时从github上的动态可以看出这块框架已经年久失修。

2. 第二个缺点就是可拓展性不强。

整体来说:一些定制性高的,需要自定义一些功能的时候可以使用Scrapy,而一些定制性不高,不需要太多自定义功能 时 使 用pyspider。

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

PySpider的作用和应用场景

PySpider主要用于爬取各种网站上的数据,可以用于数据挖掘、搜索引擎优化、信息收集等领域。具体的应用场景包括但不限于:

1. 数据采集:PySpider可以帮助用户快速、高效地采集各种网站上的数据,包括商品信息、新闻、论坛帖子、社交媒体数据等。

2. 数据分析:PySpider可以将爬取到的数据存储到数据库中,用户可以使用数据分析工具对数据进行处理和分析,挖掘有价值的信息。

3. 竞争情报:PySpider可以帮助用户获取竞争对手的产品信息、价格信息、营销活动等,帮助企业制定竞争策略。

4. SEO优化(搜索引擎优化):PySpider可以爬取搜索引擎上的相关数据,帮助用户(网站优化人员)了解搜索引擎的排名规则和竞争对手的优化策略,从而优化自己的网站。

5. 网络监控(新闻媒体监测、舆情监测):PySpider可以定期爬取网站上的数据,监控网站的运行状态和内容变化,及时发现问题并采取相应的措施。

6. 电商数据采集:PySpider可以帮助电商企业采集竞争对手的商品信息、价格信息、评价信息等,帮助企业了解市场动态和竞争对手的策略。也可以帮助新闻媒体监测社交媒体上的热门话题和舆情,及时了解公众对某一事件或话题的反应和评论。

7. 社交媒体分析:PySpider可以帮助企业分析社交媒体上用户的行为和兴趣,了解用户需求和市场趋势,从而优化产品和营销策略。

8. 学术研究:PySpider可以帮助学者爬取学术论文、专利等信息,帮助他们进行学术研究和科研评估。

PySpider架构

PySpider是一个强大的分布式爬虫框架,具有简单易用、可视化界面、支持JavaScript渲染等特点。PySpider采用了基于消息队列的分布式架构,可以同时处理多个任务,适用于高并发的爬取需求。

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

下面对它们分别进行介绍:

1. 调度器(Scheduler

负责接收爬取任务,并将任务分发给可用的爬虫节点。调度器可以根据任务的优先级和调度策略来决定任务的执行顺序。

调度器模块负责指定起始URL,生成任务队列,以及进行任务分类等工作。Scheduler可以集中控制多个Fetcher实例的工作,在爬取任务的时候可以分配不同的Prossess进程来处理抓取任务,支持分布式爬虫。

2. 爬虫节点(Spider Node

负责实际的爬取任务。每个爬虫节点可以独立运行,通过与调度器进行通信,接收任务并执行爬取操作。爬虫节点可以使用多线程或异步IO来提高爬取效率。

3. 解析器(Parser

负责解析爬取到的网页内容,并提取出需要的数据。PySpider提供了丰富的解析器,可以支持多种数据格式和网页结构。

4. 存储器(Storer

负责将解析得到的数据保存到指定的存储介质中,例如数据库、文件等。PySpider支持多种存储器,可以根据需求选择合适的存储方式。

5. 下载器(Fetcher

Fetcher是PySpider抓取网页的核心程序,它使用了异步的网络流程和协作式自动打断,支持PyQuery和BeautifulSoup等多种解析器,并且支持代理,cookie和ssl证书等网络代理模块。

6. 处理器(Process

Process模块是负责执行抓取任务的进程模块,支持多进程,多线程,并且可以通过增加实例来增加抓取速度,同时还可以使用任务分类等方式来提高爬取效率。

7.Handler处理模块

Handler模块是最终处理抓取结果的模块,当Fetcher获取到网页数据并经过处理后,Handler可以将所需的内容保存到数据库或者根据需要进行处理。

8. Web界面(Web UI

PySpider提供了一个可视化的Web界面,可以方便地管理和监控爬虫任务。用户可以通过Web界面添加、编辑和删除任务,查看任务的执行状态和结果。

PySpider的使用

Pyspider是支持python2和Python3的

py2中安装PySpider

可以使用pip命令安装PySpider(支持py2&py3):

pip install pyspider

图片

启动后即可使用浏览器访问

图片

py3中安装PySpider

图片

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

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

图片

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

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

接下来我们通过这个WebUI来创建和运行我们的爬虫项目

创建项目

首先,我们点击图形界面中的 Create 按钮开始创建项目,会跳出信息填写窗口,如图所示:

图片

Project Name:项目名

Start URL(s):爬取资源的目标链接地址

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

图片

结果如图所示:

图片

爬虫实现

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

#!/usr/bin/env python# -*- encoding: utf-8 -*-# Created on 2023-10-19 18:46:26# Project: spider01
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 对象作为结果。

修改好后,我们点击保存并运行按钮,如图所示:

图片

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

图片

图片

点击上图中红框圈起来的三角号按钮,然后从结果中我们随意选一条 detail_page,点击其右侧三角号按钮,结果如图所示:

图片

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

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

数据存储

获取到信息之后,需要将信息存储起来,我们计划将数据存储到 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,点击其右侧三角号按钮,结果如图所示:

图片

然后我们可以从输出结果来看是执行了保存操作,我们也可以再到 MySQL 中看一下数据是否已经存到了 MySQL 中了。

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

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

图片

返回 dashboard 界面,如图所示:

图片

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

PySpider实战案例1:爬取豆瓣电影

以下是一个使用PySpider爬取豆瓣电影Top250的实战案例:

#!/usr/bin/env python# -*- encoding: utf-8 -*-# Created on 2023-10-19 19:08:58# Project: douban_top250# @author:SteveRocket# @Date:2023/10/19# @File:douban_movie_top250# @Email:[email protected]# @CSDN:https://blog.csdn.net/zhouruifu2015/# @WeChat:https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q
from pyspider.libs.base_handler import *

class DoubanSpider(BaseHandler):    crawl_config = {
   
           'headers': {
   
               'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'        }    }
    @every(minutes=24 * 60)    def on_start(self):        self.crawl('https://movie.douban.com/top250', callback=self.index_page, validate_cert=False)
    @config(age=10 * 24 * 60 * 60)    def index_page(self, response):        for each in response.doc('.item > .info > .hd > a').items():            self.crawl(each.attr.href, callback=self.detail_page, validate_cert=False)
    @config(priority=2)    def detail_page(self, response):        return {
   
               "title": response.doc('h1 > span').text(),            "rating": response.doc('.rating_num').text(),            "director": response.doc('.attrs > a').eq(0).text(),            "actors": [a.text() for a in response.doc('.actor > .info > a').items()],        }

分别点击页面的save和run,结果如下

图片

这个爬虫程序会爬取豆瓣电影Top250的电影标题、评分、导演和演员信息。然后选择其中的一个链接信息进行run,即可看到爬取的结果如下所示:

图片

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

PySpider实战案例2:爬取百度首页

下面是一个简单的PySpider爬虫实例,以爬取百度首页为例子:

#!/usr/bin/env python# -*- encoding: utf-8 -*-# Created on 2023-10-19 19:15:08# Project: baidu_index
from pyspider.libs.base_handler import *
class BaiDuSpider(BaseHandler):
    # 配置起始URL    @every(minutes=24 * 60)    def on_start(self):        self.crawl('https://www.baidu.com/', callback=self.index_page, validate_cert=False)
    # 抓取首页内容    @config(priority=2)    def index_page(self, response):        return {
   
               "title": response.doc('title').text(),            "url": response.url,            "page": response.text,        }
    # 对首页内容进行解析    @config(age=10 * 24 * 60 * 60)    def detail_page(self, response):        return {
   
               "title": response.doc('title').text(),            "url": response.url,            "page": response.text,        }

在以上代码中,我们从BaseHandler模块中继承一个BaiDuSpider类,然后编写了三个方法进行不同的任务。

  • on_start()方法:指定爬虫起始URL并开启抓取任务。

  • index_page()方法:抓取首页内容并返回指定内容,同时检查返回状态码是否为200。

  • detail_page()方法:对首页内容进行解析并返回指定内容。

在整个过程中,我们使用装饰器@every以及@config对任务进行配置,包括任务间隔时间、优先级、要返回的信息等,具体根据需求可以配置对应参数。

在完成以上配置之后,然后在浏览器中开启PySpider的Web UI,通过Web UI来查看、管理抓取任务和爬虫运行状态。

图片

PySpider实战案例3:编写爬虫程序并将结果存储到数据库中

使用PySpider编写爬虫程序非常简单,只需要定义一个Spider类,并实现start_urls、parse、on_result等方法即可。例如,下面是一个简单的爬取豆瓣电影Top250的程序:

from pyspider.libs.base_handler import *
class DoubanSpider(BaseHandler):    crawl_config = {
   
           'headers': {
   
               'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'        }    }
    @every(minutes=24 * 60)    def on_start(self):        self.crawl('https://movie.douban.com/top250', callback=self.index_page)
    @config(age=10 * 24 * 60 * 60)    def index_page(self, response):        for each in response.doc('.item > .info > .hd > a').items():            self.crawl(each.attr.href, callback=self.detail_page)
    @config(priority=2)    def detail_page(self, response):        return {
   
               "title": response.doc('h1 > span').text(),            "rating": response.doc('.rating_num').text(),            "director": response.doc('.attrs > a').eq(0).text(),            "actors": [a.text() for a in response.doc('.actor > .info > a').items()],        }

3. 运行爬虫程序

使用命令行工具pyspider来运行爬虫程序:

pyspider all

这将启动PySpider的WebUI和任务调度器,可以通过WebUI来查看爬虫任务的运行状态和结果。

4. 查看爬虫结果

爬虫程序运行完成后,可以将结果保存到MySQL、MongoDB等数据库中,也可以导出为JSON、CSV等格式的文件。例如,可以使用MySQL存储结果:

from pyspider.database.mysql.mysqldb import SQL
class DoubanSpider(BaseHandler):    def on_result(self, result):        if result:            SQL().insert('douban_movie', **result)

这将把爬取到的数据存储到名为douban_movie的MySQL表中。

通过以上介绍,我们可以看到PySpider具有简单易用、高度可定制、分布式部署等特点,可以帮助开发者快速、高效地爬取各种网站上的数据。无论是数据挖掘、搜索引擎优化还是信息收集,PySpider都是一个非常实用的工具。

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

总结

通过以上介绍,我们可以发现,PySpider是一个简单易用、高度可定制、可以快速高效地抓取目标网站数据的爬虫框架,并且支持多线程、多进程以及分布式爬虫,非常适合应用于数据抓取、数据挖掘等领域。同时,PySpider也提供了丰富的配置参数,可以根据具体需求来进行针对性的配置。它还支持Web UI管理界面,方便用户查看抓取任务和爬虫运行状态,使用起来非常方便。

使用PySpider可以轻松地编写爬虫程序、管理任务、存储数据等,是一个非常实用的工具。需要注意的是,在抓取网站数据的过程中,我们需要遵守相关法律法规以及网站的使用协议,同时不得滥用PySpider进行爬虫,否则将会被网站屏蔽或者追究法律责任。

总的来说,PySpider的架构设计简洁明了,各个组件之间通过消息队列进行通信,实现了任务的分发和结果的收集。同时,PySpider提供了丰富的功能和灵活的配置选项,可以满足不同场景下的爬取需求。无论是单机爬取还是分布式爬取,PySpider都能提供高效、稳定的爬取解决方案。

参考链接

官网:http://docs.pyspider.org/en/latest/

文档: http://docs.pyspider.org/

指南: http://docs.pyspider.org/en/latest/tutorial/

GitHub地址: https://github.com/binux/pyspider/

原文:互联网分布式爬虫技术之pysipder框架使用详解与实战案例(文末加群)

Python专栏
https://blog.csdn.net/zhouruifu2015/category_5742543

更多精彩,关注我公号,一起学习、成长

CTO Plus

一个有深度和广度的技术圈,技术总结、分享与交流,我们一起学习。 涉及网络安全、C/C++、Python、Go、大前端、云原生、SRE、SDL、DevSecOps、数据库、中间件、FPGA、架构设计等大厂技术。 每天早上8点10分准时发文。

306篇原创内容

公众号

标准库系列-推荐阅读:

推荐阅读:

最后,不少粉丝后台留言问加技术交流群,之前也一直没弄,所以为满足粉丝需求,现建立了一个关于Python相关的技术交流群,加群验证方式必须为本公众号的粉丝,群号如下:

图片

原文:互联网分布式爬虫技术之pysipder框架使用详解与实战案例(文末加群)

猜你喜欢

转载自blog.csdn.net/zhouruifu2015/article/details/134820216