基于Scrapy、Spark和Hive的网络数据采集、存储与分析研究

2020-03-10 22:36刘守唯陈豪
科学与财富 2020年33期

刘守唯 陈豪

摘 要:本文主要利用目前主流的大数据工具,将网络上的招聘职位数据采集之后,经过清洗整理等步骤,存入大数据仓库中以备后续调用。研究记录下整个过程及过程中遇到的问题和解决方案:采用Scrapy开源采集包,编写Python采集程序,将数据成功存入数据仓库Hive中,利用Sqoop将数据传输到MySQL,为后期数据展示做准备。该案例的典型工作过程与遇到的典型问题,可以为其他类似场合下采集、存储和分析其他种类网络数据的研究提供一些见解。

关键词:Scrapy;Sqoop;Hive;大数据采集;大数据存储

ABSTRACT: This paper mainly uses the current mainstream big data tools to collect the recruitment position data on the network, and then through the cleaning and sorting steps, stores them into the big data warehouse for subsequent calls. Research and record the whole process and the problems encountered in the process and solutions: using scrapy open source collection package, writing Python collection program, successfully storing the data in hive data warehouse, using sqoop to transfer the data to MySQL, preparing for the later data display. The typical working process and typical problems of this case can provide some insights for the research of collecting, storing and analyzing other kinds of network data in other similar situations.

Keywords: scratch; sqoop; hive; big data acquisition; big data storage

目前,計算机领域大数据技术发展迅猛,海量数据资源作为大数据技术的“矿藏”,是该技术能够蓬勃发展的物质材料基础。通过网络采集数据是典型的大数据采集的手段之一,采集到的数据还需要“提纯”,通过清洗步骤去除掉无用的空数据、错数据及无效数据,然后存入数据仓库,为后续的数据开发提供材料。导师给我们的选题,是编写Python采集程序,使用主流的Scrapy技术进行数据采集,生成csv本地文件,然后用Spark对csv文件进行清洗;在Hive中利用create语句建立内部表的数据结构,之后用load命令将清洗后的csv导入到Hive中完成数据存储。接下来就是编写HQL语句对数据进行分析从而生成临时显示表,之后将该临时表保存hive中内部表,然后在MySQL中建立对应的表结构,利用Sqoop将Hive里的数据传输进来,完成流程。在这个过程中我们解决掉各种问题,将的整合后统计数据成功提取到了结构化存储中。导师给予的这个研究案例,是具有典型特征的工作过程,与解决掉的典型问题一起,可以应用在其他类似场合下采集与存储其他种类网络数据的工作中。

1网络数据采集

Scrapy是使用最广泛的网络数据采集开源包之一。利用PyCharm IDE,配合安装python3以上版本,并导入Scrapy的包。同时需要配合的重要的库有:XML的处理工具包lxml,用于代码结构解析;HTTP 请求urllib 库,用于批量解析网址;fake_useragent库,用于仿造浏览器请求;线程库,用于多现程同时访问提高采集效率。设计实现思路:仿造请求头访问进入目标网站;爬取目标网站各职位信息url;遍历所有职位url再爬取各职位详细信息url;向服务器发送请求并保存数据。具体来说,设定网址http://www.*****.com/zhaopin,伪造请求头:headers = {  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0'},发送含有伪造请求头的请求,服务器返回response = requests.get(start_url,headers = HEADERS).text,再用lxml进行树状解析response = etree.HTML(response),抽取树状结构中的有效数据,传递到变量中。该过程循环多次,最终将所有有效数据存入文件中。

实现时,需添加随机时间间隔来防止服务器屏蔽:通过Scrapy的settings文件的参数来实现,DOWNLOAD_DELAY = random.randint(2, 5),就是2秒到5秒钟随机抽取休息时间,模拟真实人的访问频率。要通过多线程来提高采集速度,具体到Scrapy中使用多并发、异步IO来实现,关键语句为:CONCURRENT_REQUESTS = 16 #多线程。还要注意的一个问题是:Scrapy默认是不采集网站不希望我们访问的结点的,但往往有效数据就处于结点之上,所以必须关闭机器人协议,具体操作为修改设置:ROBOTSTXT_OBEY = False。最后,将采集到的数据写入文件,通过Scrapy的items.py文件中,定义要保存的各个字段的名称,之后再piplines的功能,打开要写入的文件,调用process_item函数来对数据进行保存,写入完毕后用close_spider函数关闭文件。