成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Python之常用反爬蟲(chóng)措施和解決辦法有哪些

這篇文章主要介紹了Python之常用反爬蟲(chóng)措施和解決辦法有哪些,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)公司是一家網(wǎng)站設(shè)計(jì)公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營(yíng)產(chǎn)品:成都響應(yīng)式網(wǎng)站建設(shè)公司、品牌網(wǎng)站建設(shè)、成都營(yíng)銷(xiāo)網(wǎng)站建設(shè)。我們專(zhuān)注企業(yè)品牌在網(wǎng)站中的整體樹(shù)立,網(wǎng)絡(luò)互動(dòng)的體驗(yàn),以及在手機(jī)等移動(dòng)端的優(yōu)質(zhì)呈現(xiàn)。成都做網(wǎng)站、網(wǎng)站制作、移動(dòng)互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營(yíng)、VI設(shè)計(jì)、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶(hù)提供一站式解決方案,我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶(hù),為客戶(hù)提供賞析悅目的作品,網(wǎng)站的價(jià)值服務(wù)。

一、全網(wǎng)代理IP的JS混淆

首先進(jìn)入全網(wǎng)代理IP,打開(kāi)開(kāi)發(fā)者工具,點(diǎn)擊查看端口號(hào),看起來(lái)貌似沒(méi)有什么問(wèn)題:

Python之常用反爬蟲(chóng)措施和解決辦法有哪些

如果你已經(jīng)爬取過(guò)這個(gè)網(wǎng)站的代理,你就會(huì)知道事情并非這么簡(jiǎn)單。如果沒(méi)爬過(guò)呢?也很簡(jiǎn)單,點(diǎn)擊鼠標(biāo)右鍵然后查看網(wǎng)頁(yè)源代碼,搜索”port“,可以找到如下內(nèi)容:

Python之常用反爬蟲(chóng)措施和解決辦法有哪些

很明顯這不是網(wǎng)頁(yè)上顯示的端口號(hào)了,那我們要怎么才能得到真正的端口號(hào)呢?

解決辦法:

首先需要找到一個(gè)JS文件:http://www.goubanjia.com/theme/goubanjia/javascript/pde.js?v=1.0,點(diǎn)開(kāi)后可以看到如下內(nèi)容:

Python之常用反爬蟲(chóng)措施和解決辦法有哪些

這么復(fù)雜的JS代碼看得人頭都大了,不過(guò)我們發(fā)現(xiàn)這個(gè)JS代碼是一個(gè)eval函數(shù),那我們能不能把它解碼一下呢?這時(shí)候你需要一個(gè)工具--腳本之家在線(xiàn)工具,把這些JS代碼復(fù)制進(jìn)去:

Python之常用反爬蟲(chóng)措施和解決辦法有哪些

然后點(diǎn)擊解碼:

Python之常用反爬蟲(chóng)措施和解決辦法有哪些

還是一個(gè)eval函數(shù),所以再次解碼:

Python之常用反爬蟲(chóng)措施和解決辦法有哪些

到這一步,已經(jīng)比最開(kāi)始的代碼簡(jiǎn)潔多了,但是還易讀性還是很差,所以我們需要先格式化一下:

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) {}
});
});

可以看到有一個(gè)列表和一個(gè)函數(shù),而這個(gè)函數(shù)應(yīng)該就是混淆的函數(shù)了,但是這列表里的數(shù)據(jù)都是十六進(jìn)制的,還需要解碼一下(這一步可以用Python來(lái)做):

_ = ["\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', '']

然后把這個(gè)列表里的元素添加到上面的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代碼就是先找到每個(gè)端口節(jié)點(diǎn),然后把端口的class值提取出來(lái),再進(jìn)行拆分字符串,然后獲取每個(gè)字母在”ABCDEFGHIZ“中的下標(biāo)值,并把這些值拼接成字符串,再轉(zhuǎn)為整型數(shù)據(jù),最后把這個(gè)整型數(shù)據(jù)向右移3位。比如”GEA“對(duì)應(yīng)的下標(biāo)組成的字符串是”640“,轉(zhuǎn)為整型數(shù)據(jù)后向右移3位的結(jié)果就是80,也就是真實(shí)的端口值了。最后附上用Python解密端口號(hào)的代碼:

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)

二、用圖片代替文字

之前就有人評(píng)論說(shuō)有的網(wǎng)站使用圖片代替文字以實(shí)現(xiàn)反爬蟲(chóng),然后我這次就找到了一個(gè)網(wǎng)站--新蛋網(wǎng),隨意點(diǎn)擊一個(gè)商品查看一下:

Python之常用反爬蟲(chóng)措施和解決辦法有哪些

打開(kāi)開(kāi)發(fā)者工具,然后點(diǎn)擊查看價(jià)格,想不到價(jià)格居然是通過(guò)圖片來(lái)顯示的:

Python之常用反爬蟲(chóng)措施和解決辦法有哪些

解決辦法:

 我找到兩個(gè)可以得到價(jià)格的辦法,一個(gè)簡(jiǎn)單的,一個(gè)難一點(diǎn)的。簡(jiǎn)單的方法是用正則表達(dá)式,因?yàn)樵谠创a中的其他地方是包含商品的基本信息的,比如名稱(chēng)和價(jià)格,所以我們可以使用正則表達(dá)式進(jìn)行匹配,代碼如下:

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)

難一點(diǎn)的方法是把圖片下載到本地之后進(jìn)行識(shí)別,由于這個(gè)圖片的清晰度很高,也沒(méi)有扭曲或者加入干擾線(xiàn)什么的,所以可以直接使用OCR進(jìn)行識(shí)別。但是用這種方法的話(huà)需要安裝好Tesseract-OCR,這個(gè)工具的安裝過(guò)程還是比較麻煩的。用這種方法破解的代碼如下:

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

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享Python之常用反爬蟲(chóng)措施和解決辦法有哪些內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問(wèn)題就找創(chuàng)新互聯(lián),詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!

新聞標(biāo)題:Python之常用反爬蟲(chóng)措施和解決辦法有哪些
瀏覽路徑:http://jinyejixie.com/article0/gpecoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、商城網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站制作、定制開(kāi)發(fā)、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管
泗洪县| 广州市| 包头市| 逊克县| 伊宁县| 大冶市| 广元市| 古浪县| 湖南省| 临城县| 水富县| 诏安县| 庆阳市| 清河县| 三明市| 咸阳市| 扬州市| 赤峰市| 巴林左旗| 大荔县| 尼勒克县| 汕尾市| 资阳市| 府谷县| 崇文区| 扎鲁特旗| 阳谷县| 江油市| 云安县| 江津市| 沈丘县| 什邡市| 白水县| 武宣县| 北安市| 霍林郭勒市| 格尔木市| 泸西县| 莒南县| 库车县| 荣昌县|