初識爬蟲的那天,我選擇了Java

管理員賬號

2019-12-04

本科時,畢業論文需要不少網絡上用戶的問答數據。那時,我還沒有搞過網絡爬蟲,只能利用關鍵詞搜索的方式,找到相關數據,然后一條一條復制。我也覺得這樣很傻,但不得不承認這確實我最初的操作方式,很艱難,累的手疼。

后來,讀研究生時,做項目的同時還要搞科研。項目和科研,都需要采集大量的網絡數據。領頭做項目的師兄,指定了一系列國內外網站,并把采集任務分配給我。對于當時啥都不咋會的我,內心“啥?這該咋弄???這咋弄???……”可是沒辦法,即便瑟瑟發抖,硬著頭皮還是要上。

好在有著師兄指點,讓我去學習網路爬蟲,說網路爬蟲可以搞定“我想要的數據”。為了“活”下去,我決定放手一搏,但在學習準備階段我就遇到了我的第一個“爬蟲難題”。

決定要用網絡爬蟲去采集數據,面臨一個選擇就是:是用Java還是Python寫網絡爬蟲呢?對于一個新手,我翻閱了網上各種對比的帖子,各有各的觀點,其中不少說Python上手容易,寫起來方便。但最終我還是選擇了Java,有以下幾點原因:

1.Java火了很多年,而且依舊很火,其生態也比較完善。目前,很多大公司的系統皆采用Java設計,足以說明其強大之處。把Java學好了,足夠讓我找一份不錯的工作,即入職大廠。

2.Java嚴謹規范,對于大型工程、大型程序,如果不規范不嚴謹維護豈不容易出問題。

3.對網絡爬蟲而言,JAVA中也有很多簡單易用的類庫(如Jsoup、Httpclient等),同時還存在不少易于二次開發的網絡爬蟲框架(Crawler4J、WebMagic等)。

4.曾在一個帖子中看到,“世界上99%的人都會選擇一條容易走的大路,因為人都喜歡安逸。這也是人的大腦的思維方式決定的,因為大腦的使命是為了讓你生存,而不是求知。但成功是總是屬于那1%的人,這類人是堅持讓大腦做不愿意做的事的人——求知”。哎,這在我看來,還真有一定的道理。如果勵志想成為一名真正的程序員,建議先學習Java。在此基礎上,如果你對Python感興趣,也是可以快速上手的。

1 網絡爬蟲流程

學習網絡爬蟲之前,先看了普通網絡爬蟲大致流程,如下圖所示:

主要包括5個步驟:

1.選取部分種子URL(或初始URL),將其放入待采集的隊列中。如在Java中,可以放入List、LinkedList以及Queue中。

2.判斷URL隊列是否為空,如果為空則結束程序的執行,否則執行步驟3。

3.從待采集的URL隊列中取出一個URL,獲取URL對應的網頁內容。在此步驟需要使用HTTP響應狀態碼(如200和403等)判斷是否成功獲取到了數據,如響應成功則執行解析操作;如響應不成功,則將其重新放入待采集URL隊列(注意這里需要過濾掉無效URL)。

4.針對響應成功后獲取到的數據,執行頁面解析操作。此步驟根據用戶需求獲取網頁內容中的部分字段,如汽車論壇帖子的id、標題和發表時間等。

5.針對步驟4解析的數據,執行數據存儲操作。

2 需要掌握的Java基礎知識

在使用Java構建網絡爬蟲時,需要掌握很多Java方面的基礎知識。例如,Java中基本的數據類型、Java中的數組操作、判斷語句的使用、集合操作、對象和類的使用、String類的使用、日期和時間的處理、正則表達式的使用、Maven工程的創建、多線程操作、日志的使用等。

看著知識點很多,但如果將其放入到具體的網絡爬蟲實戰項目中去學習,會發現很簡單。下面,我舉兩個例子。

在網絡爬蟲中,我們經常需要將待采集的URL放到集合中,然后循環遍歷集合中的每個URL去采集數據。比如,我們使用Queue集合操作:

