爬蟲系列教程二:如何獲取網頁信息並定位信息所處位置

在爬蟲中如何獲取並定位網頁的信息

由於我們獲取網頁的類型的不同,我們希望爬取的信息的定位方法也有很大差別,但總體來說我們想要爬取的網頁可以分爲靜態和動態,下面講述在不同的情況下如何爬取這些信息;

網頁的不同類型

  • 根據獲取網頁的方式不同可以分爲
    • 靜態網頁
      • 靜態網頁是隻在用戶打開網頁時,網站服務器與用戶的瀏覽器通信一次,用戶便獲取了所有的信息,之後,用戶可以不再與服務器發生任何通信;
    • 動態網頁
      • 動態網頁是用戶打開網頁後,瀏覽器和服務器多次通信,動態地獲取信息,用戶獲取的信息是在瀏覽器和網頁多次交互中獲得的。
    • 爲什麼要區分這兩種網頁
      • 根據定義的不同,我們發現這兩種網頁的獲取信息的方式有很大的不同,前者的所有消息都在第一次通信中獲取,但是後者的信息可能是分散在多次通信中的。我們需要根據需要獲取的信息的位置的不同,採用不同的方法。

爬蟲獲取網頁信息的方法

  • 我們獲取網頁信息方法的核心實現是以儘量少的代價模擬正常用戶請求網頁時的行爲,在獲取信息之後,才能針對網頁進行解析;
  • 我們首先介紹一些獲取網頁信息的工具,然後根據網頁類型的不同,講解如何使用這些工具;
    • 工具一:向服務器發送訪問請求:
      • 這類工具可以模擬瀏覽器向服務器發送訪問的請求,但是獲取到的代碼是未經渲染的,也就是不能運行其中的js代碼;
      • python
        • urilb
        • requests
    • 工具二:用JS引擎渲染爬取到的js代碼:
      • 這類方法可以彌補上一種方法的缺點:無法渲染js,針對動態網頁有極大的作用;
      • PhantomJS
    • 工具三:模擬一個瀏覽點擊網頁:
      • 這類方法直接打開一個瀏覽器進行操作,從性能上來說比較慢,但是對動態網頁具有奇效,適合比較閒適的人(懶人)使用;
      • webdriver
      • selenium
      • ghost
  • 根據網頁類型的不同,我們將獲取網頁信息的方法分爲直接請求、分析請求、和模擬請求法;
    • 靜態網頁
      • 直接請求法
        • 因爲所有的信息都在第一個請求中發送了過來,所以我們直接向服務器請求一個網頁,就可以拿到所有的信息;
        • 我們直接使用工具一中的方法就可以完成,當然我們也可以採用工具三中的方法,但是顯然工具一的性能高,佔用資源少,所以推薦工具一;
        • 注意:有一種特殊情況,網頁中的信息有一部分是用js生成的,但是這部分信息是在第一次請求網頁的時候你可以一次性拿到的,在爬取到的網頁內容中是可以看到在js部分的json數據的,這種情況下,我們也將其歸爲靜態網頁;注意和動態網頁的使用js代碼再次獲取數據相區分;這種情況下,工具一也可,因爲信息拿到了;當然,你也可以用工具二來將數據整合到網頁中,由個人喜好來決定;
    • 動態網頁
      • 由於這類網頁的信息是js向服務器發送請求得到的,但是用工具一中的方法獲取到的js代碼不能被執行,所以我們需要用其它的方法繞過js或者解析js;
      • 分析請求法
        • 這類方法的核心是繞過js,通過抓包分析,閱讀js代碼,從而得到服務器的api接口等規則,從而訪問api接口,得到我們想要的數據(一般是json字符串);
        • 這類方法只使用工具一就可以完成所有的任務,效率高,但是對爬蟲編寫者有較高的要求;
      • 模擬請求法
        • 模擬請求法:想辦法模擬瀏覽器解析js代碼,解析後獲取的html文件,就包含了所有的信息;
        • 我們可以用工具一來獲取所有的代碼,用工具二中渲染js,就得到了完整的網頁;
        • 也可以使用工具三的方法,顯然工具三的自動化程度更高,但是效率也更低,資源佔用情況也更多;
  • 總結一下:
    • 靜態網頁採用工具一、工具二(情況比較特殊)和工具三均可;
    • 動態網頁採用工具一(需要分析api接口)、工具一+工具二、工具三均可;
    • 其中工具一的效率最高,佔用資源最少,難度也相應較大;工具三的效率最低,佔用資源最高,難度也相應較低;

