五分钟带你了解爬虫平台的构建与应用
优采云 发布时间: 2022-05-01 21:49五分钟带你了解爬虫平台的构建与应用
关注并将【PaaS平台那些事】设为星标
每周一、三、五早上07:45准时推送文章
在大数据时代,要进行数据分析,数据来源便成了首要解决的问题。预算充足时,可以通过购买第三方数据来获取数据,但在预算不充裕的情况下,这显然不是一个好办法。
随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。
而爬虫能够有效地解决上述难题,实现对公开数据的收集。
本期,小编就带大家了解爬虫平台的构建与应用方法。
什么是爬虫
在学习之前,我们还是要先了解一下爬虫的相关概念。
网络爬虫,又称为网页蜘蛛、网络机器人,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
在爬虫抓取数据过程中,必须面对两类问题:爬取与反爬。
爬取
爬取,是通过爬虫对目标网站或APP进行数据采集,主要方法有HTML网页解析、Ajax接口解析、Selenium模拟浏览器请求等。
爬取*敏*感*词*数据时,要求爬虫有很快的网页抓取速度但又不能拖累数据质量,使得爬取挑战性极大。
反爬
反爬,顾名思义,就是防止网络爬虫对网站或者APP进行数据抓取而架设的一道访问策略,如:访问频率、验证码等。
在任何场景下,想要*敏*感*词*抓取数据,首选网络代理,通过IP随机切换、请求限制、会话管理以及黑名单逻辑来预防代理被屏蔽。这样,开发人员就可以把更多的注意力放在分析数据而不是管理代理上。
爬虫原理
爬虫原理示例
如上图所示,爬虫的基本原理为:对目标网页进行请求,获得请求响应后,对响应的结果Response进行解析,然后根据业务需求提取想要的页面内容。
如果涉及到两层爬取的业务逻辑,则对响应对象中提取出来的URL继续发送请求,进一步获取响应结果,涉及到多层深度爬取,则依次进行请求。
有时候为了保障任务可靠性,会先将解析好的URL先落盘,再开启新的爬虫任务进行下一步处理,最后,将提取的内容进行落地存储。
一般而言,将数据以JSON格式保存到NoSQL数据库中(如:MongoDB等),或者Kafka消息队列等待进一步的处理。对于比较标准的结构化数据,也可以直接保存到MySQL中。
技术选型
开发框架
对于爬虫的开发,目前更多人选用Python作为主要开发语言,因为Python语法简洁,方便修改,而且Python有很多关于爬虫的功能库,即开即用,网络上关于Python实现爬虫的资料也比较多。
对于平台化开发,可以选用Scrapy爬虫开发框架,快速搭建爬虫项目,省去了大量繁琐的代码封装工作,让开发人员把更多的精力用于处理爬虫的业务逻辑。
管理工具
在实际生产中,爬虫平台往往都是采用多应用多节点的形式构建。如果没有一个可视化的管理工具来进行日常管理和维护,那么开发人员来说,爬虫的部署、监控、运维等将会是举步艰难的。工欲善其事必先利其器,想要提升效率,一些常用的管理工具是必不可少的,在此推荐几款管理工具:
基础要求
若使用Python语言开发爬虫,首先需要学习Python的基础知识,还需要对HTML、CSS、JS、Ajax等有一定的掌握。最后,需要安装以下爬虫常用的库:
由于篇幅有限,在此只介绍Scrapy库的基础使用,其他库的学习,可以自行查找资料进行学习。
Scrapy是一个为了爬取网站数据,提取结构化数据而编写的应用框架,可应用于包括数据挖掘、信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取(更确切来说, 网络抓取)所设计的,也可以应用在获取API所返回的数据或者通用的网络爬虫。
Scrapy安装方法如下:
步骤一:在Anaconda环境中安装Scrapy模块,相关脚本如下:
conda install scrapy<br />
步骤二:安装Scrapyd服务,相关脚本如下:
conda install scrapyd<br />
步骤三:安装完成后,启动Scrapyd服务,访问 :6800/,若出现如下界面,则表示安装成功。
安装成功示例
简单爬虫实现
本节按照Scrapy框架的实现步骤进行分解,整体分为四个步骤:
步骤一:创建一个Scrapy项目
在编写爬虫脚本之前,必须创建一个新的Scrapy项目。进入打算存储代码的目录中,运行下列命令:
scrapy startproject tutorial<br />
该命令将会创建包含下列内容的 tutorial 目录:
tutorial 目录示例
这些文件分别是:
步骤二:定义Item
Item是用于封装抓取的数据对象,其使用方法和python字典类似,并且提供了额外的保护机制来避免拼写错误导致的未定义字段错误。
编辑 tutorial 目录中的 items.py 文件,命令如下:
import scrapy<br /><br />class NewsIfengItem(scrapy.Item):<br /> title = scrapy.Field()<br /> link = scrapy.Field()<br /> desc = scrapy.Field()<br />
步骤三:编写 Pipeline,保存Item到MongoDB
编写Pipeline代码,保存数据于MongoDB,代码如下:
import pymongo<br />import pymysql<br />from scrapy import Request<br /><br />class MongoPipeline(object):<br /> def __init__(self, mongo_uri, mongo_db):<br /> self.mongo_uri = mongo_uri<br /> self.mongo_db = mongo_db<br /><br /> @classmethod<br /> def from_crawler(cls, crawler):<br /> return cls(<br /> mongo_uri=crawler.settings.get('MONGO_URI'),<br /> mongo_db=crawler.settings.get('MONGO_DB')<br /> )<br /><br /> def open_spider(self, spider):<br /> self.client = pymongo.MongoClient(self.mongo_uri)<br /> self.db = self.client[self.mongo_db]<br /><br /> def process_item(self, item, spider):<br /> self.db[item.collection].insert(dict(item))<br /> return item<br /><br /> def close_spider(self, spider):<br /> self.client.close()<br />
在代码中,通过from_crawler函数的crawler参数来获取settings.py文件中定义的项目全局配置,如MongoDB的地址:MONGO_URI和数据库:MONGO_DB。
在Spider启动时,open_spider函数即配置好MongoDB的连接,然后通过process_item函数来保存Item数据。
步骤四:编写爬虫(Spider)
以收集某网新闻数据为例,在tutorial/spiders目录下创建 NewsDataSpider.py 文件:
# -*- coding: utf-8 -*-<br />import scrapy<br /><br />class NewsDataSpider(scrapy.Spider):<br /> name = 'spider_news_data'<br /> url = 'http://news.ifeng.com'<br /><br /> def start_requests(self):<br /> yield scrapy.Request(url=self.url, callback=self.parse, dont_filter=True)<br /><br /> def parse(self, response):<br /> lis = response.xpath('//*[@id="root"]/div[6]/div[1]/div[3]/ul/li')<br /> if lis:<br /> msg = {}<br /> for li in lis:<br /> a = li.xpath('div/h2/a')<br /> msg['link'] = a.xpath('@href').extract()[0]<br /> msg['title'] = a.xpath('@title').extract()[0]<br /> msg['desc'] = a.xpath('text()').extract()[0]<br /> yield msg<br />
爬虫编写完成后,执行如下命令,启动爬虫:
scrapy crawl spider_news_data<br />
这样,一个简单的爬虫就实现了。
实际应用
在实际生产环境中,爬虫平台往往都是多应用多节点的形式构建。为了让开发人员能方便快捷地进行部署、监控、运维等工作,我们使用了ScrapydWeb爬虫管理工具,便于多节点Scrapyd服务的管理,还可以实现多租户管理。
不同的产品线,对爬虫的需求不尽相同,爬取的目标源或数据类别也极具多样性。对此,ScrapyWeb将同类型数据源或者同业务块的爬虫写到同一个项目,也可称为应用,以项目(Scrapy项目,可以包含多个爬虫)的方式进行部署。
ScrapydWeb比较方便的地方在于:不用事先将项目先上传到Scrapyd服务器,ScrapydWeb能够帮我们上传。爬虫功能编写完成后,将Scrapy项目打包成egg文件,并通过ScrapydWeb→Deploy Project上传egg文件并选取多节点进行部署,部署完成后,如下图所示:
部署完成示例
在ScrapydWeb→Servers中,可以看到所有被管理的节点任务执行情况,这里的任务列表包括了实时请求的任务和定时任务。实时请求主要由业务系统或者任务监控系统发起,而TimerTasks可以设置定时任务,Jobs可进行日志查看,如下图所示:
节点任务执行情况示例
为了更加方便地查看爬虫的实际运行情况,可将爬虫日志收集到Elasticsearch中,并通过Kibana进行图表监控,则可在监控面板中详细地了解每一爬虫的具体请求、响应、异常、解析等情况。
此外,将日志数据通过实时流计算的方式,实现整个业务流程的实时监控预警。对于请求异常量较大或者Item解析结果异常的爬虫,输出爬虫异常预警功能,再加以人工干预排查,如是否数据源头发生变更、网络代理出现了异常,还是爬虫节点服务崩溃等,快速对问题进行定位,并对爬虫平台出现的问题进行及时修复。
爬虫日志统计分析示例
为了便于处理爬虫收集的数据,直接以JSON的数据格式落地到Kafka,读取Kafka数据后进行清洗、分析、挖掘等多道加工处理流程(整个处理流程基本都是实时流转),最终,构建公共数据应用仓库,并以数据服务接口的方式提供各业务调用。
接口调用情况统计示例
风险规避
爬虫技术作为一种数据搜集的手段,本身并没有合法与非法之分,但面对互联网上众多的数据,如果不加以限定,任由爬虫随意爬取,势必会对互联网生态造成影响。技术是中立的,但技术应用永远不是中立的。
那么,爬取哪类数据违法呢?
1.高度敏感信息,如:行踪轨迹、通讯内容、征信信息、猜测信息等;
2.较为敏感信息,如:住宿信息、通讯记录、健康信息、交易等;
3.其他个人信息,主要是以上两类以外的个人敏感信息。
应用建议
最后,作为程序员,我们掌握的技术就是工具,那么,我们就要保证这些工具是用在正途的。
对于爬虫的使用,有以下三点建议:
1. 遵守Robots协议;
2. 不要强行突破反爬措施,绕过防护措施对数据的访问;
3. 对爬取到的数据根据业务的需求进行重新加工后再应用等。
划重点
1. 爬虫的基本原理为:对目标网页进行请求,获得请求响应后,对响应的结果进行解析,然后根据业务需求提取所需页面内容并进行落地存储;
2. 爬虫平台往往采用多应用多节点的形式构建,为更方便地进行爬虫的部署、监控与运维,可采用ScrapydWeb、SpiderKeeper、Gerapy等可视化管理工具进行日常管理和维护。
3. 一个简单的爬虫,可通过以下四个步骤实现:
#往期推荐#
#
#
#
#
想要一个“赞”和“在看”