胡俊瀟 陳國(guó)偉
摘 ?要:網(wǎng)絡(luò)爬蟲在工作時(shí)會(huì)對(duì)目標(biāo)站點(diǎn)發(fā)送大量的請(qǐng)求,這樣的爬蟲工作方式?jīng)Q定了其會(huì)消耗不少目標(biāo)站點(diǎn)的服務(wù)器資源,這對(duì)于一個(gè)服務(wù)器不大的中小型站點(diǎn)來說負(fù)載是巨大的,甚至?xí)?dǎo)致該站點(diǎn)直接崩潰。另外某些網(wǎng)站也不希望自己的內(nèi)容被輕易的獲取,如電商網(wǎng)站的交易額,這些數(shù)據(jù)是一個(gè)互聯(lián)網(wǎng)產(chǎn)品的核心,因此采取一定的手段保護(hù)敏感的數(shù)據(jù)。因此很多網(wǎng)站都在站點(diǎn)中加入了反爬機(jī)制。例如User-Agent+Referer檢測(cè)、賬號(hào)登陸及Cookie驗(yàn)證等。文章討論了幾種主流的方法來避免爬蟲被目標(biāo)站點(diǎn)服務(wù)器封禁,從而保證爬蟲的正常運(yùn)行。
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲;反爬蟲;抓取策略
中圖分類號(hào):TP393.092 ? ? 文獻(xiàn)標(biāo)志碼:A ? ? ? ? 文章編號(hào):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
網(wǎng)絡(luò)中承載的信息隨著互聯(lián)網(wǎng)的發(fā)展呈現(xiàn)出了爆炸式發(fā)展的趨勢(shì),如何從豐富龐大的信息中快速找到自己需要的信息變得越來越重要。越來越多的機(jī)構(gòu)、個(gè)人使用網(wǎng)絡(luò)爬蟲技術(shù)去網(wǎng)站中獲取信息,大量的爬蟲訪問會(huì)使該網(wǎng)站的訪問速度減慢甚至無法訪問[1],因此,很多網(wǎng)站引入了反爬機(jī)制來防止網(wǎng)絡(luò)爬蟲頻繁的訪問。下面列舉了幾種主流的反爬策略。
1 模擬登陸
模擬登陸指通過計(jì)算機(jī)程序代碼模擬普通用戶使用瀏覽器登陸某網(wǎng)站的過程。有的網(wǎng)站在進(jìn)行內(nèi)容展示的時(shí)候,需要用戶完成登陸操作,如果需要爬蟲此類型的頁(yè)面,就要求爬蟲能夠模擬用戶的正常登陸行為。其技術(shù)核心主要可以分為兩個(gè)部分:(1)抓包分析;(2)程序?qū)崿F(xiàn)。
互聯(lián)網(wǎng)中的網(wǎng)頁(yè)在進(jìn)行通信時(shí)是遵循HTTP協(xié)議的,網(wǎng)站服務(wù)器向訪問者返回的response是由訪問時(shí)的參數(shù)決定的,抓包的目的就是通過捕捉人為操作中的一系列請(qǐng)求記錄,從中找到用戶操作的關(guān)鍵請(qǐng)求參數(shù)。
在請(qǐng)求訪問某網(wǎng)頁(yè)時(shí),request請(qǐng)求中攜帶了兩部分參數(shù): Request Method與Headers。
Request Method即HTTP請(qǐng)求方法,目前較為主流的是GET、POST兩種請(qǐng)求方式,GET方法用來訪問已知的頁(yè)面,訪問成功后指定資源的服務(wù)器返回響應(yīng)內(nèi)容。POST向指定資源提交特定的數(shù)據(jù)進(jìn)行請(qǐng)求,例如提交表單,這些特定的數(shù)據(jù)包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。
Headers中包含了Accept、Accept-Encoding、Accept-Language、Connection、Cookie、Host、Referer、User-Agent等信息。Accept指的是可以接收的信息類型,例如僅接收視頻文件。Accept-Encoding是指瀏覽器能夠進(jìn)行解碼的數(shù)據(jù)編碼方式,比如gzip。Accept-Language指的是瀏覽器所希望收到的數(shù)據(jù)語(yǔ)言種類,有的服務(wù)器提供多種語(yǔ)言,但這種時(shí)候必須要用到這個(gè)參數(shù)。Connection指的是是否需要保持連接。Host指的是初始URL中的主機(jī)和端口。
Cookie是Headers中最重要的請(qǐng)求頭信息之一,網(wǎng)站的服務(wù)器通過Cookie來標(biāo)識(shí)區(qū)別不同的用戶。HTTP是一種無狀態(tài)的連接,當(dāng)服務(wù)器同時(shí)收到多個(gè)請(qǐng)求時(shí),服務(wù)器是無法判斷該請(qǐng)求來自哪一個(gè)客戶端,于是需要Cookie來標(biāo)識(shí)用戶的身份,儲(chǔ)存用戶的狀態(tài)信息,如登陸狀態(tài)。當(dāng)用戶第一次登陸網(wǎng)站時(shí),服務(wù)器會(huì)給瀏覽器下發(fā)一個(gè)Cookie,瀏覽器將Cookie保存在本地,當(dāng)在該網(wǎng)站域名內(nèi)跳轉(zhuǎn)時(shí),用戶無需再次登陸該網(wǎng)站,同時(shí)服務(wù)器也能夠識(shí)別該請(qǐng)求來自同一個(gè)用戶。獲取Cookie的方式有很多種,常用的就是通過抓包直接在瀏覽器中找到相應(yīng)的Cookies信息,將該信息填入Headers對(duì)應(yīng)的字段中,即可實(shí)現(xiàn)訪問。還可以通過在Python使用Selenium庫(kù)來調(diào)用瀏覽器,使用Selenium庫(kù)中提供的find_element(s)_by_xxx的方法來找到目標(biāo)站點(diǎn)中的賬號(hào)密碼輸入框、登陸按鈕等元素進(jìn)行輸入點(diǎn)擊等操作,登陸后將Cookies保存下來。值得注意的是,Cookie是有時(shí)效的,超過時(shí)效后在使用該Cookie無法實(shí)現(xiàn)訪問了。具體的時(shí)效長(zhǎng)短每個(gè)網(wǎng)站設(shè)定的時(shí)間不一致,需根據(jù)具體網(wǎng)站設(shè)置更新Cookie的時(shí)間。
2 模擬User-Agent
User-Agent指的是用戶在訪問站點(diǎn)時(shí)所使用的客戶端種類和版本,一般指的是所使用的瀏覽器。它是HTTP協(xié)議中的一個(gè)字段,在用戶訪問站點(diǎn)時(shí),服務(wù)器通過該字段就可區(qū)分是什么瀏覽器訪問的網(wǎng)站。目前主流的瀏覽器基本上都是IE和Chrome兩種內(nèi)核的,每個(gè)瀏覽器、知名的爬蟲都有其固定的User-Agent[2],因此只要知道這些瀏覽器或者知名爬蟲的User-Agent就可以偽裝成該瀏覽器訪問站點(diǎn)。但知名的爬蟲一般都有固定的IP,如搜索引擎的爬蟲,不容易偽裝。因此偽裝瀏覽器的User-Agent是目前比較主流的偽裝方法之一,因?yàn)闉g覽器下載后任何人都可以使用,沒有固定的IP地址。
當(dāng)訪問一個(gè)服務(wù)器過于頻繁時(shí),單一的User-Agent會(huì)被服務(wù)器識(shí)別為異常訪問,需要不斷的更換不同瀏覽器的User-Agent來進(jìn)行反爬,以下是兩個(gè)不同內(nèi)核的瀏覽器User-Agent。版本不同也就意味著所使用的瀏覽器不同,因此除了切換不同內(nèi)核之外,還可以選擇不同版本的User-Agent。
Chrome內(nèi)核:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML, like Gecko)Chrome/63.0.3239.132 Safari/537.36
IE內(nèi)核:Mozilla/5.0(compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
有的網(wǎng)站在進(jìn)行反爬蟲檢測(cè)時(shí),會(huì)將Refer與User-Agent一起檢測(cè)。Refer代表的意思是這個(gè)頁(yè)面是從哪里跳轉(zhuǎn)過來的,如從www.baidu.com跳轉(zhuǎn)到https://www.sina.com.cn/,Refer就是www.baidu.com。百度統(tǒng)計(jì)網(wǎng)站流量來源時(shí)就是依靠這個(gè)字段。有些站點(diǎn)在收到爬蟲的訪問請(qǐng)求時(shí)候會(huì)做識(shí)別,不是要求內(nèi)的Refer則不能訪問該頁(yè)面,Refer輸入錯(cuò)誤也會(huì)導(dǎo)致無法訪問該頁(yè)面。一般來說,使用目標(biāo)站點(diǎn)的首頁(yè)地址作為Refer就可以了。
3 設(shè)置爬蟲爬取頻率
爬蟲在一定時(shí)間內(nèi)的爬取量是檢驗(yàn)一個(gè)爬蟲效率的重要標(biāo)準(zhǔn)之一,因此為了加快爬蟲的爬取效率,一般在使用爬蟲時(shí)會(huì)采用多線程或多進(jìn)程的方式來對(duì)爬蟲節(jié)點(diǎn)的CPU內(nèi)存帶寬等資源進(jìn)行充分利用,理論上在目標(biāo)站點(diǎn)服務(wù)器沒有做訪問限制的前提下,只要爬蟲節(jié)點(diǎn)的內(nèi)存帶寬資源足夠,采用多進(jìn)程或多進(jìn)程的爬蟲爬取效率將會(huì)直線上升。一般來說,普通用戶訪問一個(gè)網(wǎng)站時(shí)往往需要10秒以上,在沒有做出限制時(shí)爬蟲一秒能夠爬取上百個(gè)頁(yè)面。上文提過,這樣的頻繁訪問會(huì)導(dǎo)致目標(biāo)站點(diǎn)服務(wù)器崩潰,因此在實(shí)際使用中,網(wǎng)站的服務(wù)器往往會(huì)對(duì)爬蟲一段時(shí)間內(nèi)的訪問請(qǐng)求次數(shù)做出限制,如果超過限制的閥值,則判定該訪問是一個(gè)爬蟲行為,對(duì)其封禁或采取其他限制。降低爬蟲的爬取頻率在一定程度上是盡可能的模擬出真人訪問一個(gè)普通網(wǎng)站的行為[3],但將爬蟲的頻率降得太低會(huì)影響爬蟲的爬取效率,在爬取過程中,需要通過不斷的測(cè)試找到網(wǎng)站的閥值限制,在對(duì)爬蟲的程序進(jìn)行修改。在Python中可以直接使用tme.sleep函數(shù)進(jìn)行延時(shí)設(shè)置。本項(xiàng)目中通過設(shè)置間隔抓取時(shí)間從而達(dá)到降低爬取頻率的目的。
4 設(shè)置代理IP池
與降低爬取頻率相比,設(shè)置代理IP池是以效率為先。在爬蟲高頻的爬取時(shí),網(wǎng)站服務(wù)器會(huì)封禁其主機(jī)IP,而為了解決這個(gè)問題,人們往往使用與模擬User-Agent相似的方法,設(shè)置代理服務(wù)器,不斷的更換主機(jī)的IP及訪問端口,以解除網(wǎng)站服務(wù)器對(duì)爬蟲的限制。設(shè)置代理服務(wù)器的方式有兩種:(1)購(gòu)買可以撥號(hào)更改IP的VPN服務(wù)。(2)使用代理池中IP不斷更換IP。第二種方式是目前比較主流的。IP代理池可從網(wǎng)上找到開源的免費(fèi)代理IP池或自建代理IP池,但這類型的IP往往穩(wěn)定性較差,不可用的幾率很高,如果只是進(jìn)行簡(jiǎn)單的數(shù)據(jù)爬取,自建IP池能夠滿足需要,當(dāng)爬取量巨大且爬取周期較長(zhǎng)時(shí),自建IP和開源免費(fèi)的IP往往是不夠用的。所以需要購(gòu)買服務(wù)商提供IP池服務(wù),在爬取時(shí)提取IP池中大量的IP進(jìn)行更換使用。Python在urllib.request庫(kù)中封裝了ProxyHandler[4]函數(shù)來設(shè)置使用代理服務(wù)器。
5 其他反爬策略
目前進(jìn)行反爬的主流方式還有通過官方API獲取及混合反爬兩種方式。(1)API獲取。數(shù)據(jù)目前已經(jīng)成為了一種資產(chǎn),各行業(yè)各公司在對(duì)數(shù)據(jù)進(jìn)行保護(hù)時(shí),也有很多公司選擇性的對(duì)用戶開放,以供數(shù)據(jù)相關(guān)從業(yè)者或者專家學(xué)習(xí)研究,這些數(shù)據(jù)往往會(huì)封裝成統(tǒng)一的對(duì)外API接口,數(shù)據(jù)從業(yè)者可從該接口獲取那些不容易提取的網(wǎng)站數(shù)據(jù)。目前大型的網(wǎng)站基本都提供了API接口服務(wù),如國(guó)外的Facebook,Instagram,國(guó)內(nèi)的微博、騰訊、百度等網(wǎng)站。當(dāng)有從API中獲取數(shù)據(jù)的需求時(shí),可以在官方網(wǎng)站上進(jìn)行API接口的申請(qǐng),在通過相關(guān)的資質(zhì)認(rèn)證后,就能通過調(diào)用相關(guān)API接口來完成數(shù)據(jù)獲取的操作。因?yàn)榻涌谑枪俜教峁┑模褂肁PI來進(jìn)行目標(biāo)數(shù)據(jù)獲取的好處顯而易見:避開了網(wǎng)站的各種反爬限制,直接進(jìn)行數(shù)據(jù)獲取,減少項(xiàng)目中在反爬部分精力投入。但使用API進(jìn)行獲取時(shí),缺點(diǎn)也十分突出,只能從接口獲取官方規(guī)定好的字段,未加入數(shù)據(jù)獲取的無法從接口處獲取。如Facebook在獲取數(shù)據(jù)時(shí),API僅提供了文章的基本數(shù)據(jù),而用戶的信息是禁止獲取的。(2)混合反爬?;旌戏磁乐傅氖窃谕豁?xiàng)目中使用了多種反爬方法進(jìn)行數(shù)據(jù)獲取,一個(gè)項(xiàng)目可能會(huì)需要兩種以上的方法共同完成爬取任務(wù),同時(shí)過程中需要不斷的測(cè)試才能得出適合的反爬策略。在實(shí)際的項(xiàng)目爬取過程中,因?yàn)槊總€(gè)網(wǎng)站所采用的反爬策略并不是單一的,因此會(huì)遇到各種混合搭配的反爬問題,如有的網(wǎng)站需要模擬登陸的同時(shí)還需要進(jìn)行網(wǎng)頁(yè)重定向處理,有的網(wǎng)站需要降低爬取頻率,同時(shí)還需要不斷更換代理,headers等。
6 結(jié)束語(yǔ)
本文主要研究了目前主流的幾種反爬策略,在進(jìn)行實(shí)際的項(xiàng)目爬取的時(shí)候,根據(jù)網(wǎng)站的不同,我們先通過觀察測(cè)試找出該網(wǎng)站的爬蟲限制策略,然后使用相應(yīng)的反爬策略進(jìn)行數(shù)據(jù)獲取。
參考文獻(xiàn):
[1]逄菲.基于Python的分布式網(wǎng)絡(luò)爬蟲系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電子技術(shù)與軟件工程,2018(23):6.
[2]陳利婷.大數(shù)據(jù)時(shí)代的反爬蟲技術(shù)[J].電腦與信息技術(shù),2016,24(6):60-61.
[3]劉石磊.對(duì)反爬蟲網(wǎng)站的應(yīng)對(duì)策略[J].電腦知識(shí)與技術(shù),2017,13(15):19-21,23.
[4]王星,劉李敦.基于移動(dòng)代理(Agent)的智能爬蟲系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)[J].科技資訊,2007.