淺談網絡爬蟲

公衆號文章連接css

什麼是網絡爬蟲?

在這裏插入圖片描述
爬蟲,又稱爲 網頁蜘蛛(spider),就是可以在互聯網中檢索本身須要的信息的程序或腳本。

爬蟲,簡單的說就是一個http(https)請求,獲取到對面網頁的源碼,而後從網頁的源碼中抓取本身須要的信息。而html代碼的規則是基於xml的,因此能夠經過必定解析規則和邏輯完成咱們的數據。html

爬蟲能幹什麼

爬蟲能幹的事情比較多,而且有些領域和爬蟲都有很大的關聯。不一樣深度,技術的爬蟲工做者能幹的事情也不一樣。前端

搜索引擎

在這裏插入圖片描述

  • 你熟知的谷歌、百度、360等搜索都是網絡爬蟲+算法+db存儲造成的一套持久運行、相對穩定的系統。固然,這類爬蟲並非大部分人都能接觸的,一般這類對硬件成本和算法的要求較高,要知足必定的爬行速率、爬行策略而且你還要經過必定算法檢索文本、挖掘文本 ,經過文本價值和外鏈數量等等判權信息給搜索排名加權。具體不作過多介紹。筆者也不會。可是若是有興趣徹底能夠運用開源軟件或者工具作個站內搜索,或者局域搜索。這個若是有興趣能夠實現,雖然可能效果很差。

搶票、刷票等自動化軟件

在這裏插入圖片描述

  • 你可能見過一些搶票軟件好比12306搶票。而購票的一個過程其實也就是一個http的請求(post)購票。在你手點時間卡的確定沒有程序快。因此程序的優點在這裏就出來了。
  • 同理,遇到一些拉票,投票的幾萬票的,你能夠根據寫個爬蟲小程序去完成。

部分破解軟件

  • 你會見到一些諸如pandownload全網vip視頻免費看付費知識/文檔下載qq機器人等等。有經驗的爬蟲工程師不只僅可以解析http請求,而tcp-ip等請求涉及到的各類加密也能處理的很是得手。然而這些人就能開發出一些讓人感到黑科技的東西。

金融等行業數據挖掘、分析數據來源

  • 隨着大數據熱門,相關的系列領域和相關領域如數據挖掘、分析以及人工只能的。由於數據的生產者是有限的,好比新浪微博、淘寶、京東、金融等其餘等就能夠本身生產數據。而其餘人若是想要這些數據集,那麼要麼經過官方可能給的部分可憐的api、數據。要麼就是買(很貴),要麼就是本身爬。經過爬蟲的數據能夠作輿情分析,數據分析等等。數據自己是沒有價值的,然而經過挖掘處理以後就極具商業、研究價值。

其餘

  • 數據是一個公司的核心。市面上有不少相似產品或者功能,有不少中小部分的數據核心來自於他人,因此爬蟲對於他們公司相當重要。
  • 而諸如校園輔助app博客一鍵搬遷新聞等諮詢,等等非官方受權的應用卻有着官網app的功能都是基於網絡爬蟲實現。還有不少就不具體介紹。

爬蟲很簡單

在這裏插入圖片描述
就拿一個csdn的我的主頁來講 blog.csdn.net/qq_40693171
在這裏插入圖片描述

語言的選擇

  • 對於初學者確定會對選擇java和python有些java愛好者可能會有點難受。對於java和python的爬蟲。不能全全論之。由於各個語言有各個語言的特點。
  • 就爬蟲而言,我的感受用python更方便,得益於python精簡的語法和弱類型變量。可以伸縮自如。這樣還有一點就是python的字典操做起來遠比java的Map方便。而java的強變量讓書寫變得稍加繁瑣。
  • 可是若是遇到多線程,高併發問題其實仍是java佔優。python只能用多進程來優化速度而假的多線程對性能提高有限。

對於python爬蟲經常使用的庫有java

名稱 主要功能 依賴
requests 負責網頁請求,代理等處理,封裝urllib2(用起來麻煩)等庫,使得操做簡化。不須要考慮編碼、解碼等較麻煩的問題 pip install requests
Beautifulsoup 很是好用的dom解析器,還有css選擇器。匹配正則等,而選用lxml當作解析 pip install bs4,pip install lxml
xpath 解析效率最高,和BeautifulSoup能夠選擇一個學習便可 pip install lxml
re 正則庫,不少特殊匹配須要正則來完成 內置
Senlenuim/ChromeDriver+PhantomJS 模擬瀏覽器行爲,執行點擊事件,簡單粗暴,可是速度慢 須要安裝對應庫和對應驅動