另外,在采集數據時,不同網站的時間使用格式可能不同。而不同的時間格式,會為數據存儲以及數據處理帶來一定的困難。例如,下圖為某汽車論壇中時間使用的格式,即“yyyy-MM-dd”和“yyyy-MM-dd HH:mm”兩種類型。

下圖為某新聞網站中的時間使用格式“yyyy-MM-dd HH:mm:ss”。

再如,藝術品網站deviantart的時間使用的是UNIX時間戳的形式。

針對汽車論壇中的“yyyy-MM-dd”和“yyyy-MM-dd HH:mm”格式,可以統一轉化成“yyyy-MM-dd HH:mm:ss”格式,以方便數據存儲以及后期數據處理。此時,可以寫個方法將將字符串類型的時間標準化成指定格式的時間。如下程序:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TimeTest {
  public static void main(String[] args) {
    System.out.println(parseStringTime("2016-05-19 19:17",
        "yyyy-MM-dd HH:mm","yyyy-MM-dd HH:mm:ss"));
    System.out.println(parseStringTime("2018-06-19",
        "yyyy-MM-dd","yyyy-MM-dd HH:mm:ss"));
  }
  /**
   * 字符型時間格式標準化方法
   * @param inputTime(輸入的字符串時間),inputTimeFormat(輸入的格式),outTimeFormat(輸出的格式).
   * @return 轉化后的時間(字符串)
   */
  public static String parseStringTime(String inputTime,String inputTimeFormat,
      String outTimeFormat){
    String outputDate = null;
    try {
      //日期格式化及解析時間
      Date inputDate = new SimpleDateFormat(inputTimeFormat).parse(inputTime);
      //轉化成新的形式的字符串
      outputDate = new SimpleDateFormat(outTimeFormat).format(inputDate);
    } catch (ParseException e) {
      e.printStackTrace();
    }
    return outputDate;
  }
}

針對UNIX時間戳,可以通過如下方法處理:

//將unix時間戳轉化成指定形式的時間
  public static String TimeStampToDate(String timestampString, String formats) {
    Long timestamp = Long.parseLong(timestampString) * 1000;
    String date = new SimpleDateFormat(formats,
        Locale.CHINA).format(new Date(timestamp));
    return date;
  }

3 HTTP協議基礎與網絡抓包

做網絡爬蟲,還需要了解HTTP協議相關的內容,即要清楚數據是怎么在服務器和客戶端傳輸的。

具體需要了解的內容包括:

1.URL的組成:如協議、域名、端口、路徑、參數等。

2.報文:分為請求報文和響應報文。其中,請求報文包括請求方法、請求的URL、版本協議以及請求頭信息。響應報文包括請求協議、響應狀態碼、響應頭信息和響應內容。響應報文包括請求協議、響應狀態碼、響應頭信息和響應內容。

3.HTTP請求方法:在客戶端向服務器發送請求時,需要確定使用的請求方法(也稱為動作)。請求方法表明了對URL指定資源的操作方式,服務器會根據不同的請求方法做不同的響應。網絡爬蟲中常用的兩種請求方法為GET和POST。

4.HTTP狀態碼:HTTP狀態碼由3位數字組成,描述了客戶端向服務器請求過程中發生的狀況。常使用200判斷網絡是否請求成功。

5.HTTP信息頭:HTTP信息頭,也稱頭字段或首部,是構成HTTP報文的要素之一,起到傳遞額外重要信息的作用。在網絡爬蟲中,我們常使用多個User-Agent和多個referer等請求頭來模擬人的行為,進而繞過一些網站的防爬措施。

6.HTTP響應正文:HTTP響應正文(或HTTP響應實體主體),指服務器返回的一定格式的數據。網絡爬蟲中常遇到需要解析的幾種數據包括:HTML/XML/JSON。

在開發網絡爬蟲時,給定 URL,開發者必須清楚客戶端是怎么向服務器發送請求的,以及客戶端請求后服務器返回的數據是什么。只有了解這些內容,開發者才能在程序中拼接URL,針對服務返回的數據類型設計具體的解析策略。因此,網絡抓包是實現網絡爬蟲必不可少的技能之一,也是網絡爬蟲開發的起點。

