久久久,被高潮,国精产品一线二线三线av,久久精品一区二区东京热,久久精品国产99国产电影网,久久97精品久久久久久久不卡

如何利用動(dòng)態(tài)ip迎合爬蟲(chóng)系統(tǒng)?

如何使用動(dòng)態(tài)IP代理來(lái)迎合爬蟲(chóng)系統(tǒng)?為了避免惡意攻擊,企業(yè)正在制作網(wǎng)站系統(tǒng)。寫(xiě)爬蟲(chóng)的時(shí)候,有些網(wǎng)站會(huì)有一些反爬蟲(chóng)的措施,比如限制單個(gè)ip的訪(fǎng)問(wèn)頻率,突破ip限制大概有以下幾種方式:
 
 
與抓取的網(wǎng)站合作,將自己的ip加入白名單;
 
買(mǎi)多臺(tái)公共ip的服務(wù)器,每臺(tái)都有爬蟲(chóng)腳本,相當(dāng)于每臺(tái)爬蟲(chóng)都有自己獨(dú)立的IP;
 
買(mǎi)一些便宜的ip資源,用這些IP做代理(可以是低配置的服務(wù)器,每臺(tái)機(jī)器多個(gè)公網(wǎng)IP,只負(fù)責(zé)網(wǎng)絡(luò)代理,不跑業(yè)務(wù))。
 
1.既然選擇抓取人的數(shù)據(jù),那么初期應(yīng)該沒(méi)有合作的意向和渠道。
 
2.多臺(tái)服務(wù)器成本高,同一個(gè)爬蟲(chóng)部署在多個(gè)地方,維護(hù)成本也高(配置、部署、升級(jí)、爬蟲(chóng)之間的相互協(xié)調(diào)等。).
 
3,成本低,不需要在很多地方部署腳本。
 
本文將從原理到實(shí)現(xiàn)一步步解釋模式3。
 
Http代理原則
 
當(dāng)訪(fǎng)問(wèn)一個(gè)站點(diǎn)時(shí),網(wǎng)站服務(wù)器可以獲取訪(fǎng)問(wèn)者的ip。服務(wù)器可以根據(jù)ip的請(qǐng)求進(jìn)行一些限流操作。相反,代理在訪(fǎng)問(wèn)者和網(wǎng)站之間添加了一個(gè)中介。向訪(fǎng)問(wèn)者中間人發(fā)送請(qǐng)求,中間人將請(qǐng)求轉(zhuǎn)發(fā)給站點(diǎn),最后中間人將站點(diǎn)的響應(yīng)返回給訪(fǎng)問(wèn)者。在這個(gè)過(guò)程中,網(wǎng)站只能看到代理商(中間人)的ip。
 
沒(méi)有代理:訪(fǎng)問(wèn)者的網(wǎng)站(網(wǎng)站看到訪(fǎng)問(wèn)者的ip)
 
有代理的情況:訪(fǎng)問(wèn)者代理站點(diǎn)(站點(diǎn)看到代理的ip)
 
有動(dòng)態(tài)代理:訪(fǎng)客[代理1,代理2,代理3,...]站點(diǎn)(該站點(diǎn)看到多個(gè)代理的隨機(jī)ip)
 
嘗試卷曲
 
你可以通過(guò)訪(fǎng)問(wèn)http://httpbin.org/ip:獲得自己的ip
 
卷曲http://httpbin.org/ip{ "起源":" 58.243.254.31"}
 
你可以看到我的外網(wǎng)ip是58.243.254.31。Curl支持- proxy參數(shù)來(lái)指定代理:
 
curl-proxy http://localhost:1087 http://httpbin.org/ip{ " origin ":" 217 . 197 . 160 . 199 " }
 
使用代理后,我的ip(訪(fǎng)問(wèn)過(guò)的網(wǎng)站)變成了217.197.160.199。通過(guò)以上實(shí)驗(yàn),你一定對(duì)代理有了一定的認(rèn)知。
 
用nodejs寫(xiě)一個(gè)簡(jiǎn)單的爬蟲(chóng)
 
這個(gè)爬蟲(chóng)非常簡(jiǎn)單,即它請(qǐng)求http://httpbin.org/ip并將返回值打印到控制臺(tái)。
 
