基于Python的网页信息爬取技术研究
2021-11-20单艳张帆
单艳 张帆
(国家计算机网络与信息安全管理中心新疆分中心 新疆维吾尔自治区乌鲁木齐市 830017)
互联网以及信息技术产业的快速发展,让互联网当中的数据变得繁杂多样,网络爬虫本身是按照一定的规则,实现自动地抓取网页的信息并且进行计算,网络爬虫的目的最主要在于将目标网页当中的数据进行下载管理,方便用户的使用,提高用户的使用体验,由于大数据时代的到来网络爬虫技术得到了快速的发展得到,用户通过网络爬虫的爬取技术可以更加快捷的获取到网络数据,便于进行数据挖掘。对于Python语言来说快捷简单,目前的爬虫框架和工具可以大幅度降低使用的门槛,保证表达式的使用,让数据的抓取更加的稳定。先目前,各大网站的反爬虫机制已经构建完善,市面上存在的一部分爬虫程序已经满足客户的实际需求,所以一个能够实现网页信息爬取的爬虫项目也是时代发展的需要。本文最主要的研究内容就是实现如何从目标网页当中爬取自己所需要的信息,Pyhton作为一个学习较为简单,简单易上手的程序语言得到越来越多的重视,本文就主要选择Python作为爬取技术的编写软件,使用其中较为成熟的库,数据分配展示方面我们配合使用spring, mybats以及mvc三个主要框架实现数据的展示。
1 Python语言简介和优势
Python语言对开发的软件一致性和质量水准尤为重视,在使用Python语言进行开发之后,绝大部分人都不会再使用其他的开发语言,这就足以表明开发者们是有多执迷于Python语言的应用。初见Python语言的时候,人们会首先注意到它的可读性功能,大部分人对于Python语言的定义就是,它是一种效率极高的脚本语言,这其实是和使用者的个人看法有关,尽管它本身就具备着周期短、便于使用等诸多优点,还能从容应对所有的脚本语言工作,但它可不仅仅是一款功能强大的shell语言,甚至可以说是超出了控制语言的范畴,因为它在快速且灵活的开发模式中可以有出色的表现,所以我们常说Python语言是多面性的。相比之下,Python语言的可读性、可维护性等要比传统脚本语言强大得多,这就是为什么许多人更愿意使用Python语言的根本原因。不仅如此,Python语言还具有着更好的软件质量、模块数量多、支持标准库、较强的可移植性、极高的开发效率、组件集成等诸多优势,得益于自身的强大功能,Python语言才可以在编程者的心中占据核心地位[1]。
2 爬虫框架介绍分析
2.1 scrapy库
对于python编程软件来说scrapy是一个非常著名的爬取网站数据、提取结构性数据的应用框架,主要有scrapy Engine(引擎)、Scheduler(调度器)、Downloader(下载器)、Spider(爬虫)、Item Pipeline(管道)五大组件,本次框架主要依靠downloader实现数据的抓取,我们只需要指定相应的url,就可自动将抓取得到的内容放置在item当中,客户实现自定义的处理之后,scrapy框架封装以及下载等过程,这样将会大幅度加快软件的编写速度。scrapy enginer系统主要实现相关数据的通讯,信号的传递。scheduler系统主要实现对于SEd 下载之后发送给相关的管理请求得到报告数据返还。spiders主要是处理返回数据请求,提取试剂需要的数据,交换引擎再次输入到shceduler当中[2]。
2.2 scrapy框架运作程序
因为scrapy需要一个较为固定明确目标网站,被首先处理的spider将会发送给引擎,引擎控制调度器将request加入其中,调度器处理完成之后再送回引擎。引擎将调度器送回的request分析之后转送到下载器当中下载相关的信息,如果下载已经失败,引擎会保留之后传回调度器,完成所有下载之后再继续下载相关数据。
根本页面的实际代码我们可以知道,书单当中的信息卸载classs当中的mod book list当中的div其中存储,在这些dl标签当中的都是一个主题书当中的实际信息,我们需要的信息除非评价之后还需要签订dd标签当中,评价的人数信息页面当中,也就是实现超链接,按照相关的方法实现代码的定位。
2.3 状态码的检测分析
在实际检测爬虫软件的时候需要构建URL进行请求的时候,我们需要对于请求的状态码进行检测分析。我们在进行爬取的时候需要遇到网站被封闭IP模式下,需要返回reponse的状态码需要分析,但是scrapy框架体系需要忽视,但是在scrapy库模式需要对于状态码需要达到200-300请求处理分析。我们需要实现手动添加相关的代码,这样我们就可以判断是否稳定,最后实现相关的抓取分析。
2.4 录取展示
MYSQL数据库是一种具有小型关系型数据库的管理系统。由于它具备体积小、运行速度快、研发成本低、开放源代码等诸多优势,所以在各类中小型网站中得到了极为广泛的普及和应用。对于本次数据库当中使用的mysql数据库,需要进行pymysql驱动进行链接数据库系统,读取相关的信息展示在相关的页面当中,本文主要使用java当中的spring以及sprng mvc和mybatis作为主要的构建页面[3]。
3 目标网站爬虫设计
3.1 目标网站的确认和进入
现阶段已经出现的爬虫,可以为我们提供丰富的开发经验、相关注意事项等。本次我们将豆瓣网作为研究对象,目的是对该网站上读书标签下的图书进行爬取,同时根据该图书的评分完成顺序储存。
首先,我们通过火狐浏览器进入豆瓣网中,随便选择一个有关主题的图书页面,单击鼠标左键将其打开。在更换主题过程中,我们发现豆瓣网的URL具有一定的规律性。
对URL的转换规律进行总结后得出:tag后面就是目标主题,类型资源紧随其后,比如在看到book、source时,它们分别显示的是图书和各种资源。
其次,我们看到豆瓣网站的图书页面都是分页的,而且单个页面展示的资源数量为15个。将第2页打开,可以看到页面的URL出现了很大改变。
到这里,本文可以确认页面URL的变化规律是:将页面打开时,因为是第1页,start参数显示0,故而不显示。进入第2页后,start单次增加15,说明每一页展示的资源数量就是15个。
3.2 信息匹配和检索
将目标网站的URL变化模式确定下来后,接下来我们就要对网站中爬虫内容所处的位置进行分析。当前的目标信息包括书名、作者、评分、出版社和评价人数这5个。通过火狐浏览器进入豆瓣网的页面,把目标网站找出来,按下F12键,随后对页面的源代码进行分析,就能将所需信息的CSS代码找出。本次我们将与南京有关的图书假设为查找目标,结合火狐浏览器给到的信息,图书与CSS关键代码相互对应。
从页面的源代码来看,书单的全部信息在class为mod booklist的div中都能够找到。并且每一个dl标签中,都有着与一本主题书相关的信息内容。目标信息全部写在dd标签里,仅仅是评价人数没有。但在其他页面可以找到,即书名所在标签的超链接位置。采用同样的方法,可直接定位具体代码。
3.3 状态码检测
由于在测试爬虫的过程中,要持续构造URL将请求发出,因此要监测每一次请求后的状态码。在爬取期间,偶尔会有被该网站封IP的意外发生,这样返回的reponse的状态码就会显示403,但Scrapy会直接忽略这种状态码,原因在于它只处理在200到300以内的状态码请求。所以,我们只能手动把handle-httpstatuslist=[403]这个代码给加上去,从而通过判断response.status==403,将CloseSpider异常排出,以此获取结束抓取的功能。
3.4 录入和展示
本次研究中我们选择了Mysql数据库,使用PyMySQL驱动连接,才能实现对数据库的操作。读取展示模块的功能是把数据库里储存的信息值在自己页面上进行展示。本文在打造查询页面上,选用了Java中的三大框架,分别为MyBatis、SpringMvc和Spring[4]。
4 编写爬虫过程中存在的一些问题
4.1 爬虫被封禁
在首次运行爬虫时我们发现,只要爬取出的数据量在几百条左右,就会陆续有许多像404的非正常状态码弹出。随后进入豆瓣网中,发现以上的异常行为早已被网站所察觉,如果想要获得正常的页面,我们唯一的选择就是进行登录。出现这种情况的时候,说明被爬取的网站已经检测出来爬虫脚本程序,由于在浏览特性方面与正常用户存在差异,使得服务器自动封禁了检测到的IP。
解决办法:用User Agent伪装后再来爬取目标网站,条件允许的话,可以再加一个随机延时,使访问浏览器行为更接近于正常用户的操作。
4.2 多主体爬取
由于本次爬取仅选择和储存了一个主题的书,因此在单表设计上是完全正常的。在同时爬取多个主题的书时,单表对于浏览所爬取的信息就不能起到帮助了。所以,当我们需要同时爬取多个主题的书时,应该先把它转移到Excel表格里进行存放,但要求一个单元格要与一跳爬取数据相互对应。每个sheet页都可以当做对应主题爬取出的书的信息的存放空间。
按照评分数据,由高到低进行顺序排列和展示,可以让我们浏览目标的效率得到显著提高。
4.3 加密的传参
本次研究是在豆瓣网中进行爬取。由于该网站里的静态页面占比较大,所以爬取难度要比其他的低很多。有时目标信息只有通过请求才能得到,例如应用JavaScript生成、Ajax传值等等。因此,我们要将火狐自带的开发者工具运用起来,对请求中的参数进行查询和浏览,紧接着再通过程序完成模拟过程。但是,部分网址的传参已经过加密处理,不能将目标参数请求给模拟构造出来。对于该类网站,就得换个方法,比如通过selemium+phantomJS框架,用phantomJS将模拟人为的操作执行下去,获取JavaScript后,便具备了触发页面的条件。从表单数据的填写、提交一直到回滚页面,都能进行模拟。在这套框架的应用下,绝大部分的反爬虫方案都被破除了[5]。
5 结束语
在研究的初期通过对研究内容的文献的整理,本人较为充分的利用了互联网文献资料和图书馆资源,对基于Python的网页信息爬取技术进行了较为全面的学习和研究,同时整理收集了大量Python的网页信息爬取技术研究的相关资料,并且思考分析Python的网页信息爬取技术研究当中容易出现的问题等,通过这些资料的整理和对前人的研究成功进行比较和借鉴,全面的总结了现有的文献资料,得出了我国网页信息爬取研究领域的最新观点,实现了研究的现实性和实践性。本文主要是对Python框架下基于主题的数据爬取技术研究与实现进行研究,通过爬虫程序的实现,来爬取目标网站的所需数据,从而达到对Python开发相关步骤的充分了解及初步掌握。从程序编写结束爬取数据出现IP被网站封禁的情况,到逐步优化程序,能够实现在本地存储爬取的信息,说明本文的研究目标已经基本达成了。
经过此次开发爬虫程序,我们发现需要完善的部分还有许多。例如:在数据量较大时,爬虫爬取的速度会明显减慢,可尝试用分布式的爬虫进行爬取,有利于工作效率的提高。