基础网络爬虫(Web crawler)相关技术浅析
文章目錄
- 前言
- 基本概念
- Robots協議
- 基本原理
- 現狀概況
- 爬蟲軟件
- 跨語言
- Selenium
- Python
- urllib
- requests
- Scrapy
- Pyspider
- Java
- WebMagic
- WebCollector
- 技術分析
- 網絡請求
- 獲取請求
- 瀏覽器開發者工具
- 瀏覽器插件
- 網絡抓包工具
- 請求認證
- 拷貝認證
- 認證請求
- 模擬認證
- 驗證碼
- IP限制
- UA限制
- 流量限制
- 請求簽名
- 請求加密
- 流程控制
- 多線程并發
- 內容提取
- 壓縮
- 加密
- JavaScript腳本
- HTML
- 正則表達式
- xpath
- BeautifulSoup
- Jsoup
- JSON
- json
- FastJson
- 媒體
- 其他
- 數據存儲
- 文本
- CSV
- JSON
- POI
- 數據庫
- 參考文章
前言
萬維網上有著無數的網頁,包含著海量的信息,無孔不入、森羅萬象。但很多時候,無論出于數據分析或產品需求,我們需要從某些網站,提取出我們感興趣、有價值的內容,但是縱然是進化到21世紀的人類,依然只有兩只手,一雙眼,不可能去每一個網頁去點去看,然后再復制粘貼。所以我們需要一種能自動獲取網頁內容并可以按照指定規則提取相應內容的程序,這就是爬蟲。
基本概念
網絡爬蟲(Web crawler),是一種“自動化瀏覽網絡”的程序,或者說是一種網絡機器人。它們被廣泛用于互聯網搜索引擎或其他類似網站,
以獲取或更新這些網站的內容和檢索方式。
目前,網絡上已經有很多開源的爬蟲軟件,像Larbin(c++語言實現,只負責網頁抓取,不負責解析和存儲),Nutch(開源Java 實現的搜索引擎),Heritrix(java開發的單實例的爬蟲)。
按照系統結構和實現技術,爬蟲可以分為通用網絡爬蟲,聚焦網絡爬蟲,增量式網絡爬蟲和深層網絡爬蟲。像百度,谷歌就是一種大型復雜的網絡通用網絡爬蟲,通用網絡爬蟲大多提供基于關鍵字的收索,難以支持根據語義信息提出的查詢,因此,聚焦網絡爬蟲應運而生。聚焦爬蟲將目標定位為抓取某特定主題內容,為面向主題的用戶查詢準備數據資源。相比之下,增量網絡爬蟲難度更大,它需要進一步爬取更新的新產生的網頁數據,而不重新下載未發生變化的網頁。web頁面可以分為表層網頁和深層網頁,通用網絡爬蟲通常是爬取表層網頁,而需要登錄或注冊的網頁就需要深層網絡爬蟲。常常,爬蟲技術是多種技術的交替使用。
Robots協議
Robots協議(也稱為爬蟲協議、機器人協議等)的全稱是“網絡爬蟲排除標準”(Robots ExclusionProtocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取.
根據協議,網站管理員可以在網站域名的根目錄下放一個robots.txt 文本文件,里面可以指定不同的網絡爬蟲能訪問的頁面和禁止訪問的頁面,指定的頁面由正則表達式表示。網絡爬蟲在采集這個網站之前,首先獲取到這個文件,然后解析到其中的規則,然后根據規則來采集網站的數據。
基本原理
傳統爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統的一定停止條件。
聚焦爬蟲的工作流程較為復雜,需要根據一定的網頁分析算法過濾與主題無關的鏈接,保留有用的鏈接并將其放入等待抓取的URL隊列。然后,它將根據一定的搜索策略從隊列中選擇下一步要抓取的網頁URL,并重復上述過程,直到達到系統的某一條件時停止。
另外,所有被爬蟲抓取的網頁將會被系統存貯,進行一定的分析、過濾,并建立索引,以便之后的查詢和檢索;所以一個完整的爬蟲一般會包含如下四個模塊:
現狀概況
爬蟲軟件
八爪魚:https://www.bazhuayu.com/
跨語言
Selenium
官網:https://www.selenium.dev/
Selenium是一個自動化測試工具,對各種瀏覽器都能很好地支持,包括Chrome、Firefox這些主流瀏覽器。使用它就可以模擬瀏覽器進行各種各樣的操作,包括爬取一些網頁內容。
Python
Python是編寫爬蟲程序的常用工具。Python中有多個模塊使得爬蟲編寫非常簡單,常用的模塊有:urllib、requests、re、bs4、Scrapy、Selenium等。
urllib
urllib是Python自帶的一個用于爬蟲的庫,其主要作用就是可以通過代碼模擬瀏覽器發送請求。其常被用到的子模塊在Python3中的為urllib.request和urllib.parse,在Python2中是urllib和urllib2。
requests
雖然Python的標準庫中 urllib2 模塊已經包含了平常我們使用的大多數功能,但是它的 API 使用起來讓人感覺不太好,而 Requests 自稱 “HTTP for Humans”,說明使用更簡潔方便。
Requests 唯一的一個非轉基因的 Python HTTP 庫,人類可以安全享用:)
Requests 繼承了urllib2的所有特性。Requests支持HTTP連接保持和連接池,支持使用cookie保持會話,支持文件上傳,支持自動確定響應內容的編碼,支持國際化的 URL 和 POST 數據自動編碼。
requests 的底層實現其實就是 urllib3
Requests的文檔非常完備,中文文檔也相當不錯。Requests能完全滿足當前網絡的需求,支持Python 2.6—3.5,而且能在PyPy下完美運行。
開源地址:https://github.com/kennethreitz/requests
中文文檔 API: http://docs.python-requests.org/zh_CN/latest/index.html
Scrapy
Scrapy,是Python開發的一個快速,高層次的爬蟲框架,用于抓取web站點并從頁面中提取結構化的數據。Scrapy用途廣泛,可以用于數據挖掘、監測和自動化測試。Scrapy吸引人的地方在于它是一個框架,任何人都可以根據需求方便的修改。它也提供了多種類型爬蟲的基類,如BaseSpider、sitemap爬蟲等。
上圖是Scrapy的架構圖,綠線是數據流向,首先從初始URL 開始,Scheduler 會將其交給 Downloader 進行下載,下載之后會交給 Spider 進行分析,需要保存的數據則會被送到Item Pipeline,那是對數據進行后期處理。另外,在數據流動的通道里還可以安裝各種中間件,進行必要的處理。
Pyspider
pyspider 是一個用python實現的功能強大的網絡爬蟲系統,能在瀏覽器界面上進行腳本的編寫,功能的調度和爬取結果的實時查看,后端使用常用的數據庫進行爬取結果的存儲,還能定時設置任務與任務優先級等。
Java
WebMagic
官網:http://webmagic.io/
WebMagic是一個簡單靈活的Java爬蟲框架?;赪ebMagic,你可以快速開發出一個高效、易維護的爬蟲。
WebCollector
GitHub: https://github.com/CrawlScript/WebCollector
WebCollector是一個無須配置、便于二次開發的JAVA爬蟲框架(內核),它提供精簡的的API,只需少量代碼即可實現一個功能強大的爬蟲。WebCollector-Hadoop是WebCollector的Hadoop版本,支持分布式爬取。
技術分析
網絡請求
發送一個正確的網絡請求是爬蟲的第一步。
參考:爬蟲基礎——網絡請求
獲取請求
得到一個網絡請求的所有數據才能知道如何編寫爬蟲
瀏覽器開發者工具
瀏覽器插件
網絡抓包工具
請求認證
拷貝認證
直接拷貝認證相關的信息到爬蟲程序中,以達到認證的目的。
eg:爬蟲中遇到登陸問題的解決方法
認證請求
根據網絡抓包、編寫認證過程、讓程序完成認證過程,保存認證信息。
認證方式
此外,以上認證方式也可能組合使用,比如OAuth2 + JWT
數據加密
部分網站會對認證信息進行加密處理,例如Base64、AES、RSA等。
eg:Web安全——某大學統一身份認證平臺登錄時密碼加密方式
模擬認證
對于目標網站認證過程比較復雜的情況下、使用Selenium等操作模擬工具,模擬輸入、點擊等操作,完成認證,保存認證信息。
驗證碼
驗證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart” 的縮寫(全自動區分計算機和人類的圖靈測試),是一種區分用戶是計算機還是人的公共全自動程序。
繞過驗證碼
某一些情形下,并不需要去識別驗證碼
文本
一串隨機生成的字母或數字序列(顯示為扭曲的圖像)和一個文本框。要通過測試并證明您的人類身份,只需在文本框中輸入您在圖像中看到的字符即可。
為了增加難度,提供了數學驗證碼,該驗證碼顯示有容易閱讀的數字,并且涉及基本的數學運算問題;同時還有3D驗證碼,該驗證碼顯示具有3D效果的字符。
解決方案:
人工
打碼平臺
爬蟲程序將驗證碼傳給打碼平臺的識別接口,打碼平臺將驗證碼發給后端的“傭工”進行識別,并獲取識別結果。
參考:https://zhuanlan.zhihu.com/p/24011861
OCR識別(涉及人工智能相關領域-圖像識別,文本識別)
OCR,即 Optical Character Recognition,光學字符識別。是指通過掃描字符,然后通過其形狀將其翻譯成電子文本的過程。
也可以調用API接口,例如百度OCR
圖像
通常為用戶提供的是物體、動物、人或風景的圖像,而不是失真的文本,以此來區分人和計算機程序。驗證碼要求用戶選擇它們標識的正確圖像,或將滑塊拖動到圖像中以使其完整。
解決方案:
圖像識別(涉及人工智能相關領域-圖像識別,圖像分類)
參考:https://www.sohu.com/a/304263172_814235
也可以調用API接口,例如百度PaddleOCR
音頻
利用從錄音中提取的隨機單詞或數字,將它們組合在一起,甚至給它們添加一些噪音,然后要求用戶輸入在錄音中聽到的單詞或數字。
解決方案:
語音識別(涉及人工智能相關領域)
也可以調用API接口,例如百度、阿里云、騰訊云
短信
解決方案:
其他
IP限制
如果目標網站對訪問的速度或次數要求較高,那么你的 IP 就很容易被封掉,也就意味著在一段時間內無法再進行下一步的工作。
偽造X-Forwarded-For
X-Forwarded-For(XFF)是用來識別通過HTTP代理或負載均衡方式連接到Web服務器的客戶端最原始的IP地址的HTTP請求頭字段。 Squid 緩存代理服務器的開發人員最早引入了這一HTTP頭字段,并由IETF在Forwarded-For HTTP頭字段標準化草案中正式提出。
這一HTTP頭一般格式如下:
X-Forwarded-For: client1, proxy1, proxy2
其中的值通過一個 逗號+空格 把多個IP地址區分開, 最左邊(client1)是最原始客戶端的IP地址, 代理服務器每成功收到一個請求,就把請求來源IP地址添加到右邊。
但是這種方式容易被防范:關于X-Forwarded-For被偽造情況下獲取真實ip的處理
IP代理
代理IP又稱代理服務器,是網絡信息的中轉站,這是一種特殊的網絡服務,簡單來說使用IP代理可以更改用戶的IP地址。它是介于瀏覽器和Web服務器之間的一臺服務器,有了它之后,Request信號會先送到代理服務器,由代理服務器來取回瀏覽器所需要的信息并傳送給你的瀏覽器。在日常生活中,我們使用IP代理,大多數是用來連接INTERNET(國際互聯網)和INTRANET(局域網)。
ADSL
ADSL 全稱叫做 Asymmetric Digital Subscriber Line,非對稱數字用戶環路,因為它的上行和下行帶寬不對稱。它采用頻分復用技術把普通的電話線分成了電話、上行和下行三個相對獨立的信道,從而避免了相互之間的干擾。 有種主機叫做動態撥號 VPS 主機,這種主機在連接上網的時候是需要撥號的,只有撥號成功后才可以上網,每撥一次號,主機就會獲取一個新的 IP,也就是它的 IP 并不是固定的,而且 IP 量特別大,幾乎不會撥到相同的 IP,如果我們用它來搭建代理,既能保證高度可用,又可以自由控制撥號切換。
UA限制
UA即為用戶代理(User-Agent),服務器通過UA識別訪問者的身份。當網站針對指定UA的訪問,返回異常頁面(如403,500)或跳轉到其他頁面的情況,即為UA禁封。
解決方案:
反爬機制:UA檢測
反反爬策略:UA偽裝
流量限制
爬蟲限速,模擬真實用戶瀏覽。
請求簽名
對請求的url、header、body一部分或者多部分進行簽名。
這種請求往往數據中會出現sign等代表簽名的字段。
參考:https://blog.csdn.net/sergiojune/article/details/93555686
請求加密
對請求的url、header、body一部分或者多部分進行加密。
流程控制
多線程并發
對于,獲取單一類型的不同數據情況下,比如獲取用戶信息,對于每一個用戶的之間是不會影響的,可以采用多線程同時去獲取多個用戶的數據。
內容提取
壓縮
請求headers的Accept-Encoding字段表示瀏覽器告訴服務器自己支持的壓縮算法(目前最多的是gzip),如果服務器開啟了壓縮,返回時會對響應體進行壓縮,爬蟲需要自己解壓;
加密
有些敏感數據的請求,會對數據內容進行加密。
JavaScript腳本
前大多數網頁屬于動態網頁(內容由javascript動態填充),尤其是在移動端,SPA/PWA應用越來越流行,網頁中大多數有用的數據都是通過ajax/fetch動態獲取后然后再由js填充到網頁dom樹中,單純的html靜態頁面中有用的數據很少。
模擬JS操作
引入JavaScript 引擎執行JS腳本
Python中執行JS代碼,通常兩個庫: js2py、pyexecjs
HTML
正則表達式
正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為"元字符")。
xpath
XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。
BeautifulSoup
BeautifulSoup是一個Python模塊,該模塊用于接收一個HTML或XML字符串,然后將其進行格式化,之后遍可以使用他提供的方法進行快速查找指定元素,從而使得在HTML或XML中查找指定元素變得簡單。
Jsoup
Jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數據。
JSON
json
Python2.7中自帶了JSON模塊,直接import json即可。
FastJson
FastJson是阿里巴巴的開源Java JSON解析庫,它可以解析JSON格式的字符串,支持將Java Bean序列化為JSON字符串,也可以從JSON字符串反序列化到JavaBean
媒體
其他
數據存儲
文本
CSV
JSON
POI
eg:Word、Execl
數據庫
參考文章
- 爬蟲技術淺析
- 爬蟲技術現狀分析
- 淺談爬蟲技術
- Python 爬蟲介紹
- Python 爬蟲一 簡介
- java爬蟲(一)主流爬蟲框架的基本介紹
- 爬蟲訪問中,如何解決網站限制IP的問題?
- 爬蟲如何解決驗證碼的問題
- 爬蟲基礎(動態加載,數據解析)
總結
以上是生活随笔為你收集整理的基础网络爬虫(Web crawler)相关技术浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Cloud——基于Dubb
- 下一篇: 使用postman发送json数据报错4