基于Python和Scrapy框架的网页爬虫设计与实现

2021-07-19 08:32陈皓周传生
电脑知识与技术 2021年13期
关键词:网络爬虫数据采集大数据

陈皓 周传生

摘要:针对不同的网页数据环境设计有效的爬虫方案,更加有助于爬取信息的准度和效度。文中以Python及其Scrapy框架为基础,以贝壳網为例,通过对网站的页面源码结构进行深入分析,编写了行之有效的爬虫文件来获取目标网站信息。该设计方法可以应用到不同的多级页面信息类型网站,为基于Web的数据分析提供策略采集和分析支持。

关键词:大数据;网络爬虫;scrapy框架;数据采集

中图分类号:TP3        文献标识码:A

文章编号:1009-3044(2021)13-0003-03

Abstract: Designing effective crawling strategies for different network data environments can enhance the accuracy and validity of crawling information. Taking Bakclass.com as an example, this paper analyzes the structure of the source code of the website page based on Python and its Scrapy framework environment, and then composes effective crawler files to obtain target website information. Targeting the type of different multi-level information websites, this designing method supports network data analysis based on Web by acquiring and analyzing strategies.

Key words: big data; web crawler; scrapy framework; data acquisition

如今正值人工智能和物联网高速发展时期,大数据正是由于网络时代发展而衍生的必然产物,亚马逊网络服务(AWS)的大数据科学家John Rauser给这样定义:“大数据是任何超过了一台计算机处理能力的庞大数据量”。由于它是一个体量巨大,数据类别巨大的数据集,所以如何快速从中获取有效信息正是大数据所需研究的重点问题。网络爬虫则是解决这些重点问题的关键技术中的一种。网络爬虫是一种按照一定规则,自动地抓取网络信息的程序或脚本,另外还有一些不常使用的名字:蚂蚁、自动索引、模拟程序、蠕虫[1]。从本质上来说,爬虫就是利用自动化程序从网上批量抓取我们所需要的数据。

1 Web爬虫设计的技术基础

1.1 网页抓取策略

在爬取网页数据的过程中,待抓取的URL队列以什么样的顺序排列,在爬虫系统中是一个很重要的问题,因为涉及抓取页面的先后顺序,而这种决定URL排列顺序的方法,被称之为抓取策略[2]。网页的抓取策略主要分为两种:基于深度优先的遍历和基于广度优先的遍历。深度优先遍历在于能够将所有深层的URL全部找到,缺点是有可能一旦开始搜索或许会陷入永久搜索无法跳出[3-4]。而广度优先遍历的好处是降低了重复率而不用反复爬取,但页面更新后,信息的更新会不及时,并且每次的判断可能会消耗较多资源和时间。

1.2 Scrapy框架组成及数据流向

Scrapy具有功能强大、爬取效率高、相关扩展组件多、可配置和可扩展程度强的爬虫框架。它基于Twisted的异步处理框架,是纯Python实现的爬虫框架,其架构清晰,模块耦合程度低,可以灵活的完成各种需求[5]。简单来说,Scrapy是一个为了爬取网站数据,提取数据而编写的应用框架。

Scrapy主要组件有Scrapy Engine(引擎),Scheduler(调度器),Downloader(下载器),Spider(爬虫器),Item Pipeline(管道)。还有两个中间件:Downloader Middlewares(下载器中间件)和Spider Middlewares(爬虫器中间件),箭头代表Scrapy的数据流,数据流有引擎控制。详细架构及数据流向如图1所示。

(1)Scrapy Engine:向Spider请求第一个要抓取的URL。

(2)Spider:提供URL给引擎。

(3)Scrapy Engine:接收到URL,交给Scheduler排序入队。

(4)Scheduler:将URL处理成request给Scrapy Engine。

(5)Scrapy Engine:接收到request,并通过Downloader Middlewares给Downloader下载。

(6)Downloader:根据request下载页面,返回response给Scrapy Engine。

