严斐 肖璞
摘 要: 如今上网查询和购物已经成为人们的生活必需。由于在很多系统上查看商品或资源需要点击跳转多个页面,随着浏览时间的增加,经常会出现眼花缭乱的感觉。若只为用户呈现必要的数据,必将提高筛选资源的效率。文章使用Python语言结合目前流行的Spring MVC框架来爬取目标网站的数据,设计了数据爬取模块和数据展示模块,实现了基于主题的爬虫框架。通过爬取实验与结果测试,成功爬取到了目标网站的数据并展示到自己的页面上,实现了预期的目标。
关键词: 数据爬取; 基于主题;爬虫; SpringMVC
中图分类号:TP311 文献标志码:A 文章编号:1006-8228(2018)11-10-04
Abstract: Nowadays, online enquiries and shopping have become the indispensable of people's daily life. Because viewing goods or resources on many systems requires clicking and jumping over multiple pages, it is often a dazzling feeling as browsing time increases. If only provide users with the necessary data, the efficiency of screening resources will certainly be improved. Combining with the popular Spring MVC framework, this paper uses Python language to crawl the data of the target website, designs the data crawling module and data display module, and implements the theme-based crawler framework. The crawling experiment and the test result show that, the data of the target website is crawled and displayed on its own page, and the expected goal is achieved.
Key words: data crawling; theme-based; crawler; Spring MVC
0 引言
互聯网的快速发展使得互联网的数据变得又多又杂,人们无法在一张页面上获取到尽可能多的数据。因此,爬取不同网页上的更多的数据已经成为了一种趋势。本文的研究目的就是尽可能多的从目标网站上爬取自己想要的信息来提高获取有用信息的效率。
随着技术的不断发展,各个网站的反爬虫机制也日渐成熟,市面上所存在的一些爬虫程序已经不能正确的爬取到用户想要的信息。因此,一个能正确爬取数据的爬虫项目也是市场上所需要的[1]。
本文研究的内容是如何从目标网页上爬取自己想要的信息。目前Python作为一门易学习,易入手的编程语言受到越来越多程序员的青睐。本文选用Python作为爬取技术的编程语言,调用其中较成熟的库如BeautifulSoup库,Requests库和Scrapy库,再配合Mysql数据库。数据展示方面配合Spring、MyBatis、Spring MVC三大框架将爬取到的数据展示到所需的页面上。
1 爬虫框架介绍
1.1 Scrapy库介绍
Scrapy是一个Python著名的爬虫框架,如图1所示。该框架使用了Downloader抓取数据,只需要指定被抓取的url,将抓取的内容放进Item Pipeline,由客户进行自定义的处理。Scrapy框架封装了下载和调度等过程,方便了爬虫的编写。
⑴ Scrapy Engine:负责Spider,ItemPipline,Downloader,Scheduler中的通讯,信号,数据传递等。
⑵ Scheduler:负责接收引擎发送过来的Request请求,按照一定的顺序整理,入队再还给引擎。
⑶ Downloader:下载Scrapy Engine发送的所有的request请求并将获取到的Responses还给Scrapy Engine,由Spider来处理。
⑷ Spiders:负责处理所有的Response请求并分析数据,提取Item需要的数据,将后继的URL交给引擎并再次进入Scheduler。
⑸ ItemPipeline:负责处理Spider获取到的Item,进行后期处理。
1.2 Scrapy框架的运作流程
⑴ 需要明确一个目标网站,第一个将要被处理的URL将会由Spider发送给引擎(Scrapy Engine)。
⑵ 引擎(Scrapy Engine)将会通知调度器(Scheduler)将一些request请求入队。调度器(Scheduler)处理好之后再还给引擎(Scrapy Engine)。
⑶ 引擎(Scrapy Engine)将通知下载器(Downloader)下载request请求中需要的信息。如果下载失败,引擎(Scrapy Engine)将会通知调度器记录,等全部完成后再次下载。
⑷ 下载完的内容将返回给Spider由用户自定义处理。此时,Spider会获取以下信息:一是需要跟进的URL,二是获取到的Item数据。
⑸ 引擎(Scrapy Engine)通知管道(Item Pipeline)处理获取到的Item数据。同时还要通知调度器(Scheduler)跟进URL。
最后循环工作,直到获取完所有需要的数据结束工作。
1.3 BeautifulSoup库与Requests库
BeautifulSoup库与Requests库作为Python爬虫最常用的两个库现已被开发者广泛使用。BeautifulSoup库是一中灵活方便的解析库,它处理高效并且支持许多的解析器。我们只需导入该库,直接调用其中的函数就可以找到所需要的信息。对于一些前端页面代码较为复杂的网站,BeautifulSoup库可以很大程度地减少程序员编写代码的时间。
Requests是一个很实用的HTTP客户端库,编写爬虫类的項目基本都会使用到它。它具有一些很好的特性:第一,给目标URL后添加参数时不需要手动构造新的URL,方便且避免了许多低级错误。第二,Requests库中的session函数可以自动保存cookies,设置请求参数,下次请求时可以自动带上请求的参数。第三,Requests库支持流式上传,支持上传较大的文件或者数据而无需先把它们放进内存中。
2 目标网站爬虫设计
2.1 目标网站的确定与进入
目前现有的爬虫能带给我们很多的开发经验与注意事项[2-6]。本次研究选取的目标网站是对爬虫比较友好的豆瓣网,主题是爬取豆瓣网上读书标签下的图书并且按照该图书的评分依次存储下来。
首先,我们使用火狐浏览器打开豆瓣网,任选一个关于主题的图书页面点击进入。尝试更换主题,我们发现豆瓣网的URL是有规律的。如图2和图3所示。
基本确定URL的改变规律为:tag后面为所需要的主题,主题后面紧跟着类型资源,如果是book就显示图书,如果是source就是显示的各种资源。
其次,可以发现豆瓣网站图书页面是分页的并且每个页面只展示15个资源。点击第二页,发现页面的URL发生了如下变化,具体变化如图4和图5所示。
至此,本文基本确定了页面URL的变化规律,首次进入页面时由于是第一页所以start参数为0,不显示。第二页开始start每次增加15代表每页只展示15个资源。
2.2 信息匹配与检索
确定了目标网站的URL变化模式,下一步分析我们需要爬取内容在网站中的位置。现在的目标信息为:书名,评分,评价人数,作者与出版社。需要用火狐浏览器打开豆瓣页面,找到目标网站,按下F12,然后分析页面的源代码,找到目标信息的CSS代码。本次假设查找的目标为关于南京的图书,根据火狐浏览器所提供的信息,图书信息对应的CSS关键代码如图6所示。
根据页面的源代码得知:书单的所有信息都写在了class为mod book-list的div中。其中每个dl标签都是一本关于主题书的信息。需要的信息除了评价人数以外,其他都写在dd标签中。评价人数的信息在另外的页面,也就是书名所在标签的超链接。按照同样的方法进行代码的定位。
2.3 状态码的检测
由于在测试爬虫时需要不断的构造URL来进行请求,所以需要对每次请求后的状态码进行一个监测[8]。当进行爬取时有时候会遇到被该网站封IP的情况,此时返回的reponse的状态码为403,但是Scrapy框架会将该情况忽视掉,因为Scrapy库默认是对状态码处于200-300之间的请求处理。因此,我们需要手动添加代码:handle_httpstatus_list=[403],这样就能通过判断response.status==403来抛出CloseSpider异常,最后结束抓取。
2.4 录入与展示
本次数据库选用的是Mysql数据库,需要PyMySQL驱动连接操作数据库。读取展示模块就是将数据库中存储的信息值展示在自己的页面上。本文选择用Java中的Spring,SpringMvc,MyBatis三大框架搭建查询页面。查询效果图如图7所示。
3 编写爬虫时遇到的问题
3.1 爬虫被封禁
在第一次运行爬虫爬取了几百条数据后,开始大量的出现不正常的状态码,如404。再当人为打开豆瓣时,发现网站已经发现了我们的异常行为,并强制要求登录,登录以后才显示正常的页面[9]。这种情况说明所爬取的目标网站已经检测到了我们的爬虫,也就是我们的浏览特性与正常用户不一样,导致服务器将我们当前的IP进行封禁。
对此的解决方案就是采用User Agent伪装对目标网站进行爬取,并加入随机延时来更好的模拟访问浏览器行为。
3.2 多主题爬取
由于此次爬取只选择了一个主题的书进行存储,所以单表设计没有问题。当对多个主题的书进行爬取时,单表不利于爬取信息的浏览。所以在对多个主题的书进行爬取时,可以将其存放至Excel表格中,每个单元格对应的是一跳爬取数据。每个sheet页则存放对应主题爬取到的书的信息。
根据评分从高到低依次排序展示,使得我们能更有效的浏览所需信息。对应的展示效果图如图8所示。
3.3 加密的传参
本次选择爬取的页面是豆瓣网。豆瓣网内大多数页面都是静态的,相对来说比较容易爬取。有时需要的信息必须通过请求获取,比如使用Ajax传值或者使用JavaScript生成。所以我们需要使用火狐自带的开发者工具,查看请求中的参数,然后使用程序进行模拟。当然,有些网站的传参是加密过的,无法模拟构造需要的参数请求。遇到这样的网站,需要改变技术,采用selenium+phantomJS框架,使用phantomJS来执行js模拟人为的操作,触发页面的JavaScript脚本。从填写表单数据到表单数据提交,再到回滚页面,这些都可以模拟出来。利用这套框架,就可以解决大多数的反爬虫策略[7]。
4 结束语
本文研究的是Python框架下基于主题的数据爬取技术研究与实现,通过爬虫程序的实现,对目标网站目标数据进行爬取,深入了解了Python开发的一系列步骤。从编写完程序爬取数据时IP被网站封禁,到一步步优化程序成功爬取信息保存到本地,实现了本次论文的研究目标。
虽然本次爬虫程序的开发工作结束,但还有很多地方需要改进。比如,当数据量过大,爬虫爬取耗费的时间会比较耗时,可以尝试改进成分布式的爬虫,这样可以提升工作效率。
参考文献(References):
[1] 管华.对当今Python快速发展的研究与展望[J].信息系统工程,2015.12.
[2] 姜杉彪,黄凯林,卢昱江,张俊杰,曾志高,刘强.基于Python的专业网络爬虫的设计与实现[J].企业科技与发展,2016.8.
[3] 孙立伟,何国辉,吴礼发.网络爬虫技术的研究[J].电脑知识与技术,2010.15.
[4] 成功,李小正,赵全军.一种网络爬虫系统中URL去重方法的研究[J].中国新技术新产品,2014.12.
[5] 牛率仁.简析主题网络爬虫搜索策略[J].电脑迷,2016.10.
[6] 陈琳,任芳.基于Python的新浪微博数据爬虫程序设计[J].计算机技术与展,2007.3.
[7] 刘艳平,俞海英,戎沁.Python模拟登录网站并抓取网页的方法[J].微型电脑应用,2015.2.