主要有五各方面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