至於框架,scrapy流行。就不介紹 對於java爬蟲經常使用的庫有node

名稱 主要功能
HttpURLConnection java.net下包。不少其餘包都基於此包進行封裝
HttpClient 基於 HttpURLConnection進行封裝,更加友好的解決參數,Cookie,Session等問題。
jsoup 基於HttpClient進行封裝,更加方便的發送請求。此外jsoup的另外一個重大功能就是他是一個很是良好的dom解析器。使用起來很是簡單。
Senlenuim+PhantomJS 解決動態渲染解析不了的問題,同上

至於框架,java的框架比較多,可是流行度卻沒python的scrapy高。本身能夠查詢各類框架進行對比。固然本身也可使用spring+mybatis進行封裝。若是項目比較大。python

兩種語言的小demo

對於上面的主頁,若是用python來完成數據提取git

import requests
from bs4 import BeautifulSoup

url='https://blog.csdn.net/qq_40693171'
req=requests.get(url)
res=req.text#html 源碼
soup=BeautifulSoup(res,'lxml')#轉爲bea--對象
node=soup.find(id='mainBox').find_all(attrs={'class':'article-item-box'})
for link in node:
    value=link.h4
    print(value.text)
複製代碼

運行結果 github

在這裏插入圖片描述
若是用java來完成

package com.bigsai;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;

public class test {
    public static void main(String[] args) throws IOException {
        String url="https://blog.csdn.net/qq_40693171";
        Document doc= Jsoup.connect(url).get();
        Elements elements=doc.getElementById("mainBox").select(".article-item-box");
        for(Element element:elements)
        {
            Element node=element.select("h4").get(0);
            System.out.println(node.text());
        }
    }
}
複製代碼

運行結果 web

在這裏插入圖片描述

這樣,一個簡單的爬蟲就完成了。是否勾起你對爬蟲的興趣?ajax

爬蟲也不簡單

  • 可是不少公司,網站的網址他們的數據是不太想隨便讓人爬的。有的網站給了robot.txt文件。規定那些爬蟲能夠爬。可是這些又是很矛盾的。由於若是你想要搜索引擎收錄你,你確定要容許百度,谷歌,360等爬蟲程序訪問你的網站,才能收錄,搜索排名才能靠前。不然你的網站就成單機站點了。網站會處理或者拒絕非正常訪問的請求。好比檢索你的請求非人爲。請求過快等等。

爬蟲與反爬蟲的鬥爭由此開始。

ip、瀏覽器頭(User-Agent)、和cookie限制

在這裏插入圖片描述
一個http請求要攜帶不少頭信息帶給後臺,後臺也可以獲取這些信息。那百度的首頁打開F12刷新
在這裏插入圖片描述

  • 可是網站大部分會根據你所在的公網ip進行封禁訪問。若是你訪問過快,就會招來403 forbidden。因此你須要使用代理ip來讓對面認爲你的ip沒問題。
  • 還有部分網站會針對User-Agent等其餘信息進行判斷。因此你須要多準備幾個User-Agent,好比谷歌的,IE的,360的隨機使用便可。
  • 而有些網站會根據cookie進行封禁。由於有的cookie儲存了用戶的一些信息。若是網站根據cookie來進行限制,那麼你不只要找的到這樣cookie池維護,還要記得維持cookie的活性。而新浪微博的反扒策略就是基於cookie鑑定。因此你須要到淘寶購買已登陸過的cookie池才能拿到更多的數據。

需登陸的驗證碼限制、參數限制

在這裏插入圖片描述
有不少數據是開放能夠查看的,可是也有不少數據須要註冊登陸以後才能查看數據的,好比國內的各大招聘網站都須要你先登陸而後才能爬取。

對於普通驗證碼來講,你大體有四個選擇。

  1. 繞過驗證碼,直接手動登陸用網站,複製cookie放到請求的去抓取數據。這種最不智能也是最簡單的方法。(pandownload就是內置一個瀏覽器driver而後你手動登陸後它獲取你的cookie信息而後一波操做)
  2. 將驗證碼下載到本地(應用),讓用戶識別填寫而後登陸。
  3. 經過人工智能和數字圖像相關技術,提早訓練好驗證碼識別模型,在遇到驗證碼時候執行程序識別。對於簡單的驗證碼識別。也有很多開源做品。
  4. 經過打碼平臺,讓第三方專業打碼。

