網絡爬蟲筆記

主要有五各方面css

1、爬取html

使用各類方法應對不一樣情景下的數據抓取html5

爬取的情景:python

  (1)網頁爬取mysql

    <1>服務端渲染正則表達式

      頁面的結果是由服務器渲染後返回的,有效信息包含在請求的 HTML 頁面裏面redis

      處理方法:用一些基本的 HTTP 請求庫實現爬取,如 urllib、urllib三、pycurl、hyper、requests、grab 等框架,應用較多的是 requests 算法

    <2>客戶端渲染sql

      頁面的主要內容由 JavaScript 渲染而成,真實的數據是經過 Ajax 接口等形式獲取的數據庫

      處理方法:

        A.尋找Ajax接口

          用 Chrome/Firefox 的開發者工具直接查看 Ajax 具體的請求方式、參數等內容,還能夠經過設置代理抓包來查看接口(如 Fiddler/Charles)而後用 HTTP 請求庫模擬

        B.模擬瀏覽器執行

          適用於網頁接口和邏輯較爲複雜的狀況,能夠直接以可見便可爬的方式進行爬取,如可使用 Selenium、Splinter、Spynner、pyppeteer、PhantomJS、Splash、requests-html 等來實現

        C.直接提取JavaScript 數據

          此種情形適用於真實數據沒有通過 Ajax 接口獲取,而是直接包含在 HTML 結果的某個變量中,直接使用正則表達式將其提取

        D.模擬執行JavaScript

          某些狀況下直接模擬瀏覽器執行效率會偏低,若是把 JavaScript 的某些執行和加密邏輯摸清楚了,能夠直接執行相關的 JavaScript 來完成邏輯處理和接口請求,好比使用 Selenium、PyExecJS、PyV八、js2py 等庫來完成

  (2)App爬取

    <1>普通接口

      直接抓包拿到接口的具體請求形式,可用的抓包工具備 Charles、Fiddler、mitmproxy

    <2>加密參數接口

      一種方法能夠實時處理,例如 Fiddler、mitmdump、Xposed 等,另外一種方法是將加密邏輯破解,直接模擬構造便可,可能須要一些反編譯的技巧

    <3>加密內容接口

      使用可見便可爬的工具 Appium;使用 Xposed 來 hook 獲取渲染結果;反編譯找出加密算法,直接模擬;改寫手機底層來實現破解

    <4>很是規協議接口

      可使用 Wireshark 來抓取全部協議的包,或者使用 Tcpdump 來進行 TCP 數據包截獲

2、解析

解析爬取下來的結果並保留有效信息

  (1)普通解析:

    <1>正則表達式,經常使用庫re

    <2>XPath,經常使用庫lxml、Scrapy Selector

    <3>CSS Selector,經常使用庫pyquery、cssselect

     <4>JSON、XML,使用json、xml2dict

  (2)智能解析

    <1>readability 算法

    <2>疏密度判斷

    <3>Scrapyly 自學習

    <4>深度學習

3、存儲

選用適合的存儲媒介來存儲有效信息

  (1)文件

    如 JSON、CSV、TXT、圖片、視頻、音頻等,經常使用的一些庫有 csv、xlwt、json、pandas、pickle、python-docx 等

  (2)數據庫

    分爲關係型數據庫、非關係型數據庫,如 MySQL、MongoDB、HBase 等,經常使用的庫有 pymysql、pymssql、redis-py、pymongo、py2neo、thrift

  (3)搜索引擎

    如 Solr、ElasticSearch 等,便於檢索和實現⽂本匹配,經常使用的庫有 elasticsearch、pysolr 等

  (4)雲存儲

    如七牛雲、又拍雲、阿里雲、騰訊雲、Amazon S3 等,經常使用的庫有 qiniu、upyun、boto、azure-storage、google-cloud-storage 等

4、反爬

  (1)非瀏覽器檢測

    識別Headers裏面有沒有包含User-Agent

  (2)封 IP

    <1>尋找手機站點、App站點,若是存在此類站點,反爬會相對較弱

    <2>使用代理

    <3>在代理的基礎上維護本身的代理池,防止代理浪費,保證明時可用

    <4>搭建ADSL撥號代理,穩定高效

  (3)驗證碼

    對於普通圖形驗證碼,若是很是規整且沒有變形或干擾,可使用 OCR 識別,也可使用機器學習、深度學習來進行模型訓練,固然打碼平臺是最方便的方式;

    對於算術題驗證碼,推薦直接使用打碼平臺;

    對於滑動驗證碼,可使用破解算法,也能夠模擬滑動。後者的關鍵在於缺口的找尋,可使用圖片比對,也能夠寫基本的圖形識別算法,也能夠對接打碼平臺,也可使用深度學習訓練識別接口;

    對於點觸驗證碼,推薦使用打碼平臺;

    對於手機驗證碼,可使用驗證碼分發平臺,也能夠購買專門的收碼設備,也能夠人工驗證;

    對於掃二維碼,能夠人工掃碼,也能夠對接打碼平臺;

  (4)封帳號

    尋找手機站點或 App 站點,此種類別一般是接口形式,校驗較弱;

    尋找無登陸接口,儘量尋找⽆無需登陸便可爬取的接口;

    維護 Cookies 池,使用批量帳號模擬登陸,隨機挑選可用 Cookies 使用便可;

  字體反爬

5、加速

  (1)多線程/進程

    使用多進程和多線程能夠大大提升抓取效率,如使用 threading、multiprocessing 等

  (2)異步

    將爬取過程改爲非阻塞形式,當有響應式再進行處理,不然在等待時間內能夠運行其餘任務,如使用 asyncio、aiohttp、Tornado、Twisted、gevent、grequests、pyppeteer、pyspider、Scrapy 等

  (3)分佈式

    共享爬取隊列,可使用 celery、huey、rq、rabbitmq、kafka 等來實現任務隊列的對接,也可使用現成的框架 pyspider、Scrapy-Redis、Scrapy-Cluster 等

  (4)優化

    <1>DNS緩存

    <2>使用更快的解析方法

      BeautifulSoap的lxml模式比html5lib模式快不少

    <3>使用更高效的去重方法

      基於Redis去重相對更高效,對接BloomFilter實現更快更節省空間

    <4>模塊分離化管控

      <1>將Scrapy項目打包爲Docker鏡像,用K8S控制調度過程

      <2>將Scrapy項目部署到Scrapyd,使用專用的管理工具管理,如SpiderKeeper、Gerapy

參考資料

連接:https://pan.baidu.com/s/1dGozl8FahrxnSZdEetOyRA 提取碼:ci8b

相關文章
相關標籤/搜索