技术深扒丨没点想象力都看不透这个网站的反爬措施!
所謂萬物皆可爬,寫一段Python代碼,就能讓程序自動進行網(wǎng)站訪問、解析數(shù)據(jù)并保存下來,再進行下一步分析,這是一項很酷的技能。
當(dāng)然各網(wǎng)站也有自己的反爬方式,比如判斷用戶IP在短時間內(nèi)是否頻繁訪問對應(yīng)網(wǎng)站,比如通過動態(tài)頁面增加爬取的難度等。
某點評網(wǎng)的反爬可以說是非常有創(chuàng)意了,它使用svg和亂碼來防止被爬。難爬不說,就算拿到數(shù)據(jù),使用者也不知道是什么意思。
點評網(wǎng)的文字甚至都是不能復(fù)制粘貼的。
今天我們就來看看,這一網(wǎng)站的反爬措施到底是多么的具有想象力。
1?觀察網(wǎng)站
我們以某商家的電話號碼為例,先看看某點評的反爬措施。
在瀏覽器里按F12打開開發(fā)者工具,并使用select工具選中電話,可以看到電話數(shù)字除了1以外都是亂碼。
通過仔細觀察發(fā)現(xiàn)該電話最后兩個數(shù)字都是9,我們對應(yīng)看到d標簽里面的兩個class是相同。
這說明該class是用來代表某個數(shù)字的。我們先把這幾個class和這個數(shù)字1弄下來,上Xpath!上正則!
def?get_code(url):response?=?requests.get('url',headers=headers).textitem?=?etree.HTML(response)item?=?item.xpath('//p[@class="expand-info?tel"]')[0]item=etree.tostring(item).decode('utf-8')item?=?re.sub('<span.*?</span>','',item,re.S)items?=?re.findall('<d?class=(.*?)/>|(d+)',item,re.S)phone_list=[]for?i?in?items:phone_list.append(i[0]?if?i[0]!=''?else?i[1])return?phone_list-
XPath 是一門在 XML 文檔中查找信息的語言,可用于HTML。XPath 可在HTML文檔中對元素和屬性進行遍歷。
-
正則表達式(Regular Expression,在代碼中常簡寫為regex、regexp或re),是計算機科學(xué)的一個概念。正則表達式通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。關(guān)于python正則表達式的更多資料,大家可以查看文末的資料福利。
通過正則表達式和xpath我們拿到了一個帶有數(shù)字和亂碼的列表,代表的是商家電話號碼。這里把原有的數(shù)字放在這里是為了保留原來的順序不變,以便我們后面處理:
再仔細觀察,點擊每個代表數(shù)字的d標簽后background里面的兩個數(shù)字有變化,說明這里就是控制著數(shù)字變化的地方。
我們繼續(xù)找,上方還有個background-image,里面有一個以svg結(jié)尾的url。直接打開發(fā)現(xiàn),里面不正是我們想要的數(shù)字嗎?
2?獲取css數(shù)據(jù)
同樣按F12打開開發(fā)者工具,我們發(fā)現(xiàn)這個svg里面包含了4個text標簽,里面有一個x和一個y,里面包含了一堆數(shù)字。除此之外,里面還有一段數(shù)字文本。
經(jīng)過我嚴密的推理,這些數(shù)字文本應(yīng)該就是我們需要找的最終目標了,這里面的x和y應(yīng)該和上面的background有些關(guān)系,我們先把這幾個數(shù)字拿到手。
首先獲取css
def?get_css(url):response?=?requests.get(url,headers=headers).texthtml?=?etree.HTML(response)css_url?=?html.xpath('//link[@rel="stylesheet"]/@href')return?'http:'+css_url[1]用requests獲取到css文本,然后print看一下,搜索下上面的class,確保我們找到的css文本正確無誤。
css_url?=?get_css(url) css_header={'Accept':?'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',?'Accept-Encoding':?'gzip,?deflate',?'Accept-Language':?'zh-CN,zh;q=0.9',?'Cache-Control':?'max-age=0',?'Connection':?'keep-alive',?'Host':?'s3plus.meituan.net',?'If-Modified-Since':?'Wed,?06?Mar?2019?14',?'If-None-Match':?'"4684b1c3dee8f4d172b2ac0c11e827a1"',?'Upgrade-Insecure-Requests':?'1',?'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/63.0.3239.132?Safari/537.36'} css=requests.get(css_url,headers=css_header) css.encoding='utf-8' print(css)繼續(xù)用正則表達式根據(jù)傳入的class定位到backgrount后面的兩個數(shù)字
def?get_xy(code):return?re.search(code+'{background:-(.*?)px?-(.*?)px;}',css.text,re.S).groups()3?反爬原理
之后就是將text和電話號碼對應(yīng)起來了。經(jīng)過我天(wu)才(shu)地(ci)嘗試,電話號碼配對方法是這樣的:這是一個需要三次定位的密碼,分別是y值定位、x值定位,x[index]值定位。
先說說y定位,還記得數(shù)字對應(yīng)的background數(shù)字嗎?將后面的數(shù)字絕對值(此處是122)加上文字height(此處是30)得到y(tǒng)定位(152)。
使用y定位(152)與前面svg頁面里的text標簽中的y值進行對比,y定位(152)與哪個y值離得最近就取那個分組。本案例中y定位(152)最靠近第四個text標簽(y='145'),所以我們會從第四個分組尋找x定位。
x定位和y定位相似,取的數(shù)字是background里面的第一個數(shù)字絕對值(302)加上6,得到對應(yīng)的x定位(308),和x定位數(shù)值相同的text里面的數(shù)字所在的位置(index)就是我們最后需要的數(shù)字(該案例是21)。
最后查看text標簽里的數(shù)字(num),x定位的index位置上的數(shù)字就是我們要的數(shù)字(數(shù)字5)。
以上是一份破解點評網(wǎng)反爬的秘籍,請大家多次閱讀理解,也可以在文末找到視頻資料和完整代碼。
要實現(xiàn)上面的揭秘過程,先構(gòu)建Python函數(shù)。這里用到了numpy庫,主要是處理起來比較方便。先xpath得到所有的y值,存儲到array數(shù)組中。
def?get_svg(svg_url,x_,y):response?=?requests.get(svg_url)html?=?etree.HTML(response.content)y_list?=?html.xpath('//text/@y')//獲取到所有的yy_list?=?np.array(y_list)y_list=y_list.astype(np.int64)y_index?=?np.abs(y_list-y).argsort()[0]y_?=?y_list[y_index]x=html.xpath('//text[@y="{y}"]/@x'.format(y=y_))num?=?html.xpath('//text[@y="{y}"]/text()'.format(y=y_))dict_x?=?dict(zip(x[0].split(),list(num[0])))return?dict_x[str(x_)]這里傳入的y值是我們上面background得到的第二個數(shù)字,和array數(shù)組做個差值,用abs取絕對值,排序,取到差值最小的index,再根據(jù)這個Index獲取到我們需要的y值。
之后得到我們對應(yīng)的那組數(shù),然后繼續(xù)xpath,得到了num和x,將他們組裝成一個字典,獲取到正確的數(shù)字。遍歷一下codes, 就可以得到最終需要的電話號碼。
自此,我們破解了某點評網(wǎng)的字體反爬。本文用電話號碼舉例,其實抓取網(wǎng)站中的的口味,環(huán)境,服務(wù)等字段也是同樣的方法。
作為技術(shù),爬蟲是合法合理的。諸如谷歌百度這樣搜索引擎,也都利用爬蟲技術(shù)進行全網(wǎng)掃閱,供用戶篩選信息,做成產(chǎn)品。網(wǎng)站和爬蟲之間,有一個類似道德規(guī)范的robots協(xié)議。
但作為數(shù)據(jù)分析師,爬取數(shù)據(jù)前應(yīng)該想清楚哪些數(shù)據(jù)是必須的,不做多余動作,節(jié)省自己的時間,也節(jié)約網(wǎng)站資源。爬取數(shù)據(jù)對數(shù)據(jù)分析師來說只是第一步,具備數(shù)據(jù)分析能力更為重要,如何將代碼工具和分析思維更好的結(jié)合,用工具來幫助自己更高效的工作?
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的技术深扒丨没点想象力都看不透这个网站的反爬措施!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业为啥要上云
- 下一篇: 中台,都他妈被你们说糊涂了,文内才是正宗