(7)Scrapy Engine:接收到response,并通过Spider Middlewares给Spider处理。

(8)Spider:处理response,提取网站数据,返回结构item给Scrapy Engine,如果有跟进的request也会给Scrapy Engine。

(9)Scrapy Engine:接收到item,交给Item Pipeline。

(10)Item Pipeline:如有新的request交给Scheduler处理,并从第2步开始重复直到调度器没有request,引擎就会关闭本次爬虫。

1.3 Xpath页面解析

通过Scrapy将数据从网页爬去下来之后,需要从每个网页解析并提取出数据,常用提取网页数据主要有三种方式:正则表达式、Beautiful Soup和Xpath,三種方法各有千秋,本文选择Xpath来提取网页数据。

Xpath全称XML path Language,即XML路径语言,最初用于搜索XML文档,同样也适用于HTML文档搜索。使用Xpath页面解析的特点在于:一是Scrapy提供了简洁明了的路径选择表达式以及丰富的内建函数,用于对字符串、数值、时间的匹配。二是Xpath提供的路径表达式可以进行顺畅的序列化处理,所有想要定位的标签节点,都可以使用Xpath来选择。三是当面对比较复杂的网页源代码时,Xpath更容易对源数据进行解析,并且较之Beautiful Soup速度更快。

Xpath使用路径表达式可以在网页源代码中选取节点,可以说它是沿着路径来截取数据的,常用表达式如表1所示。

2 Web爬虫的设计

2.1 爬取数据的基本流程

爬取目标网站之前,首先要确定采集目标,明确采集字段的位置信息和逻辑结构。通过整体布局,需确定是否制定采集策略,如需植入采集策略,可根据源码字段的逻辑结构进行设置。其次对已确定的采集字段进行页面和源码之间的关系分析,检查采集字段所处页面位置,并依据其关系实施相应的采集方法。最后通过以上分析,选择符合该页面特点的路径表达式进行数据解析,并通过编写爬虫各功能模块来分步实现该网站的数据爬取。图2描述的是一个爬取网页数据的基本流程。

2.2 基于Scrapy框架的目标网站数据采集