爬蟲定位網頁信息的方法

  • 爬蟲定位網頁信息的步方法分爲兩種:匹配文本、建樹搜索;下面我們按照這兩類方法,具體介紹一下各個工具:
    • 兩類工具
      • 第一類:匹配文本
        • 匹配文本的意思是直接在文本內容上做匹配;
        • 例子:正則表達式;正則表達式就是直接按照一個特定的規則去匹配文本,不需要對網頁的結構進行分析,只需要對需要定位的信息的上下文進行分析;
      • 第二類:建樹搜索
        • 建樹搜索的流程分爲兩步:第一步是建樹,也就是解析;第二步是搜索,搜索的方法是根據樹的結構,搜索想要的內容。
        • 解析大體上有兩個方法:dom,sax;各個瀏覽器大多采用這兩個標準去自己實現一個方法,也有libxml,libxslt,python內置的解析庫等(對java不太熟悉,在網上查閱過程中,發現java有很多解析庫);
        • 搜索的例子:在搜索上,我們有兩類方法,一類是xpath,一類是css選擇器;這兩個方法其實對應解析器的兩類作用對象:文本和樣式表;在chrome、firefox瀏覽器裏面可以直接選擇這兩類方法所對應的路徑;
        • 最後我們經常使用的比較成熟的庫:lxml,bs4,xquery,xpoint:
  • 最後根據網頁類型的不同,我們再來確定我們使用的工具:
    • 靜態網頁
      • 我們獲取的信息由於是html或者css裏面的,我們直接通過匹配文本或者是建樹搜索都可以完成定位信息的功能;
      • 但是注意上面提到的一種特殊情況
        • 如果信息是在js代碼的內部一次性發送過來(注意這裏是一次性發送過來,不是異步發送),我們需要用匹配文本的方式去匹配;
        • 如果這種情況下我們用了當時的渲染js代碼的方法,我們就也可以用建樹搜索了;
    • 動態網頁
      • 如果獲取網頁信息是用分析api的方法:我們從json數據中拿到信息;
      • 如果我們的網頁信息是用js引擎渲染的方法,我們又有兩種處理方法:
        • 第一種是我們用文本匹配、或者建樹搜索;
        • 第二種是我們使用js引擎直接操作dom api,找出相應的內容;這種方法在上面介紹定位信息的工具的時候沒有講,適合js比較熟練的同學;
        • 第三種是我們用模擬請求法獲取信息時,這個時候用文本匹配、或者建樹搜索都可以;

參考資料

[1] 百科XML https://baike.baidu.com/item/XML%E8%A7%A3%E6%9E%90%E5%99%A8/2673664?fr=aladdin
[2] 百科DOM https://baike.baidu.com/item/%E6%96%87%E6%A1%A3%E5%AF%B9%E8%B1%A1%E6%A8%A1%E5%9E%8B/1033822?fromtitle=DOM&fromid=50288&fr=aladdin
[3] 知乎DOM https://www.zhihu.com/question/34219998
[4] XSL頁面 https://www.w3.org/Style/XSL/
[5] 百科Xpath https://baike.baidu.com/item/XPath
[6] Xpath官網 https://www.w3.org/TR/xpath/all/
[7] Libxml2官網 http://xmlsoft.org/
[8] Libxlst教程 http://xmlsoft.org/XSLT/tutorial/libxslttutorial.html
[9] LXML官網 https://lxml.de/
[10] html5lib官網 https://html5lib.readthedocs.io/en/latest/html5lib.html#
[11] 幾個概念的對比 https://www.zhihu.com/question/20097166
[12] bs和lxml的對比 https://www.zhihu.com/question/26494302

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章