目录
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相关的技术交流群,加群验证方式必须为本公众号的粉丝,群号如下: