网络资源自动采集技术反思

网络资源自动采集技术反思

摘要:人类已经进入大数据时代,大数据产生了巨大的社会价值和商业价值,如何高效地获取数据,已成为提高未来竞争力的关键要素。网络爬虫就是一种高效的信息采集利器,利用它可以快速、准确地采集我们想要的各种数据资源。但是随着互联网和Web技术的发展,各种反爬虫措施的使用,给网络资源采集带来了很多困难。因此,为了准确高效地采集到需要的数据,网络爬虫也采取了具有针对性的反制措施。本文介绍了网络信息自动采集技术相关的基础概念和原则,研究并归纳了网络信息自动采集技术的存在的主要难点和解决问题的主要技术手段。

关键词:网络资源采集;反爬虫;Scrapy;Selenium

0引言

人类社会已经进入大数据时代,大数据深刻影响和改变着我们的工作和生活。随着互联网、移动互联网、社交网络等的飞速发展,产生了巨量的大数据,蕴含着前所未有的社会价值和商业价值。尤其是人工智能浪潮的兴起和深度学习技术的突破,不论在工程领域还是研究领域,数据已经成为必不可少的一部分。大数据成为21世纪最重要的经济资源之一,正如马云所说:未来最大的能源不是石油而是大数据。如何高效的获取数据,并对互联网上的非结构化数据进行清洗,得到结构化数据,以及对数据进行挖掘、分析的能力,成为企业提高未来竞争力的关键要素[1]。

1网络资源采集基本原理和基础原则

把互联网比作一张巨大的网,网上的每一个结点就相当于这张网上的一个节点,而采集的程序就相当于网上的一只小蜘蛛,根据定制的规则,批量的获取所需要的资源数据,就是这只“小蜘蛛”所要完成的工作。因此,网络资源采集又叫网络爬虫(Webcrawler)或网络蜘蛛(Webspider)。简单来说,网络资源采集就是获取网页并提取和保存信息的自动化程序,主要分为三步。

1.1获取网页

爬虫首先要做的就是获取网页,也就是获取网页的源代码。源代码里包含了网页的部分有用信息,所以将源代码获取之后,就可以从中间提取想要的信息。在Python中提供了许多库来实现源代码的获取,如urllib、requests等。

1.2提取信息

获取网页源代码之后,我们需要对网页源代码进行分析,从中提取想要的数据。由于网页的结构具有一定的规则,因此可以根据网页结点属性、CSS选择器或XPath选择器来提取网页信息,常用的库有BeautifulSoup、pyquery、lxml等。

1.3保存数据

提取信息后,我们需要将数据保存到某处以便后续使用。保存形式多种多样,可以简单保存为TXT文本或JSON文本,也可以保存到数据库,如MySQL或MongoDB等。另外,网络资源自动采集需要满足以下原则:实时性原则,完整性原则,可靠性原则,准确性原则,易用性原则[2]。

2网络资源自动采集现阶段主要难点

互联网信息资源丰富,但是非常的分散,不同的网站结构不一、布局复杂、渲染方式多样,对于不同的网站,通常需要针对性的配置,才能获取需要的数据。此外,很多的网站还会专门采取一系列的“反爬”措施,比如:(1)使用验证码验证用户为非机器人;(2)设置登录验证,用户登录之后才能获取相关内容;(3)使用动态页面,目前很多的网页都会使用JavaScript来进行页面渲染,或者使用JS动态生成请求参数及JS混淆加密,防止网络爬虫的访问;(4)IP封锁,对于单位时间内访问次数过多的IP,许多网站会对IP进行封锁,无法访问;(5)字体混淆,部分网站实际页面展示的文字、数字与网页源代码中的值并不相同,造成爬虫采集虽能正常运行,但获得的数据与实际数据不符。面对不同的问题,就需要采用具有针对性的反制措施。爬虫与反爬虫技术就是在这种竞争中,逐步发展起来的[3-4]。

3网络资源采集现阶段难点的解决技术手段

本节总结了笔者在工作中进行网络资源采集时碰到的一些问题和解决问题的主要技术手段。

3.1请求头User-Agent验证

常见的简易反爬措施,网站通过验证User-Agent方式判断请求是否为正常浏览器行为,如果发现非法UA,则返回错误响应。突破方法:为请求头添加浏览器的User-Agent字符串即可,在大规模采集过程中可以使用UA池或调用fake_useragent模块自动动态生成User-Agent并添加。

3.2用户身份Cookie验证及JWT验证

多数网站会将登陆的用户信息以键值对的形式保存在Cookie中,服务器收到请求后首先验证用户身份,验证失败则返回错误响应。JWT身份验证形式与Cookie大致相同,区别在于身份信息为请求头特定的JWT字符串而非Cookie。突破方法:通过浏览器登陆后,抓包分析寻找登录后的Cookie或JWT字符串,在爬虫运行过程中,在请求中添加对应Cookie或请求头添加对应字符串,即可获得正确响应。在使用Scrapy框架开发爬虫的过程中,可将Cookie及JWT的添加过程写入DownloaderMiddleware的process_request方法中,在Scrapy运行过程中通过中间件自动添加请求头信息,保证spider流程的可读性。

3.3动态页面爬取

目前很多的网站都会使用JavaScript,Ajax(异步JavaScript和XML)技术和动态HTML(dynamicHTML)技术进行页面渲染,生成动态页面,既可以使页面更加丰富,交互功能更强,还可以反爬虫。突破方法:一个有效的工具就是Selenium,Selenium是一个强大的网络数据采集工具,最初是为网站自动化测试而开发的,它可以让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。Selenium自己不带浏览器,因此需要与第三方浏览器结合使用,比如Firefox、Chrome、PhantomJS(如果使用Firefox,需要安装GeckoDriver驱动,如果使用Chrome,需要安装ChromeDriver驱动)。使用Selenium可以处理cookies、JavaScript、header等,模拟浏览器访问网页时进行的任何操作。另外,还可以使用Scrapy框架配合Splash服务进行JS动态生成和ajax网页的内容的采集,此方法可在Scrapy框架内完成动态内容采集,方便scrapyd进行整个爬虫项目的任务调度,更加适合大规模采集项目。Scrapy是一个用Python实现的为了爬取网站数据、提取结构性数据的应用框架。Scrapy使用Twisted异步网络库来处理网络通讯。该框架集成可高度扩展的5大组件以及封装完善的中间件模块,可以高效(爬取效率和开发效率)且高度定制采集需求来完成网站数据爬取任务。Splash是一个Javascript渲染服务。它是一个实现了HTTPAPI的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT。Twisted(QT)用来让服务具有异步处理能力,以发挥webkit的并发能力。在docker中下载并安装Splash镜像后,启动Splash服务,python安装scrapy_splash。在Scrapy项目中添加Splash服务地址,下载器中间件DOWNLOADER_MIDDLEWARE中添加Scrapy_splash相应中间件后,即可在scrapy框架中使用SplashRequest请求方式通过splash服务获得动态渲染后的网页响应内容[5-6]。

3.4JS动态生成请求参数及JS混淆加密

在采集过程中,会遇到请求中出现了动态参数的情况,这类参数一般由网站中的JavaScript代码生成并添加到关键的请求中,分析对应的JS文件,发现JS被混淆加密,可读性极低。这种反爬措施也变得愈发常见,简单的爬虫逻辑被轻易拒之门外。突破方法:分析点击事件或在控制点为JS打断点的方式定位生成加密参数的JS代码位置,找到生成参数的JS代码后,可在反混淆网站中尝试反混淆清洗,如果成功,可得到正常可读的JS代码,此时可在爬虫程序中仿写整个参数生成逻辑获得参数;如不能反混淆成功或加密逻辑过于繁密,可尝试使用PyExecJS模块直接在python环境中执行该段JS代码,也可获得加密后的参数,突破反爬限制。

3.5字体混淆

在一些网站中,实际页面展示的文字、数字与网页源代码中的值并不相同,造成爬虫采集虽能正常运行,但获得的数据与实际数据不符,这是典型的字体混淆反爬特点。此类反爬措施通过动态下载ttf、woff、woff2等经过混淆加密的字体文件生成网页源代码。突破方法:首先抓包分析请求的响应过程,获取每次请求后的字体下载url,在爬虫程序中对应获得字体文件的响应,利用python第三方模块TTFont解析字体文件响应数据,获得混淆后的字体unicode码与字体文件中name的映射关系,在利用获得的name值与字体中带有的或根据字体文件排序归纳的f_map获得unicode与实际正确字符的对应关系。

3.6IP封锁

很多网站为了防止网络攻击和恶意爬虫,通常会采用IP访问限制措施,对单位时间内访问量过大的IP地址,会进行封锁限制访问,导致采集系统无法正常访问指定页面。突破方法:针对这种问题,通常会采用IP的方法,为了采集效率和成功率,需要购买IP,然后维护一个IP池,将所有的IP放在一个池子里面,每次访问之前获取一个IP,如果IP失效,则丢弃然后重新获取,IP池还需要实现自动获取新的IP的功能和删除失效IP的功能,以支撑高效的网络采集任务。

4结语

随着互联网与移动互联网的发展,网络信息爆炸式增长,不论是企业还是个人,都越来越需要网络资源自动采集技术的支持。同时,各种新的“反爬虫”策略也是层出不穷,对于网络资源采集系统的要求也越来越高。对企业来说,拥有一套比较优良的网络资源采集系统,可以帮助企业在资源采集、整合方面节约大量的人力与资金。在当前人工智能和大数据飞速发展的时代,网络资源采集技术的研究与开发,也关系到未来国家、企业的综合实力。总之,网络资源自动采集技术需求巨大,前景广阔。

参考文献

[1]韩群鑫.网络信息资源采集研究[J].农业网络信息,2007(04):63-66.

[2]刘水.网络信息采集及数据分析结果可视化的研究与实现[D].西安电子科技大学,2013.

[3]吴海燕.互联网信息采集系统的设计与实现[D].中国人民大学,2012.

[4]朱志华,张帆.网络信息资源整合的现状研究[C]//中国医学信息教育25周年暨全国医学信息教育可持续发展学术研讨会,2010.

[5]周瑜智,刘展鸣,王博,等.关于网络信息自动采集技术的难点及其解决办法的研究[J].科技传播,2013(6):204-205.

[6]涂辉,王锋,商庆伟.Python3编程实现网络图片爬虫[J].电脑编程技巧与维护,2017(23):21-22.

作者:李岚清 王恒 晏晓峰 单位:国家工业信息安全发展研究中心