這篇文章主要介紹了Python之常用反爬蟲措施和解決辦法有哪些,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)公司是一家網(wǎng)站設(shè)計公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營產(chǎn)品:成都響應(yīng)式網(wǎng)站建設(shè)公司、品牌網(wǎng)站建設(shè)、成都營銷網(wǎng)站建設(shè)。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡(luò)互動的體驗,以及在手機等移動端的優(yōu)質(zhì)呈現(xiàn)。成都做網(wǎng)站、網(wǎng)站制作、移動互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運營、VI設(shè)計、云產(chǎn)品.運維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場的競爭激烈,認真對待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價值服務(wù)。
一、全網(wǎng)代理IP的JS混淆
首先進入全網(wǎng)代理IP,打開開發(fā)者工具,點擊查看端口號,看起來貌似沒有什么問題:
如果你已經(jīng)爬取過這個網(wǎng)站的代理,你就會知道事情并非這么簡單。如果沒爬過呢?也很簡單,點擊鼠標右鍵然后查看網(wǎng)頁源代碼,搜索”port“,可以找到如下內(nèi)容:
很明顯這不是網(wǎng)頁上顯示的端口號了,那我們要怎么才能得到真正的端口號呢?
解決辦法:
首先需要找到一個JS文件:http://www.goubanjia.com/theme/goubanjia/javascript/pde.js?v=1.0,點開后可以看到如下內(nèi)容:
這么復(fù)雜的JS代碼看得人頭都大了,不過我們發(fā)現(xiàn)這個JS代碼是一個eval函數(shù),那我們能不能把它解碼一下呢?這時候你需要一個工具--腳本之家在線工具,把這些JS代碼復(fù)制進去:
然后點擊解碼:
還是一個eval函數(shù),所以再次解碼:
到這一步,已經(jīng)比最開始的代碼簡潔多了,但是還易讀性還是很差,所以我們需要先格式化一下:
var _$ = [ "\x2e\x70\x6f\x72\x74", "\x65\x61\x63\x68", "\x68\x74\x6d\x6c", "\x69\x6e\x64\x65\x78\x4f\x66", "\x2a", "\x61\x74\x74\x72", "\x63\x6c\x61\x73\x73", "\x73\x70\x6c\x69\x74", "\x20", "", "\x6c\x65\x6e\x67\x74\x68", "\x70\x75\x73\x68", "\x41\x42\x43\x44\x45\x46\x47\x48\x49\x5a", "\x70\x61\x72\x73\x65\x49\x6e\x74", "\x6a\x6f\x69\x6e", "" ]; $(function() { $(_$[0])[_$[1]](function() { var a = $(this)[_$[2]](); if (a[_$[3]](_$[4]) != -0x1) { return; } var b = $(this)[_$[5]](_$[6]); try { b = b[_$[7]](_$[8])[0x1]; var c = b[_$[7]](_$[9]); var d = c[_$[10]]; var f = []; for (var g = 0x0; g < d; g++) { f[_$[11]](_$[12][_$[3]](c[g])); } $(this)[_$[2]](window[_$[13]](f[_$[14]](_$[15])) >> 0x3); } catch (e) {} }); });
可以看到有一個列表和一個函數(shù),而這個函數(shù)應(yīng)該就是混淆的函數(shù)了,但是這列表里的數(shù)據(jù)都是十六進制的,還需要解碼一下(這一步可以用Python來做):
_ = ["\x2e\x70\x6f\x72\x74", "\x65\x61\x63\x68", "\x68\x74\x6d\x6c", "\x69\x6e\x64\x65\x78\x4f\x66", "\x2a", "\x61\x74\x74\x72", "\x63\x6c\x61\x73\x73", "\x73\x70\x6c\x69\x74", "\x20", "", "\x6c\x65\x6e\x67\x74\x68", "\x70\x75\x73\x68", "\x41\x42\x43\x44\x45\x46\x47\x48\x49\x5a", "\x70\x61\x72\x73\x65\x49\x6e\x74", "\x6a\x6f\x69\x6e", "" ] _ = [i.encode('utf-8').decode('utf-8') for i in _] print(_) # ['.port', 'each', 'html', 'indexOf', '*', 'attr', 'class', 'split', ' ', '', 'length', 'push', 'ABCDEFGHIZ', 'parseInt', 'join', '']
然后把這個列表里的元素添加到上面的JS函數(shù)中,可以得到如下結(jié)果:
$(function() { $(".port")["each"](function() { var a = $(this)["html"](); if (a["indexOf"]("*") != -0x1) { return; } var b = $(this)["attr"]("class"); try { b = b["split"](" ")[0x1]; var c = b["split"](""); var d = c["length"]; var f = []; for (var g = 0x0; g < d; g++) { f["push"]("ABCDEFGHIZ"["indexOf"](c[g])); } $(this)["html"](window["parseInt"](f["join"]("")) >> 0x3); } catch (e) {} }); });
可以看到這段JS代碼就是先找到每個端口節(jié)點,然后把端口的class值提取出來,再進行拆分字符串,然后獲取每個字母在”ABCDEFGHIZ“中的下標值,并把這些值拼接成字符串,再轉(zhuǎn)為整型數(shù)據(jù),最后把這個整型數(shù)據(jù)向右移3位。比如”GEA“對應(yīng)的下標組成的字符串是”640“,轉(zhuǎn)為整型數(shù)據(jù)后向右移3位的結(jié)果就是80,也就是真實的端口值了。最后附上用Python解密端口號的代碼:
et = etree.HTML(html) port_list = et.xpath('//*[contains(@class,"port")]/@class') for port in port_list: port = port.split(' ')[1] num = "" for i in port: num += str("ABCDEFGHIZ".index(i)) print(int(num) >> 3)
二、用圖片代替文字
之前就有人評論說有的網(wǎng)站使用圖片代替文字以實現(xiàn)反爬蟲,然后我這次就找到了一個網(wǎng)站--新蛋網(wǎng),隨意點擊一個商品查看一下:
打開開發(fā)者工具,然后點擊查看價格,想不到價格居然是通過圖片來顯示的:
解決辦法:
我找到兩個可以得到價格的辦法,一個簡單的,一個難一點的。簡單的方法是用正則表達式,因為在源碼中的其他地方是包含商品的基本信息的,比如名稱和價格,所以我們可以使用正則表達式進行匹配,代碼如下:
import re import requests url = "https://www.newegg.cn/Product/A36-125-E5L.htm?neg_sp=Home-_-A36-125-E5L-_-CountdownV1" res = requests.get(url) result = re.findall("name:'(.+?)', price:'(.+?)'", res.text) print(result)
難一點的方法是把圖片下載到本地之后進行識別,由于這個圖片的清晰度很高,也沒有扭曲或者加入干擾線什么的,所以可以直接使用OCR進行識別。但是用這種方法的話需要安裝好Tesseract-OCR,這個工具的安裝過程還是比較麻煩的。用這種方法破解的代碼如下:
import requests import pytesseract from PIL import Image from lxml import etree url = "https://www.newegg.cn/Product/A36-125-E5L.htm?neg_sp=Home-_-A36-125-E5L-_-CountdownV1" res = requests.get(url) et = etree.HTML(res.text) img_url = et.xpath('//*[@id="priceValue"]/span/strong/img/@src')[0] with open('price.png','wb') as f: f.write(requests.get(img_url).content) pytesseract.pytesseract.tesseract_cmd = 'E:/Python/Tesseract-OCR/tesseract.exe' text = pytesseract.image_to_string(Image.open('price.png')) print(text) # 6999.00
感謝你能夠認真閱讀完這篇文章,希望小編分享Python之常用反爬蟲措施和解決辦法有哪些內(nèi)容對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián),詳細的解決方法等著你來學習!