胡俊瀟 陳國偉


摘 ?要:網絡爬蟲在工作時會對目標站點發送大量的請求,這樣的爬蟲工作方式決定了其會消耗不少目標站點的服務器資源,這對于一個服務器不大的中小型站點來說負載是巨大的,甚至會導致該站點直接崩潰。另外某些網站也不希望自己的內容被輕易的獲取,如電商網站的交易額,這些數據是一個互聯網產品的核心,因此采取一定的手段保護敏感的數據。因此很多網站都在站點中加入了反爬機制。例如User-Agent+Referer檢測、賬號登陸及Cookie驗證等。文章討論了幾種主流的方法來避免爬蟲被目標站點服務器封禁,從而保證爬蟲的正常運行。
關鍵詞:網絡爬蟲;反爬蟲;抓取策略
中圖分類號:TP393.092 ? ? 文獻標志碼:A ? ? ? ? 文章編號:2095-2945(2019)15-0137-03
Abstract: Web crawlers send a large number of requests to the target site when they work. this way of crawler work determines that it will consume a lot of server resources of the target site, which is a huge load for a small and medium-sized site with small and medium-sized servers. It can even cause the site to crash directly. In addition, some websites do not want their content to be easily accessed, such as the transaction volume of e-commerce websites, these data is the core of an Internet product, so take certain means to protect sensitive data. As a result, many sites have added anti-crawling mechanisms to their sites. For example, User-Agent + Referer detection, account login and Cookie verification. In this paper, several mainstream methods are discussed to avoid the crawler being blocked by the target site server, so as to ensure the normal operation of the crawler.
Keywords: Web crawler; anti-crawler; crawling strategy
網絡中承載的信息隨著互聯網的發展呈現出了爆炸式發展的趨勢,如何從豐富龐大的信息中快速找到自己需要的信息變得越來越重要。越來越多的機構、個人使用網絡爬蟲技術去網站中獲取信息,大量的爬蟲訪問會使該網站的訪問速度減慢甚至無法訪問[1],因此,很多網站引入了反爬機制來防止網絡爬蟲頻繁的訪問。下面列舉了幾種主流的反爬策略。
1 模擬登陸
模擬登陸指通過計算機程序代碼模擬普通用戶使用瀏覽器登陸某網站的過程。有的網站在進行內容展示的時候,需要用戶完成登陸操作,如果需要爬蟲此類型的頁面,就要求爬蟲能夠模擬用戶的正常登陸行為。其技術核心主要可以分為兩個部分:(1)抓包分析;(2)程序實現。
互聯網中的網頁在進行通信時是遵循HTTP協議的,網站服務器向訪問者返回的response是由訪問時的參數決定的,抓包的目的就是通過捕捉人為操作中的一系列請求記錄,從中找到用戶操作的關鍵請求參數。
在請求訪問某網頁時,request請求中攜帶了兩部分參數: Request Method與Headers。
Request Method即HTTP請求方法,目前較為主流的是GET、POST兩種請求方式,GET方法用來訪問已知的頁面,訪問成功后指定資源的服務器返回響應內容。POST向指定資源提交特定的數據進行請求,例如提交表單,這些特定的數據包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
Headers中包含了Accept、Accept-Encoding、Accept-Language、Connection、Cookie、Host、Referer、User-Agent等信息。Accept指的是可以接收的信息類型,例如僅接收視頻文件。Accept-Encoding是指瀏覽器能夠進行解碼的數據編碼方式,比如gzip。Accept-Language指的是瀏覽器所希望收到的數據語言種類,有的服務器提供多種語言,但這種時候必須要用到這個參數。Connection指的是是否需要保持連接。Host指的是初始URL中的主機和端口。
Cookie是Headers中最重要的請求頭信息之一,網站的服務器通過Cookie來標識區別不同的用戶。HTTP是一種無狀態的連接,當服務器同時收到多個請求時,服務器是無法判斷該請求來自哪一個客戶端,于是需要Cookie來標識用戶的身份,儲存用戶的狀態信息,如登陸狀態。當用戶第一次登陸網站時,服務器會給瀏覽器下發一個Cookie,瀏覽器將Cookie保存在本地,當在該網站域名內跳轉時,用戶無需再次登陸該網站,同時服務器也能夠識別該請求來自同一個用戶。獲取Cookie的方式有很多種,常用的就是通過抓包直接在瀏覽器中找到相應的Cookies信息,將該信息填入Headers對應的字段中,即可實現訪問。還可以通過在Python使用Selenium庫來調用瀏覽器,使用Selenium庫中提供的find_element(s)_by_xxx的方法來找到目標站點中的賬號密碼輸入框、登陸按鈕等元素進行輸入點擊等操作,登陸后將Cookies保存下來。值得注意的是,Cookie是有時效的,超過時效后在使用該Cookie無法實現訪問了。具體的時效長短每個網站設定的時間不一致,需根據具體網站設置更新Cookie的時間。
2 模擬User-Agent
User-Agent指的是用戶在訪問站點時所使用的客戶端種類和版本,一般指的是所使用的瀏覽器。它是HTTP協議中的一個字段,在用戶訪問站點時,服務器通過該字段就可區分是什么瀏覽器訪問的網站。目前主流的瀏覽器基本上都是IE和Chrome兩種內核的,每個瀏覽器、知名的爬蟲都有其固定的User-Agent[2],因此只要知道這些瀏覽器或者知名爬蟲的User-Agent就可以偽裝成該瀏覽器訪問站點。但知名的爬蟲一般都有固定的IP,如搜索引擎的爬蟲,不容易偽裝。因此偽裝瀏覽器的User-Agent是目前比較主流的偽裝方法之一,因為瀏覽器下載后任何人都可以使用,沒有固定的IP地址。
當訪問一個服務器過于頻繁時,單一的User-Agent會被服務器識別為異常訪問,需要不斷的更換不同瀏覽器的User-Agent來進行反爬,以下是兩個不同內核的瀏覽器User-Agent。版本不同也就意味著所使用的瀏覽器不同,因此除了切換不同內核之外,還可以選擇不同版本的User-Agent。
Chrome內核:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML, like Gecko)Chrome/63.0.3239.132 Safari/537.36
IE內核:Mozilla/5.0(compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
有的網站在進行反爬蟲檢測時,會將Refer與User-Agent一起檢測。Refer代表的意思是這個頁面是從哪里跳轉過來的,如從www.baidu.com跳轉到https://www.sina.com.cn/,Refer就是www.baidu.com。百度統計網站流量來源時就是依靠這個字段。有些站點在收到爬蟲的訪問請求時候會做識別,不是要求內的Refer則不能訪問該頁面,Refer輸入錯誤也會導致無法訪問該頁面。一般來說,使用目標站點的首頁地址作為Refer就可以了。
3 設置爬蟲爬取頻率
爬蟲在一定時間內的爬取量是檢驗一個爬蟲效率的重要標準之一,因此為了加快爬蟲的爬取效率,一般在使用爬蟲時會采用多線程或多進程的方式來對爬蟲節點的CPU內存帶寬等資源進行充分利用,理論上在目標站點服務器沒有做訪問限制的前提下,只要爬蟲節點的內存帶寬資源足夠,采用多進程或多進程的爬蟲爬取效率將會直線上升。一般來說,普通用戶訪問一個網站時往往需要10秒以上,在沒有做出限制時爬蟲一秒能夠爬取上百個頁面。上文提過,這樣的頻繁訪問會導致目標站點服務器崩潰,因此在實際使用中,網站的服務器往往會對爬蟲一段時間內的訪問請求次數做出限制,如果超過限制的閥值,則判定該訪問是一個爬蟲行為,對其封禁或采取其他限制。降低爬蟲的爬取頻率在一定程度上是盡可能的模擬出真人訪問一個普通網站的行為[3],但將爬蟲的頻率降得太低會影響爬蟲的爬取效率,在爬取過程中,需要通過不斷的測試找到網站的閥值限制,在對爬蟲的程序進行修改。在Python中可以直接使用tme.sleep函數進行延時設置。本項目中通過設置間隔抓取時間從而達到降低爬取頻率的目的。
4 設置代理IP池
與降低爬取頻率相比,設置代理IP池是以效率為先。在爬蟲高頻的爬取時,網站服務器會封禁其主機IP,而為了解決這個問題,人們往往使用與模擬User-Agent相似的方法,設置代理服務器,不斷的更換主機的IP及訪問端口,以解除網站服務器對爬蟲的限制。設置代理服務器的方式有兩種:(1)購買可以撥號更改IP的VPN服務。(2)使用代理池中IP不斷更換IP。第二種方式是目前比較主流的。IP代理池可從網上找到開源的免費代理IP池或自建代理IP池,但這類型的IP往往穩定性較差,不可用的幾率很高,如果只是進行簡單的數據爬取,自建IP池能夠滿足需要,當爬取量巨大且爬取周期較長時,自建IP和開源免費的IP往往是不夠用的。所以需要購買服務商提供IP池服務,在爬取時提取IP池中大量的IP進行更換使用。Python在urllib.request庫中封裝了ProxyHandler[4]函數來設置使用代理服務器。
5 其他反爬策略
目前進行反爬的主流方式還有通過官方API獲取及混合反爬兩種方式。(1)API獲取。數據目前已經成為了一種資產,各行業各公司在對數據進行保護時,也有很多公司選擇性的對用戶開放,以供數據相關從業者或者專家學習研究,這些數據往往會封裝成統一的對外API接口,數據從業者可從該接口獲取那些不容易提取的網站數據。目前大型的網站基本都提供了API接口服務,如國外的Facebook,Instagram,國內的微博、騰訊、百度等網站。當有從API中獲取數據的需求時,可以在官方網站上進行API接口的申請,在通過相關的資質認證后,就能通過調用相關API接口來完成數據獲取的操作。因為接口是官方提供的,使用API來進行目標數據獲取的好處顯而易見:避開了網站的各種反爬限制,直接進行數據獲取,減少項目中在反爬部分精力投入。但使用API進行獲取時,缺點也十分突出,只能從接口獲取官方規定好的字段,未加入數據獲取的無法從接口處獲取。如Facebook在獲取數據時,API僅提供了文章的基本數據,而用戶的信息是禁止獲取的。(2)混合反爬。混合反爬指的是在同一項目中使用了多種反爬方法進行數據獲取,一個項目可能會需要兩種以上的方法共同完成爬取任務,同時過程中需要不斷的測試才能得出適合的反爬策略。在實際的項目爬取過程中,因為每個網站所采用的反爬策略并不是單一的,因此會遇到各種混合搭配的反爬問題,如有的網站需要模擬登陸的同時還需要進行網頁重定向處理,有的網站需要降低爬取頻率,同時還需要不斷更換代理,headers等。
6 結束語
本文主要研究了目前主流的幾種反爬策略,在進行實際的項目爬取的時候,根據網站的不同,我們先通過觀察測試找出該網站的爬蟲限制策略,然后使用相應的反爬策略進行數據獲取。
參考文獻:
[1]逄菲.基于Python的分布式網絡爬蟲系統的設計與實現[J].電子技術與軟件工程,2018(23):6.
[2]陳利婷.大數據時代的反爬蟲技術[J].電腦與信息技術,2016,24(6):60-61.
[3]劉石磊.對反爬蟲網站的應對策略[J].電腦知識與技術,2017,13(15):19-21,23.
[4]王星,劉李敦.基于移動代理(Agent)的智能爬蟲系統的設計和實現[J].科技資訊,2007.