本文作者錢洋博士所著新書《網絡數據采集技術:Java網絡爬蟲實戰》現已上市。系統地介紹了網絡爬蟲的理論知識和基礎工具,并且選取典型網站,采用案例講解的方式介紹網絡爬蟲中涉及的問題,以增強大家的動手實踐能力。

本書時候國內少見的Java爬蟲寶典。與Python語言相比,使用Java語言進行網絡數據采集,具有采集效率更高、框架性能更好、敏捷易用等優點,而且針對大型搜索引擎系統的數據采集工作更多使用Java語言,故本書值得大家學習。

█ 關 于 作 者

錢洋

合肥工業大學管理科學與工程系博士、CSDN博客專家。作為技術人員參與過多個橫向、縱向學術課題,負責數據采集系統的設計與開發工作。在CSDN(博客名稱:HFUT_qianyang)上撰寫了多篇關于數據采集、自然語言處理、編程語言等領域的原創博客。

姜元春

合肥工業大學教授、博士生導師。長期從事電子商務、商務智能、數據采集與挖掘等方面的理論研究與教學工作。先后主持過國家自然科學基金優秀青年科學基金項目、國家自然科學基金重大研究計劃培育項目、國家自然科學基金青年科學基金項目、教育部人文社科青年基金項目、阿里巴巴青年學者支持計劃、CCF-騰訊犀牛鳥基金項目等課題的研究工作。

█ 大 咖 推 薦

?陳國青 / 清華大學教授、博士生導師

?程學旗 / 中國科學院計算技術研究所研究員、博士生導師

?卓訓方 / 上海數據交易中心項目總監

?劉業政 / 合肥工業大學教授博士生導師

█ 本書內容結構

第 1 ~3 章

這3 章重點介紹與網絡爬蟲開發相關的基礎知識,其中包括網絡爬蟲的原理、Java 基礎知識和HTTP 協議等內容。

第 4~6 章

這3 章分別從網頁內容獲取、網頁內容解析和網絡爬蟲數據存儲3 個方面介紹網絡爬蟲開發過程中所涉及的一系列技術。在這3 章中,涉及很多開源工具的使用,如Jsoup、HttpClient、HtmlCleaner、Fastjson、POI3 等。

第 7 章

本章利用具體的實戰案例,講解網絡爬蟲開發的流程。通過對本章的學習,讀者可以輕松開發Java 網絡爬蟲。

第 8 章

針對一些復雜的頁面,如動態加載的頁面(執行JavaScript 腳本),本章介紹了一款實用的工具——Selenium WebDriver。

第 9 章

本章重點介紹了3 種比較流行的Java 網絡爬蟲開源框架,即Crawler4j、WebCollector 和WebMagic。讀者可根據數據采集需求,自行開發支持多線程采集、斷點采集、代理切換等功能的網絡爬蟲項目。

讀者評論

相關博文

  • 社區使用反饋專區

    陳曉猛 2016-10-04

    尊敬的博文視點用戶您好: 歡迎您訪問本站,您在本站點訪問過程中遇到任何問題,均可以在本頁留言,我們會根據您的意見和建議,對網站進行不斷的優化和改進,給您帶來更好的訪問體驗! 同時,您被采納的意見和建議,管理員也會贈送您相應的積分...

    陳曉猛 2016-10-04
    3682 620 3 6
  • 迎戰“雙12”!《Unity3D實戰核心技術詳解》獨家預售開啟!

    陳曉猛 2016-12-05

    時隔一周,讓大家時刻掛念的《Unity3D實戰核心技術詳解》終于開放預售啦! 這本書不僅滿足了很多年輕人的學習欲望,并且與實際開發相結合,能夠解決工作中真實遇到的問題。預售期間優惠多多,實在不容錯過! Unity 3D實戰核心技術詳解 ...

    陳曉猛 2016-12-05
    2321 34 0 1
  • czk 2017-07-29
    3014 22 0 0

推薦用戶

澳洲幸运10现场开奖 河北11选走势图基本走势 彩计划排列五下载 专业期货配资公司 广西11选5开奖号码公告 北京体彩快中彩号码统计器 黑龙江11选五基本走势 1000炒股一年最多挣多少 湖北11选5走势 快乐10分下载 30选5今天开奖结果53期