为了描述本Web爬虫的具体实现,本文结合国内知名房屋交易网站贝壳网(https://sy.ke.com/ershoufang/)分布说明。

2.2.1 确定目标

实施操作之前,需确定数据目标。通过观察页面得出,列表页展示的是房屋基本信息,对应的详细信息需要进入到详情页面才可以看到。所以列表页中并没有显示全部的数据信息,如果想要提取这些数据,必须进入详情页采集。本次所采集的数据共有8个字段,列表页采集总价、单价、小区名称;详情页则采集户型、装修情况、面积和所在区域。

采集策略方面,Scrapy采用后进先出队列的方式,在默认情况下该框架为深度优先遍历来爬取网页数据,但根据信息位置和逻辑结构不同,可将遍历方式更改为广度优先,具体操作需要在settings文件中设置DEPTH_PRIORITY=1完成策略更改。爬取数据时,0表示深度优先,1表示广度优先。

2.2.2 网站页面分析

通过观察目标URL可以发现,第二页为:https://sy.ke.com/ershoufang/pg2,第三页为:https://sy.ke.com/ershoufang/pg3,而第一页的内容使用https://sy.ke.com/ershoufang/pg1同样可以访问,所以可以得出页面是通过一个参数pn*来确定的,修改*即可以实现爬取翻页操作。在房屋信息方面,可以找到列表中总价、单价、小区名称等字段均包含在属性值为class的li标签中,所以列表页的数据可以直接采集,而详情页数据需先采集列表页中详情页的URL字段,再通过回调URL来实现采集剩余字段。

2.2.3 分步实现

首先创建一个新的Scrapy项目建立爬虫,编码爬虫文件。系统自动生成文件时,定义的爬虫类必须继承于Scrapy.Spider类,并且文件中已经提前设置好了爬虫器唯一的名字name,规定了爬虫爬取域名的范围allow_domains=[],并建立parse方法,用于获取下载的response来解析网页。通过循环遍历构造出每个页面的网址,将网址添加进start_urls列表中。

然后,定义两个函数分别为parse和parse_detail用来解析列表页数据和详情页数据。在parse方法中,运用Xpath解析出列表页字段所在标签位置,同时通过relsult字典保存遍历出的详情页URL、小区名称、总价和单价字段,并传递下去。

最后爬虫深入详情页采集其他字段,在 parse方法中需使用yield来实现多级页面爬取,通过运用scrapy.Request()构造一个新的请求对象,使用callback参数定义回调函数,来决定使用parse_detail方法处理这次新的请求响应。

本爬虫设计关键在于从列表页进入到详情页采集数据的实现。通过运用Scrapy自身并行获取的能力,运用yield发起新的请求,定义详情页URL是链接,使用meta传递item参数,并使用callback参数为这个请求添加回调函数。而parse_detail用来处理新链接的response,使用meta={‘result:result}接收传递的字典数据(即列表页字段数据),同时解析详情页字段内容。最后使用yield item返回item,将列表页和详情页的数据统一交给item pipeline做后续处理。图3描述的为本文所采用的基于Scrapy框架的爬虫流程图。

3 Web爬虫的应用示例

为了测试本Web爬虫的应用效果,结合贝壳网(https://sy.ke.com/ershoufang/)做出了如下测试。在管道模块中运用openpyxl库进行数据存储,将已经爬取到的数据保存到文件中。通过修改robots默认协议为ROBOTSTXT_OBEY=False,设置爬取速度DOWNLOAD=3,并配置相应USER_AGENT来实现数据爬取,启动爬虫命令后,会显示大量输出信息。该项目测试运行后成功获取了网站上3000多条房源的目标数据,达到了预期的爬取速度和爬取质量,打开文件可看到直观的数据信息。提取数据最后保存结果如图4所示。

4 结束语

随着大数据在各个领域和环节的应用逐步深入与发展,各类完整及快速的数据采集技术需求更加迫切和专业,本文基于Scrapy框架对爬虫文件进行设计,根据爬取网站数据的基本流程,运用Scrapy框架强大的并行获取数据能力,完成了对贝壳网房产数据的多级页面提取,实现了对网站庞大数据信息的批量获取。

参考文献:

[1] 王芳.基于Python的招聘网站信息爬取与数据分析[J].信息技术与网络安全,2019,38(8):42-46,57.

[2] 谢克武.大数据环境下基于python的网络爬虫技术[J].电子制作,2017(9):44-45.

[3] 杜雷,辛阳.基于规则库和网络爬虫的漏洞检测技术研究与实现[J].信息网络安全,2014(10):38-43.

[4] 揭秋明.基于Ajax的深层网络爬虫研究[D].武汉:中国地质大学(武汉),2013.

[5] 杜鹏辉,仇继扬,彭书涛,等.基于Scrapy的网络爬虫的设计与实现[J].电子设计工程,2019,27(22):120-123,132.

[6] 温佐承,侯帅.基于Python的网络爬虫设计与实现[J].电脑编程技巧与维护,2020(7):21-23,42.

[7] 柴唤友,刘三女牙,康令云,等.教育大数据采集机制与关键技术研究[J].大数据,2020,6(6):14-25

[8] Kausar M A,Dhaka V S,Singh S K.Webcrawler:A review[J].International Journal of Computer Applications,2013,63(2):31-36.

[9] 刘智慧,张泉灵.大数据技术研究综述[J].浙江大学学报(工学版),2014,48(6):957-972.

【通联编辑:代影】

猜你喜欢
网络爬虫数据采集大数据
炼铁厂铁量网页数据获取系统的设计与实现
基于开源系统的综合业务数据采集系统的开发研究