#創(chuàng)建一個(gè)名為node-crawler mkdir node-crawler的文件夾#輸入此文件夾cd node-crawler#創(chuàng)建一個(gè)默認(rèn)包. jsonnpm init -y#安裝請(qǐng)求取決于npm i -S請(qǐng)求#創(chuàng)建一個(gè)名為index.js TouchIndex.js的新文件。
 
index.js的內(nèi)容如下:
 
const request = require(" request ");Request(,(err,res,body)=>{ //暫時(shí)忽略錯(cuò)誤消息,直接打印body console . log(body);});
 
在控制臺(tái)上執(zhí)行node index.js,您將獲得以下輸出:
 
{ "origin": "58.243.254.31,58.243.254.31"}
 
與curl類(lèi)似,我們可以為請(qǐng)求方法配置代理參數(shù):
 
const request = require(" request ");request({ URL:" http://http bin . org/IP ",proxy: "http://localhost: 1087"},(err,res,body)= > {//暫時(shí)忽略錯(cuò)誤消息,直接打印body console . log(body);});
 
再次執(zhí)行node index.js,您將獲得以下輸出:
 
{ "origin": "217.197.160.199,217.197.160.199"}
 
至此,單個(gè)http代理已經(jīng)完成。接下來(lái),我們討論如何在多個(gè)http代理之間動(dòng)態(tài)地來(lái)回切換,以削弱被爬取的站點(diǎn)對(duì)訪(fǎng)問(wèn)者ip的限制。
 
第一個(gè)方案
 
從外部將ip代理參數(shù)傳遞給爬蟲(chóng)腳本,爬蟲(chóng)運(yùn)行后自動(dòng)退出,然后取另一個(gè)ip代理參數(shù),爬蟲(chóng)腳本重新運(yùn)行,循環(huán)往復(fù)。
 
您可以像這樣編寫(xiě)一個(gè)shell腳本:
 
#!/usr/bin/env bash#假設(shè)有2個(gè)http代理可用=(' http://a . b . c . d:8443 ' ' http://h . I . j . k:1087 ');# while(真)一遍又一遍;Do #一次取出“$”中p的一個(gè)代理;Do echo使用代理$p #運(yùn)行crawler PROXY=$p node index.js #休眠一段時(shí)間
 
其中PROXY=$p是定義環(huán)境變量的代理,其值是兩個(gè)http代理中的任意一個(gè)。讓我們修改index.js,使用代理環(huán)境參數(shù)作為它的代理:
 
const request = require(" request ");const proxy = process . env . proxy;request({ URL:" http://http bin . org/IP ",proxy}、(err,res,body)= > {//暫時(shí)忽略錯(cuò)誤消息,直接打印body console . log(body);});
 
該方案使用bash腳本和js爬蟲(chóng)腳本。對(duì)于不了解bash的人來(lái)說(shuō),維護(hù)起來(lái)有一定的心理負(fù)擔(dān)。接下來(lái)我們用純js語(yǔ)言來(lái)實(shí)現(xiàn)。
 
第二個(gè)方案
 
將方案一中的bash轉(zhuǎn)換為js,并將index.js的內(nèi)容調(diào)整為:
 
const request = require(" request ");const proxy =[" http://a . b . c . d:8443 "," http://h . I . j . k:1087 "];main();// index是循環(huán)執(zhí)行函數(shù)main (index = 0)的次數(shù){ request({ URL:" http://http bin . org/IP ",//take proxy:proxy[index % proxies . length]},(err,res,body)= > {//暫時(shí)忽略錯(cuò)誤消息。//5秒后取下一個(gè)代理,重新運(yùn)行爬蟲(chóng)setTimeout( main,5000,index+1);});}
 
綜上所述,我們實(shí)現(xiàn)了從不使用代理,使用單個(gè)代理,再使用多個(gè)代理的過(guò)程,讓我們的爬蟲(chóng)盡可能少的受到服務(wù)器電流限制的影響。我們還研究了當(dāng)一個(gè)需求有多種解決方案時(shí),如何選擇經(jīng)濟(jì)成本、開(kāi)發(fā)成本和維護(hù)成本。