而對於滑塊以及其餘奇葩如滑塊,點選等等,那你要麼藉助第三方,要麼就是本身研究其中js運轉流程。以及交付方式。算法原理,仍是很複雜的。筆者這部分也不是特別瞭解。只是略知一二。

不只如此,在登陸環節,每每還會遇到一些其餘參數的會放到JavaScript裏面,這須要你抓到比較。有的還會針對你的數據進行加密傳到後臺。這就須要你嫺熟的js解密能力了。

JavaScript渲染/ajax加密

  • 有很多頁面的數據是經過ajax或者JavaScript渲染進去的。而在數據上,爬蟲沒法識別、執行JavaScript代碼,只能藉助webdriver+phantomjs等模擬執行js獲取數據。或者就是本身研究js流程。弄懂裏面參數變化過程。可是實際是至關有難度的。畢竟人家一個團隊寫的邏輯,要你一我的(還不是搞前端的搞懂)真的是太困難的。因此,爬蟲工程師的水平區別在解決這些複雜問題就體現出來了。
  • 而異步傳輸若是藉口暴露,或者能找到規則還好。若是作了加密限制,又是比較棘手的問題。
    在這裏插入圖片描述
    在這裏插入圖片描述

爬蟲知識儲備路線

雖然一些高難度的爬蟲確實很難,沒有必定的工做經驗和時間研究確實很難變強。可是咱們仍是可以經過掌握一些大衆知識可以知足生活、學習的平常需求和創意。

1.基礎語法:

  • 不管你使用java和python,爬蟲也是程序,你首先要掌握這門編程語言的語法。而基礎語法入門也不須要過久,可是仍是 須要一點時間,不能急於求成。

2.正則和爬蟲相關庫,以及瀏覽器F12抓包和Fidder等抓包工具抓包

  • 當掌握基礎語法後,爬蟲一些簡單好用的基本庫須要花時間學習。正如上面表格所列的庫。須要熟練掌握。在其中必定要學會使用抓包。簡單分析請求的參數和地址等信息。而fiddler是一款強大的抓包工具。經過配置你也能夠嘗試抓安卓的包,爬去app的數據。至於簡單抓包瀏覽器就能夠完成。推薦谷歌瀏覽器

3.紮實的語法

  • 由於一個爬蟲項目它的數據是有層次的,因此你須要良好的邏輯和編程習慣,抓取這些數據可以清晰的存儲而不混亂。而且url遍歷也須要深度優先遍歷或者廣度有限遍歷等策略。須要熟悉這些基本算法,熟悉語言中集合模塊的使用。

4. 多線程、數據庫、線程安全相關知識。

  • 單線程的爬蟲是沒靈魂的爬蟲,必定要試試多線程,多進程爬蟲的快感,然而這個過程可能會遇到封ip等問題,須要你本身搭建一個ip池。

5. 分佈式的概念和知識。

  • 一直單機的爬蟲是沒靈魂的爬蟲。要試試多臺程序多線程跑一個爬蟲任務。固然,這裏就會遇到分佈式鎖的問題。須要你對該方面稍微瞭解。運用。

6. js進階、逆向等知識.

  • 隨着先後端分離,js流行等等,網頁其實對於爬蟲變得複雜,難度和學習成本也在提高。試着找一些登陸網站模擬登陸,調用一些開源算法等等。這部分其實才是真正大佬能力體現。當可以識別這種加密,然而其餘app協議也就能慢慢解開。完成一些牛逼的事情。

總結

在這裏插入圖片描述

  • 爬蟲雖然不少時候方便了咱們,可是這也是一道邊緣產業。存在不少不肯定的因素。學習、娛樂,作個小demo還行。若是侵權請謹慎。(不過初學者的技術很難侵權哈哈)。
  • 對於爬蟲學習資源。淘寶的視頻能夠買。有些會比較陳舊。有不少優秀博主的博文、專欄均可以參考。
  • 還有就是說一點,最近兩年python很火,爬蟲也很火,AI也很火。可是火歸火,工做歸工做。也不能太盲目從衆。理性看待。(我的觀點,不喜勿噴)

另外,若是文章有說的很差的地方還請大佬指出。我也寫過一些爬蟲和筆記。若是須要能夠參考

Python爬蟲

github爬蟲代碼和資料https://github.com/javasmall/python 在github上有個爬蟲學習資料,gitbook格式感受很喜歡。大佬能夠star下。

在這裏插入圖片描述


  • 歡迎關注個人我的公衆號:bigsai
  • 相關文章
    相關標籤/搜索