李 培
(1.西安郵電大學(xué)計(jì)算機(jī)學(xué)院 西安 710121)(2.西安郵電大學(xué)陜西省網(wǎng)絡(luò)數(shù)據(jù)智能處理重點(diǎn)實(shí)驗(yàn)室 西安 710121)
網(wǎng)絡(luò)爬蟲是可以自動地大量抓取網(wǎng)頁數(shù)據(jù)的計(jì)算機(jī)程序和腳本,別稱:網(wǎng)絡(luò)蠕蟲、spider(網(wǎng)頁蜘蛛)。網(wǎng)絡(luò)爬蟲的相關(guān)研究到現(xiàn)在為止,除了Robots 這一“君子協(xié)定”外,并無相關(guān)的法律法規(guī)對其明顯限制,反而是“大數(shù)據(jù)”的浪潮將網(wǎng)絡(luò)爬蟲的地位日漸上升。將來爬蟲還會不斷為人們的工作生活帶來便利,為社會的發(fā)展提供知識的支持。網(wǎng)絡(luò)爬蟲一方需得注意自身行為,網(wǎng)站一方可在Robots協(xié)議上同各方達(dá)成默契,奉獻(xiàn)出自己非核心數(shù)據(jù),同時(shí)也是在為自己的發(fā)展提供窗口[1]。
本研究在進(jìn)行網(wǎng)絡(luò)爬蟲的相關(guān)研究時(shí),提前已經(jīng)明確了需要爬取的網(wǎng)頁內(nèi)容信息,如文章的題目(title),文章的URL 以及創(chuàng)建日期、點(diǎn)贊數(shù)以及收藏?cái)?shù)等。因此,實(shí)驗(yàn)中網(wǎng)絡(luò)爬蟲獲取的數(shù)據(jù)并非是要竊取他人的勞動成果,而是對網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行數(shù)據(jù)分析,形成結(jié)構(gòu)化的數(shù)據(jù)。同時(shí)也是對繁雜的網(wǎng)絡(luò)數(shù)據(jù)的萃取、解讀。雖說,數(shù)據(jù)眾寡代表不了大數(shù)據(jù)的價(jià)值高低,但是大量的數(shù)據(jù)可以更有機(jī)會提取有價(jià)值的信息,帶來更有意義的應(yīng)用[2~3]。
本研究選擇使用數(shù)據(jù)庫為MySQL,對應(yīng)的連接數(shù)據(jù)庫管理工具為navicat。編程語言使用目前最為流行的Python,網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)的具體框架為Scrapy。Scrapy 是基于Python 開發(fā)的一個(gè)高層次的快速的網(wǎng)頁抓取框架,用于抓取web 站點(diǎn)信息并從頁面中提取結(jié)構(gòu)化的數(shù)據(jù)[4]。目前網(wǎng)站大多數(shù)都偏向是BeautifulSoup+requests,因此相對而言Scrapy是輕量級的,且Scrapy 功能齊全。Scrapy 相當(dāng)于建房的框架,同時(shí),Scrapy 可以在需要的時(shí)候?qū)雛equests 和beautifulsoup 庫進(jìn)行使用。因此本文選擇使用Scrapy框架完成網(wǎng)絡(luò)爬蟲的設(shè)計(jì)和實(shí)現(xiàn)[5]。
Scrapy框架的優(yōu)勢[6]有:
1)Scrapy 框架是基于twisted 而開發(fā)的。twisted 是一個(gè)異步I/O 的框架,異步I/O 的特點(diǎn)使得在處理批量數(shù)據(jù)時(shí)效率更高,因此Scrapy性能也是非常高的。
2)Scrapy 內(nèi)置有css 和xpath 選擇器,對獲取的數(shù)據(jù)做selector非常方便,同時(shí),selector也是相當(dāng)強(qiáng)大,可以完全代替beautifulsoup。
3)Beautifulsoup 是一個(gè)使用純Python 編寫的庫,而Scrapy 中的lxml 是使用C 語言寫的框庫,前面我們已經(jīng)對各種語言的速度做過描述,運(yùn)行速度可達(dá)到上百倍。
在網(wǎng)絡(luò)爬蟲進(jìn)行爬取網(wǎng)站的實(shí)驗(yàn)之前,我們需要弄清楚目標(biāo)網(wǎng)站的域名結(jié)構(gòu)和層次,這樣才能更好地去編寫代碼邏輯,更有效地獲得網(wǎng)頁數(shù)據(jù)。分析研究的網(wǎng)站,其URL 連接結(jié)構(gòu)以主域名為中心,主域名下分有首頁、資訊、文章等子域名,也就是導(dǎo)航部分。在子域名下是更詳細(xì)的文章URL。因此,設(shè)計(jì)本網(wǎng)絡(luò)爬蟲爬取該網(wǎng)站數(shù)據(jù)的基本邏輯為
1)獲取導(dǎo)航下的所有URL。
2)進(jìn)入第一個(gè)導(dǎo)航獲得所有文章標(biāo)題URL。
3)進(jìn)入第一個(gè)標(biāo)題獲取文章數(shù)據(jù)。
4)返回上一頁獲取下一個(gè)標(biāo)題URL 并進(jìn)入獲取詳細(xì)文章的數(shù)據(jù),直到獲取完這個(gè)子域名下的所有文章數(shù)據(jù)。
5)返回首頁對下一個(gè)子域名執(zhí)行以上操作。
以上的邏輯存在一個(gè)問題,那就是環(huán)路。分析該網(wǎng)站結(jié)構(gòu)就會發(fā)現(xiàn)獲取文章所有URL 時(shí)會回到首頁。這時(shí),就涉及到URL的去重[7]。
在爬蟲的去重策略中,最簡單的去重策略就是將所爬取到的URL 存放到數(shù)據(jù)庫中,當(dāng)取到下一個(gè)URL 時(shí)就數(shù)據(jù)庫中進(jìn)行比對。如果取到了相同的URL 時(shí)跳過,自動往下獲取。由于每一次取到URL都得到數(shù)據(jù)庫中比對,無疑大大降低了爬取效率,所以這種方法的使用是比較少的。通常使用的另一個(gè)方法??梢詫⑷〉降腢RL 存放到內(nèi)存中,在取出URL 比對時(shí)就大大降低了耗費(fèi)的時(shí)間。在將數(shù)據(jù)存到內(nèi)存的同時(shí),對URL 進(jìn)行md5 編碼。通常md5 的編碼長度為16byte,也就是說每個(gè)URL可以縮減到16byte,對內(nèi)存的壓力成倍減少。本文在對伯樂在線網(wǎng)站文章的爬取就采用這個(gè)去重策略。
2.2.1 爬取策略
我們可以以樹形圖詳細(xì)地描述網(wǎng)站的域名層級結(jié)構(gòu),由于樹形圖比較復(fù)雜,為了方便對問題進(jìn)行分析,因此可以簡化成二叉樹。通過二叉樹遍歷網(wǎng)站所有的URL,這樣我們就可以獲取到整站的內(nèi)容。在設(shè)計(jì)爬蟲邏輯時(shí),為了更好地完成對網(wǎng)站數(shù)據(jù)的爬取,就需要通過算法更合理地對爬蟲邏輯結(jié)構(gòu)進(jìn)行設(shè)計(jì)。網(wǎng)絡(luò)爬蟲的頁面爬行策略有深度優(yōu)先遍歷,廣度優(yōu)先遍歷和最佳優(yōu)先遍歷[8]。本文設(shè)計(jì)實(shí)現(xiàn)對該網(wǎng)站文章爬取的網(wǎng)頁搜索策略使用的是深度優(yōu)先算法。
2.2.2 設(shè)計(jì)思路
本文所設(shè)計(jì)實(shí)現(xiàn)的爬蟲主要爬取某指定目標(biāo)網(wǎng)站的所有文章,獲取的內(nèi)容包括文章標(biāo)題、作者及URL、正文、日期、點(diǎn)贊數(shù)、收藏?cái)?shù)、評論數(shù)、首頁圖、tag。通過對網(wǎng)站頁面的分析??梢酝ㄟ^“最新文章”頁面獲得所有文章,而不需要對全站URL 的爬取。因此,把這個(gè)頁面作為目標(biāo)頁。
通過“最新文章”頁面獲取全部文章的策略有兩個(gè)。第一種:對比頁面跳轉(zhuǎn)URL 的變化,是在“page/”后數(shù)字變化,因此可以通過對數(shù)字的遞增而獲得所有文章。第二種:獲取“下一頁”鏈接不斷跳轉(zhuǎn),從而獲取所有文章。本文設(shè)計(jì)的爬蟲采用第二種方法。進(jìn)入詳情頁可通過標(biāo)題URL 進(jìn)入,本文通過首頁圖URL進(jìn)入。
前面已經(jīng)對該目標(biāo)網(wǎng)站的爬蟲策略和邏輯做了設(shè)計(jì),本節(jié)將對爬蟲所涉及的相關(guān)操作做出介紹,包括如何對網(wǎng)頁進(jìn)行提取、數(shù)據(jù)庫表的建立以及對程序中重要的方法進(jìn)行講解。同時(shí),對獲得的結(jié)果進(jìn)行展示和簡要分析。下面開始通過Scrapy爬取數(shù)據(jù)。
第一步:命令行窗口進(jìn)入需要存放工程的目錄。如輸入:
Scrapy startproject ArticleSpider
創(chuàng)建名為ArticleSpider的爬蟲工程。
第二步:根據(jù)提示,輸入:
Scrapy genspider jobbole http://blog.jobbole.com/all-posts/
創(chuàng)建爬蟲主程序:jobbole.py
第三步:通過pycharm 導(dǎo)入工程項(xiàng)目并配置項(xiàng)目的解釋器即可在框架中編寫自己的程序。本項(xiàng)目配置的解釋器為Python 3.6.1。
可對網(wǎng)頁進(jìn)行數(shù)據(jù)提取的方式有三個(gè):正則表達(dá)式、beautifulsoup以及l(fā)xml模塊。前面章節(jié)中,已經(jīng)介紹對Scrapy 依賴庫lxml 的安裝。且由于Scrapy的lxml模塊底層是由C語言編寫,在速度上占有較大優(yōu)勢。lxml庫是用來對xml進(jìn)行處理的第三方庫。而同時(shí)xpath可以在xml中查找數(shù)據(jù),類似SQL向數(shù)據(jù)庫中查詢數(shù)據(jù)。因此,xpath 在爬蟲中使用比較多。為了判斷寫下的語句是否正確,可新建用于啟動爬蟲的main 文件,不斷通過斷點(diǎn)debug 判斷語句是否正確。如果每寫一條語句就需要進(jìn)行一次debug,也是影響了我們的開發(fā)效率。Scrapy 為我們提供了一個(gè)shell的模式。
本爬蟲采用xpath 和css 選擇器及正則表達(dá)式共同提取網(wǎng)頁數(shù)據(jù)。通過Chrome 瀏覽器進(jìn)入目標(biāo)頁面,右鍵頁面選擇“檢查”可獲得頁面的源碼。使用“查詢屬性”點(diǎn)擊日期獲取該元素屬性。該元素在源碼中的位置如圖1 所示。下面分別以一個(gè)實(shí)例來了解他們的實(shí)現(xiàn)方法。
Xpath:右鍵該元素,選擇“copy xpath”得到:
//*[@id=“post-113793”]/div[2]/p/tex(t)[1]
解釋:取任何節(jié)點(diǎn),id=post-113793,往下的第二個(gè)div,往下的p,往下的第一個(gè)text。通過代碼可獲取到日期元素,同時(shí),通過代碼也可獲取到日期create_date 值,取得的create_date 值是一個(gè)Selector對象,這樣的數(shù)據(jù)是無法進(jìn)行結(jié)構(gòu)化的。因此,Selector 提供了extract()方法,該方法可提取出數(shù)組。訪問數(shù)組里的第一個(gè)值:create_date.extrac(t)[0],為防止數(shù)組為空,可使用使用strip()除去回車換行符,取到值:2018/03/27·,再用replace(“·”,“”)以空的字符串替換“·”,即可取到最終值:2018/03/27。
CSS 選擇器:通過Scrapy shell 以css 選擇器的方式提取元素。通過搜索,p 標(biāo)簽中的class 值entry-meta-hide-on-mobile 全局唯一,因此可通過這個(gè)值準(zhǔn)確定位。然后直接取出text 即可獲得日期的值。
正則表達(dá)式:以CSS 選擇器的方式獲取收藏?cái)?shù),得到:‘1 收藏’。而需要的是收藏?cái)?shù)“1”,此時(shí)就必須使用正則的方式獲取,具體如圖2所示。
圖2 正則的方式獲取數(shù)據(jù)
表達(dá)式的含義為數(shù)字可出現(xiàn)多個(gè),數(shù)字前可以有任何字符且可以出現(xiàn)任何多次,數(shù)字后也是可以有任何字符且可以出現(xiàn)任何多次。這樣就形成了3 個(gè)“group”,編號按序0、1、2,取group[1]得到數(shù)字“1”,“?”表示使用非貪婪的模式。
接下來,就需要獲取文章列表頁中首頁圖的URL,也就是可以進(jìn)入文章詳情頁的URL,交給Scrapy解析、下載。
使用Scrapy 的另一個(gè)類request,由from scrapy.http import Request 進(jìn)行庫的導(dǎo)入。request 可直接通過yield 交給Scrapy 下載器進(jìn)行下載,下載完成,通過:“callback”回調(diào)到函數(shù)parse。
通過以上步驟已完成了一個(gè)基本的網(wǎng)絡(luò)爬蟲,對程序進(jìn)行debug,其運(yùn)行過程及記過如圖3 所示。對比網(wǎng)頁數(shù)據(jù),爬蟲正確運(yùn)行。
圖3 網(wǎng)絡(luò)爬蟲爬取的結(jié)果
最終,已經(jīng)完成了對所有文章URL 的遍歷及對文章相關(guān)字段的提取,將存儲包括首頁圖的以及相關(guān)的字段。對圖片的存儲。
對圖片的處理需要安裝第三方庫Pillow,使用mysql 對相關(guān)字段進(jìn)行存儲。mysql 及管理工具navicat 已在前面章節(jié)介紹過。對數(shù)據(jù)庫的數(shù)據(jù)插入可分為同步插入、異步插入。由于異步插入在效率上的優(yōu)勢,本爬蟲使用的是異步插入的方式。
根據(jù)編寫的items.py 文件,對數(shù)據(jù)庫進(jìn)行設(shè)計(jì)。運(yùn)行爬蟲,在navicat中得到下圖的結(jié)果。對目標(biāo)網(wǎng)站所有文章爬取的任務(wù)成功。
圖4 伯樂在線部分?jǐn)?shù)據(jù)表
針對爬蟲,很多網(wǎng)站都有了反爬蟲手段。建立網(wǎng)絡(luò)爬蟲的第一原則是:所有信息都是偽造的[9]。為了能更有效地獲取網(wǎng)站數(shù)據(jù),編寫的爬蟲就不得不帶有繞過反爬蟲的能力。繞過反爬蟲的技術(shù)由爬蟲技術(shù)的更新而發(fā)展的[10]。下面是本文使用的繞過發(fā)爬蟲實(shí)現(xiàn)方法。
1)關(guān)閉Robots 協(xié)議。即使Robots 被稱為雙方的“君子協(xié)定”,然而很多情況下如果開啟這個(gè)協(xié)議會讓爬蟲一無所獲。Scrapy 框架已將Robots 協(xié)議代碼的實(shí)現(xiàn)寫好,默認(rèn)爬蟲程序遵守該協(xié)議。修改方式:在settings.py 將ROBOTTSTXT_OBEY 的值由True修改為False即可。
2)設(shè)置超時(shí)。爬蟲訪問網(wǎng)頁的速度是很快的,很容易被服務(wù)器檢查到。代碼:
import socket
socket.setdefaulttimeou(t10)
可設(shè)置10s 后連接超時(shí),目的是為了讓爬蟲操作更像是人的行為。
3)隨機(jī)更換user-agent。爬蟲程序默認(rèn)向?qū)Ψ桨l(fā)送的頭文件user-agent 值為Scrapy,這就可以讓對方輕松攔截訪問。user_agent:用戶代理,簡稱UA,用于服務(wù)器對用戶的操作系統(tǒng)以及版本等信息,如:Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:58.0)Gecko/20100101 Firefox/58.0,方便用戶便提供最好的服務(wù),瀏覽器其實(shí)是一個(gè)代理。查看Chrome 的user_agent,對網(wǎng)頁打開“檢查”,點(diǎn)擊“Network”,選擇一個(gè)響應(yīng),查看“header”中“Request Header”,即可獲得該瀏覽器user_agent。
代碼實(shí)現(xiàn)隨機(jī)更換user_agent可通過隨機(jī)靜態(tài)的user_agent 池和動態(tài)更換user_agent。本文實(shí)現(xiàn)的網(wǎng)絡(luò)爬蟲使用的是動態(tài)更換user_agent 的方式。fake-useragent 是基于GitHub 開源的第三方庫,用于隨機(jī)更換user_agent。下載安裝,使用代碼:from fake_useragent import UserAgent 導(dǎo)入,ua.random 實(shí)現(xiàn)對user_agent的隨機(jī)獲取。
4)代理IP。用戶訪問對方網(wǎng)站,對方的服務(wù)器會記錄用戶的訪問日志,可通過IP 識別并記錄用戶。如果訪問者行為異常,對方很容易將其IP 拉黑。IP 就像我們的個(gè)人身份證,唯一標(biāo)識自己,沒了IP 就無法進(jìn)行網(wǎng)絡(luò)活動,因此,IP 資源是非常珍貴的。偽裝IP,同樣有靜態(tài)與動態(tài)的方法。動態(tài)獲取代理存儲在數(shù)據(jù)庫中,再隨機(jī)向數(shù)據(jù)庫中取出可用IP。為驗(yàn)證代理IP 是否生效,需要獲得對方服務(wù)器的訪問記錄,但目標(biāo)網(wǎng)站的訪問記錄本人無法得到,故選擇實(shí)驗(yàn)室內(nèi)部網(wǎng)站服務(wù)器進(jìn)行該功能的測試,區(qū)域1位使用本機(jī)正常訪問該網(wǎng)站,區(qū)域2是加入了IP 代理的爬蟲訪問記錄[11~12]。IP 代理成功生效。
圖5 服務(wù)器訪問記錄
網(wǎng)絡(luò)爬蟲技術(shù)的出現(xiàn),無疑為人們的生產(chǎn)生活帶來方便,也為社會的發(fā)展推波助瀾。人們有需求,就會有市場,有了市場,就回吸引到大量“淘金者”的加入。這也使得爬蟲大量增加。不同的種類的爬蟲,技術(shù)含量也參差不齊,爬蟲市場開始混亂、泛濫。在信息時(shí)代,我們?nèi)绻C合各種反爬蟲方法,可以很大程度上緩解爬蟲對網(wǎng)站造成的負(fù)面影響,保證網(wǎng)站的正常訪問,下面將會對反爬蟲技術(shù)進(jìn)行詳細(xì)介紹。
反爬蟲有很多的方法,也分有好層次。本研究使用的爬蟲包含的繞過爬蟲的方法,分別是修改robots協(xié)議、訪問頻率閾值、更換user-agent、使用代理IP。與之相對,反爬蟲策略為敦促對方遵守協(xié)議、做好訪問日志的檢查分析,并對不正常操作進(jìn)行清除、反制[13]。
3.2.1 啟動Robots協(xié)議
網(wǎng)絡(luò)爬蟲排除協(xié)議(是網(wǎng)站用來告訴爬蟲哪些頁面可以爬取哪些頁面涉及隱私不能被爬取的標(biāo)準(zhǔn))[14]。前面章節(jié)提到,在編寫爬蟲時(shí),都需要修改settings.py 程 序 ,將ROBOTSTXT_OBEY 的 值True修改為False。這就是在修改Robots 協(xié)議。Robots協(xié)議是網(wǎng)絡(luò)爬蟲在獲取網(wǎng)頁數(shù)據(jù)需要面對的第一道關(guān)卡。然而現(xiàn)在的網(wǎng)絡(luò)上搜索引擎眾多,大多數(shù)為良性獲取數(shù)據(jù),也有利于網(wǎng)站的發(fā)展,倘若書寫失誤,將會導(dǎo)致網(wǎng)站在搜索引擎消失。網(wǎng)絡(luò)上有專門的Robots 協(xié)議自動生成網(wǎng)站:站長工具(http://tool.chinaz.com/robots/)。其生成結(jié)果如圖6所示。
圖6 生成的結(jié)果
將所生成的結(jié)果保存到新建的記事本,并將其重命名為Robots.txt。最后把此文件復(fù)制粘貼到網(wǎng)站的根目錄即可實(shí)現(xiàn)該協(xié)議的開啟。
3.2.2 以設(shè)置閾值的方式挑選非正常訪問
各家飽受爬蟲困擾的網(wǎng)站也在積極應(yīng)對,通常網(wǎng)站自己的手段可以是基于網(wǎng)絡(luò)防火墻依靠IP 識別做阻斷,誤傷概率較高[15]。
設(shè)置單位閾值目的在于識別。單位閾值:在任何單位時(shí)間內(nèi)所允許的最高或最低值。普通用戶正常訪問是有限的,對于普通網(wǎng)站,單個(gè)訪問次數(shù)不會過百。對于淘寶的訪問,一秒鐘的訪問最多為也不會過千,當(dāng)然,每個(gè)網(wǎng)站該由自己的實(shí)際情況實(shí)時(shí)準(zhǔn)確地更改自己的單位閾值。倘若某一IP、user_agent標(biāo)識超出了閾值,對其實(shí)施監(jiān)控,當(dāng)判斷對方行為非正常用戶所為,且對己方利益進(jìn)行了侵害,即可對其進(jìn)行封禁。但這也難免會誤傷到用戶。在我們獲取到非正常用戶時(shí),還可以重定向。將用戶頁面返回到驗(yàn)證頁面。常見的有驗(yàn)證碼驗(yàn)證、語音驗(yàn)證、短信驗(yàn)證、郵箱驗(yàn)證。針對代理IP,反爬蟲一方當(dāng)然也可編寫爬蟲提前爬?。ㄈ缥鞔檀恚┧械拇聿⒃诩悍椒?wù)器將其封禁,這就可以省去很多工作。在對封禁名單操作中,由網(wǎng)站管理者主動操作的有四種:分別是查看封禁IP,添加封禁IP,刪除封禁,IP以及修改封禁時(shí)間,其系統(tǒng)本身應(yīng)該還具有分時(shí)統(tǒng)計(jì)[16]。
3.2.3 增加登錄以限制
在對知乎的數(shù)據(jù)爬取中,對網(wǎng)站進(jìn)行Scrapy shell 返回信息中返回狀態(tài)碼為500,報(bào)錯:Internal Server Error。對相關(guān)字段進(jìn)行提取,返回的數(shù)組也是為空。伯樂在線的返回信息中返回狀態(tài)碼為200。原因就在于訪問知乎需要注冊登錄,由此可見,增加了注冊登錄是可以有效阻止爬蟲訪問的。
3.2.4 AJAX動態(tài)加載數(shù)據(jù)
由于AJAX 異步的特點(diǎn),網(wǎng)站的數(shù)據(jù)更新可以不和前段網(wǎng)頁數(shù)據(jù)同步。另外,我們編寫爬蟲提取字段時(shí)根據(jù)的是HTML 代碼,而在網(wǎng)頁中,JS 是根據(jù)用戶的操作進(jìn)行JS 渲染相應(yīng),代碼是看不到的。因此在爬蟲想要獲取返回的數(shù)據(jù)時(shí),還必須得去解析HTML 源碼。這無疑為爬蟲設(shè)置了技術(shù)門檻,要么去學(xué)習(xí),要么放棄。同時(shí)解釋HTML 還需要較多的時(shí)間。為對方造成麻煩就是己方的勝利。
3.2.5 以謀略取勝
技術(shù)層面上的爬蟲與反爬蟲,都會被相互攻破,而謀略上的反爬蟲卻可以讓自己由被動方變?yōu)橹鲃臃健F湟?,長時(shí)間的反爬蟲經(jīng)驗(yàn)可以總結(jié)出適合自己的,與其他常見不一樣的反爬蟲策略,這樣的方法往往不適用于其他,只屬于自己,這樣除非是常常交手的雙方,而其他人卻不會知道對方的套路,無從下手。這些是小套路,雖然與眾不同,但從屬于以下的框架下[17]。
1)投毒
爬蟲在于獲取數(shù)據(jù),倘若對對方展示了亦真亦假的數(shù)據(jù),而對方在無法甄別的情況下使用了己方提供的數(shù)據(jù)。假設(shè)淘寶和京東都在為同一產(chǎn)品的市場進(jìn)行爭奪,價(jià)格無疑成為了目標(biāo)。己方為淘寶,明天0 點(diǎn)就到了產(chǎn)品正式發(fā)售,京東可以晚幾分鐘上架,在這幾分鐘內(nèi)獲取了你的價(jià)格,這就會讓你的價(jià)格沒了優(yōu)勢,消費(fèi)者會因?yàn)檫@一點(diǎn)的區(qū)別而選擇京東。己方的做法是按以前的經(jīng)驗(yàn),就在這幾分鐘向京東程序員提供己方準(zhǔn)備好的頁面,給他假的數(shù)據(jù),然而當(dāng)其發(fā)現(xiàn)時(shí)已經(jīng)來不及了。
2)心理戰(zhàn)
每當(dāng)我們的每一次成功,對對方程序員進(jìn)行嘲笑、侮辱等,目的讓其崩潰。而失敗了可以讓他滿足虛榮心,此時(shí)就會尋找他的空子,如從他的炫耀和嘲諷里就很有可能挖掘出他的策略,最后進(jìn)行反擊。
3)欲縱故擒
讓爬蟲感受不到任何威脅,這時(shí)爬蟲的程序員就放手了對你這個(gè)網(wǎng)頁的關(guān)注,反而是和對手剛上了,無暇對你網(wǎng)站數(shù)據(jù)進(jìn)行查驗(yàn)。而此時(shí),你就可以為所欲為的欺騙爬蟲。
網(wǎng)絡(luò)爬蟲技術(shù)與反爬蟲技術(shù)的研究到這里就完全結(jié)束了?;蛟S大家會在以上的描述中感到有些疑惑,它們最終到底是誰存誰亡,誰強(qiáng)誰弱,誰成為了勝利者。然而并沒有。爬蟲與反爬蟲互為矛盾,相生相克。它們之間的會因?yàn)榧夹g(shù)的不斷更新成長,雙方不斷的打出自己手中的牌,為了資源利益在這個(gè)沒有硝煙的戰(zhàn)場不斷戰(zhàn)斗。反爬蟲,最終會成為雙方程序員的尊嚴(yán)戰(zhàn)斗,沒有成敗,沒有輸贏。
在大多數(shù)的資料中,并沒有將Robots協(xié)議列為反爬蟲策略中,而本文將Robots 列為反爬蟲策略,需要說明的是,反的爬蟲該是危害、變異了的爬蟲。變異爬蟲,不以爬取公共數(shù)據(jù)為目的,不成熟、不完善、高傷害的爬蟲。爬蟲與反爬蟲的戰(zhàn)爭該為變異爬蟲與反爬蟲的戰(zhàn)爭。Robots 該作為健康爬蟲與反爬蟲之間的停戰(zhàn)協(xié)議。以上的爬蟲使用相關(guān)技術(shù)只為讓自己變得完善,而完善的爬蟲時(shí)不具備給對方帶來傷害的。
相互尊重,不涉及核心資源,不為己方而傷害對方。共同在網(wǎng)絡(luò)世界里完成自己的夢想,取得成績,為網(wǎng)絡(luò)的發(fā)展增磚添瓦,為人們的生活提供便利。