劉守唯 陳豪



摘 要:本文主要利用目前主流的大數據工具,將網絡上的招聘職位數據采集之后,經過清洗整理等步驟,存入大數據倉庫中以備后續調用。研究記錄下整個過程及過程中遇到的問題和解決方案:采用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函數關閉文件。