網絡爬蟲直播觀看總結(掘金直播第十期)

前言

第一次完整看了一次技術直播,靜距離地接觸到了崔慶才老師,正是他的網易課程讓我入了爬蟲的門,成功地開發爬蟲爬取到了想要的數據,體驗了數據抓取的樂趣。藉此良機,在這裏我想簡單總結整理一下我所學到的以及此次直播聽到的關於爬蟲的全部知識,有什麼地方不夠準確,歡迎你們指正,相互學習。(哭,在崔神寫完以後發佈,壓力很大的,參考部分很多,畢竟主要按崔神思路來寫的,崔神分享連接:juejin.im/post/5bce82…html

文章分爲六部分,按照崔老師的思路講下去,同時穿插我的補充python

  • 爬取
  • 解析
  • 存儲
  • 框架scrapy
  • 防反爬
  • 加速

爬取

這一部分主要講的是怎麼才能拿到想要的數據源正則表達式

爬取類型

主要分爲兩種:算法

  • 服務端渲染(頁面結果是由服務器渲染後返回的,有效信息包含在請求直接返回的HTML頁面中)

服務器端渲染架構圖

  • 客戶端渲染(頁面結果由JavaScript渲染而成,html 僅僅做爲靜態文件,客戶端在請求時,服務端不作任何處理,直接以原文件的形式返回給客戶端,而後根據 html 上的 JavaScript,生成 DOM 插入 html顯示數據)

針對不一樣類型,解決方法天然不一樣數據庫

服務端渲染類型解決方法

對於第一種服務端渲染類型,直接經過各類庫請求拿到HTML頁面便可(數據在HTML頁面上) 這裏列舉以下庫可作參考研究深刻:json

  • urllib(Python自帶的原生底層庫)
  • urllib3(相比urllib增長不少新特性和功能)
  • pycurl(libcurl的Python實現)
  • hyper(支持HTTP2的新特性)
  • requests(應用最普遍的HTTP請求庫,推薦)
  • grab(基於urllib3和PyQuery封裝)

客戶端渲染類型解決方法

此種情形通常是用第一種方法沒法請求查看到想要抓取的數據,採用如下四種方法瀏覽器

  • 尋找Ajax請求

AJAX 是一種用於建立快速動態網頁的技術。經過在後臺與服務器進行少許數據交換,AJAX 可使網頁實現異步更新。這意味着能夠在不從新加載整個網頁的狀況下,對網頁的某部分進行更新。有不少使用 AJAX的應用程序案例:新浪微博、Google 地圖、開心網等等。服務器

解決方法:多線程

直接使用 Chrome/Firefox 的開發者工具直接查看 Ajax 具體的請求方式、參數等內容,而後用 HTTP 請求庫模擬便可架構

另外還能夠經過設置代理抓包來查看接口,如 Fiddler/Charles

  • 模擬瀏覽器執行

適用於網頁接口和邏輯較複雜的狀況

使用 Selenium、Splinter、Spynner、pyppeteer、PhantomJS、Splash、requests-html 等來實現

  • 直接提取JavaScript數據

此種狀況數據隱藏在JavaSript變量中,直接利用正則表達式等方式提取解析便可

  • 模擬執行JavaScript

直接模擬瀏覽器執行效率低,能夠經過執行JavaScript完成數據獲取,經過Selenium、PyExecJS、PyV八、js2py 等庫幫助完成

APP數據爬取

  • 普通接口 直接請求

抓取HTTP/HTTPS數據包,利用 Charles、Fiddler、mitmproxy軟件

  • 加密參數接口

接口的參數通過加密,每次請求有隨機生成的token 一是能夠實時處理,利用 Fiddler、mitmdump、Xposed 等,其次能夠是將加密邏輯破解,直接模擬構造規則便可,還能夠直接反編譯破解。

  • 加密內容接口

接口返回結果通過加密

1.利用Appium,可見便可爬,相似Selenium 2.Xposed 使用hook來獲取結果 3.反編譯 找出使用的加密算法,模擬便可 4.改寫手機底層操做系統源碼

  • 很是規協議

利用WireShark抓取全部協議包 利用Tcpdunp抓取TCP數據包

數據解析

數據源拿到了,不少地方無用信息太多,須要咱們進一步進行數據清洗加工

  • HTML頁面數據 利用四大種數據解析方法,(在相應的庫中都會提供),Xpath,CSS,正則表達式,Selector,這些解析都有各自的解析規則,每一個拿些例子用用就記住會用了,推薦用Xpath

  • 其餘類型 對於接口返回的json,xml類型,直接用json,xml2dict庫處理便可

以上解析都是每次爬取一個網頁數據,就要從新構造數據解析規則,甚是繁瑣麻煩,若是數據量不大,本身複製粘貼都比較方便,那樣有沒有一種方法解決這個問題呢

機器學習大展身手的今天,爬蟲領域也有它的身影。因而有了智能解析!

下面分爲四個方法進行了劃分:

  • readability算法,這個算法定義了不一樣區塊的不一樣標註集合,經過權重計算來獲得最可能的區塊位置。
  • 疏密度判斷,計算單位個數區塊內的平均文本內容長度,根據疏密程度來大體區分。
  • Scrapyly 自學習,是 Scrapy開發的組件,指定⻚頁⾯面和提取結果樣例例,其可自學習提取規則,提取其餘同類頁⾯。
  • 深度學習,使⽤用深度學習來對解析位置進⾏有監督學習,須要⼤量標註數據。

固然如今機器學習算法的準確率還不能達到100%,會有數據出錯,水比較深

存儲

數據解析下來後,數據就得存儲起來,能夠做爲數據挖掘和機器學習的數據源,這裏說一下常見的存儲方式

  • 文件 如 JSON、CSV、TXT、圖⽚、視頻、⾳頻等
  • 數據庫,分爲關係型數據庫、非關係型數據庫,如 MySQL、MongoDB、HBase 等
  • 搜索引擎,如 Solr、ElasticSearch 等,便於檢索和實現⽂本匹配
  • 雲存儲,某些媒體文件能夠存到如七⽜牛雲、又拍雲、阿里雲、騰訊雲、Amazon S3 等

框架

從請求數據源到清洗解析數據,最後到存儲,這個爬蟲的基本三部就這樣結束了,用python的各類庫,是否是以爲很亂,下面我就簡單說說關於爬蟲的框架,這些開源的爬蟲框架把複雜的問題解決掉,而後封裝,提供各類類函數讓咱們用的很簡單、方便,沒必要考慮那些URL去重、代理、線程池管理等等問題,每次開發只須要着重考慮抓取邏輯,可是想入手框架,有必定門檻,建議看看源碼,多想一想他們的設計思想以及實現邏輯。

以上是一些經常使用框架的對比圖,沒有絕對的好壞,不一樣的框架需求點不一樣

最近學習了scrapy框架,所以在這裏總結一下主要的邏輯圖,不細說 先上邏輯圖

主要的邏輯步驟八步(由標號1開始到8):

  • 首先第一次經過start_url設置爬取首頁面,調用內置的start_request方法發起requests請求交給爬蟲引擎ENGINE處理
  • ENGINE交給SCHEDULER調度器處理
  • 調度器隊列調度發起requests請求
  • 由調度器發起的requests請求ENGINE將其交給DOWNLOADER請求下載網頁
  • 請求返回response結果交給ENGINE
  • ENGINE將請求返回的response交給spider解析
  • spider解析返回數據清洗整理成的items項,並解析其中頁面可能含有的新連接生成requests,一樣交至ENGINE
  • ENGINE將items項交給ITEM PIPELINES存儲,requests交給調度器調度

以上即是主要scrapy框架邏輯,其中MIDDLEWARE稱爲中間件,分爲downloader middleware(用以另外處理requests和response對象)和spider middleware(一個Scrapy的spider處理機制的鉤子框架,你能夠插入自定義的功能用來處理engine發往spider的response和spider發往engine的request和item)

scrapy框架博大精深,持續挖掘中。。。。。

反爬

隨着公司對本身數據的保護意識不斷提升,如今不少小公司網站都已經添加反爬檢測,爬蟲能夠說是愈來愈不容易

防爬方式有非瀏覽器檢測,封IP,封帳號,字體反爬等

封ip,帳號

爬久了會拒絕服務請求,可經過交替更換ip爬取,用代理解決,能夠分爲幾種狀況來處理:

  • 首先尋找手機站點、App 站點,若是存在此類站點,反爬會相對較弱,先找軟柿子下手嘛。
  • 使用代理,如抓取免費代理、購買付費 Tor 代理、Socks 代理等。
  • 在代理的基礎上維護本身的代理池,防止代理浪費,保證明時可用。
  • 搭建 ADSL 撥號代理,穩定高效。
  • 尋找無登陸接口,儘量尋找⽆無需登陸便可爬取的接口。
  • 維護 Cookies 池,使⽤用批量帳號模擬登陸,使⽤時隨機挑選可用 Cookies 使⽤便可

驗證碼

  • 普通圖形驗證碼,若是很是規整且沒有變形或干擾,可使用 OCR 識別,也可使用機器學習方面圖片識別來模型訓練,固然打碼平臺是最方便的方式。
  • 對於算術題驗證碼,推薦直接使用打碼平臺。
  • 對於滑動驗證碼,可使用破解算法,也能夠模擬滑動(模擬真人拖動規律先是加速滑動後減速)。後者的關鍵在於缺口的找尋,可使用圖片比對,也能夠寫基本的圖形識別算法,也能夠對接打碼平臺,也可使用深度學習訓練識別接口。
  • 對於點觸驗證碼,推薦使用打碼平臺。對於手機驗證碼,可使用驗證碼分發平臺,也能夠購買專門的收碼設備,也能夠人工驗證
  • 對於掃二維碼,能夠人工掃碼,也能夠對接打碼平臺。

加速

數據量大時候,高效快速爬取是當下的關鍵問題

  • 多進程,多線程
  • 異步
  • 分佈式
  • 優化
  • 架構

最後捧上崔神總結的腦圖,致敬崔神!

最後我想說一下本身的感覺,當初學爬蟲就是爲了爬取數據自動化生成表格,解決生活中的繁雜重複無心義的事,機緣巧合竟在其中尋找到了一些樂趣成就感,深刻學習了很多,想把爬蟲做爲之後的主要方向,但隨着我不斷地瞭解認識到現在爬蟲的前景不是特別明朗,而後因爲不少方面緣由吧,也是參考崔神建議,最終決定把爬蟲做爲興趣做爲一個支線帶着作一作,會一如既往地繼續學習研究下去,由於我知道抓取大量數據那種成就感是貨真價實,是無關乎任何外界因素的我的,全部若是你們也有一樣的糾結疑慮,但願個人分享能夠給你一些參考,沒事的時候,讓咱們拋下一切,迴歸當初學爬蟲的心態,多爬爬數據,感覺其中的魅力。

相關文章
相關標籤/搜索