国产精品主播一区二区-国产一级不卡毛片-日本少妇中出-国产视频第二页-青草精品视频-亚洲熟妇丰满多毛xxxx-日韩福利在线-成年人免费观看在线视频-久久久www-91在线视频观看无毒不卡-999国产精品-91久久爽久久爽爽久久片-和搜子居同的日子2hd高清看-鬼眼 电影-中文在线精品-综合网久久-国产精品美女久久久久久

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

如何使用動態(tài)IP代理來迎合爬蟲系統(tǒng)?為了避免惡意攻擊,企業(yè)正在制作網(wǎng)站系統(tǒng)。寫爬蟲的時候,有些網(wǎng)站會有一些反爬蟲的措施,比如限制單個ip的訪問頻率,突破ip限制大概有以下幾種方式:
 
 
與抓取的網(wǎng)站合作,將自己的ip加入白名單;
 
買多臺公共ip的服務器,每臺都有爬蟲腳本,相當于每臺爬蟲都有自己獨立的IP;
 
買一些便宜的ip資源,用這些IP做代理(可以是低配置的服務器,每臺機器多個公網(wǎng)IP,只負責網(wǎng)絡代理,不跑業(yè)務)。
 
1.既然選擇抓取人的數(shù)據(jù),那么初期應該沒有合作的意向和渠道。
 
2.多臺服務器成本高,同一個爬蟲部署在多個地方,維護成本也高(配置、部署、升級、爬蟲之間的相互協(xié)調(diào)等。).
 
3,成本低,不需要在很多地方部署腳本。
 
本文將從原理到實現(xiàn)一步步解釋模式3。
 
Http代理原則
 
當訪問一個站點時,網(wǎng)站服務器可以獲取訪問者的ip。服務器可以根據(jù)ip的請求進行一些限流操作。相反,代理在訪問者和網(wǎng)站之間添加了一個中介。向訪問者中間人發(fā)送請求,中間人將請求轉(zhuǎn)發(fā)給站點,最后中間人將站點的響應返回給訪問者。在這個過程中,網(wǎng)站只能看到代理商(中間人)的ip。
 
沒有代理:訪問者的網(wǎng)站(網(wǎng)站看到訪問者的ip)
 
有代理的情況:訪問者代理站點(站點看到代理的ip)
 
有動態(tài)代理:訪客[代理1,代理2,代理3,...]站點(該站點看到多個代理的隨機ip)
 
嘗試卷曲
 
你可以通過訪問http://httpbin.org/ip:獲得自己的ip
 
卷曲http://httpbin.org/ip{ "起源":" 58.243.254.31"}
 
你可以看到我的外網(wǎng)ip是58.243.254.31。Curl支持- proxy參數(shù)來指定代理:
 
curl-proxy http://localhost:1087 http://httpbin.org/ip{ " origin ":" 217 . 197 . 160 . 199 " }
 
使用代理后,我的ip(訪問過的網(wǎng)站)變成了217.197.160.199。通過以上實驗,你一定對代理有了一定的認知。
 
用nodejs寫一個簡單的爬蟲
 
這個爬蟲非常簡單,即它請求http://httpbin.org/ip并將返回值打印到控制臺。
 
#創(chuàng)建一個名為node-crawler mkdir node-crawler的文件夾#輸入此文件夾cd node-crawler#創(chuàng)建一個默認包. jsonnpm init -y#安裝請求取決于npm i -S請求#創(chuàng)建一個名為index.js TouchIndex.js的新文件。
 
index.js的內(nèi)容如下:
 
const request = require(" request ");Request(,(err,res,body)=>{ //暫時忽略錯誤消息,直接打印body console . log(body);});
 
在控制臺上執(zhí)行node index.js,您將獲得以下輸出:
 
{ "origin": "58.243.254.31,58.243.254.31"}
 
與curl類似,我們可以為請求方法配置代理參數(shù):
 
const request = require(" request ");request({ URL:" http://http bin . org/IP ",proxy: "http://localhost: 1087"},(err,res,body)= > {//暫時忽略錯誤消息,直接打印body console . log(body);});
 
再次執(zhí)行node index.js,您將獲得以下輸出:
 
{ "origin": "217.197.160.199,217.197.160.199"}
 
至此,單個http代理已經(jīng)完成。接下來,我們討論如何在多個http代理之間動態(tài)地來回切換,以削弱被爬取的站點對訪問者ip的限制。
 
第一個方案
 
從外部將ip代理參數(shù)傳遞給爬蟲腳本,爬蟲運行后自動退出,然后取另一個ip代理參數(shù),爬蟲腳本重新運行,循環(huán)往復。
 
您可以像這樣編寫一個shell腳本:
 
#!/usr/bin/env bash#假設有2個http代理可用=(' http://a . b . c . d:8443 ' ' http://h . I . j . k:1087 ');# while(真)一遍又一遍;Do #一次取出“$”中p的一個代理;Do echo使用代理$p #運行crawler PROXY=$p node index.js #休眠一段時間
 
其中PROXY=$p是定義環(huán)境變量的代理,其值是兩個http代理中的任意一個。讓我們修改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)= > {//暫時忽略錯誤消息,直接打印body console . log(body);});
 
該方案使用bash腳本和js爬蟲腳本。對于不了解bash的人來說,維護起來有一定的心理負擔。接下來我們用純js語言來實現(xiàn)。
 
第二個方案
 
將方案一中的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)= > {//暫時忽略錯誤消息。//5秒后取下一個代理,重新運行爬蟲setTimeout( main,5000,index+1);});}
 
綜上所述,我們實現(xiàn)了從不使用代理,使用單個代理,再使用多個代理的過程,讓我們的爬蟲盡可能少的受到服務器電流限制的影響。我們還研究了當一個需求有多種解決方案時,如何選擇經(jīng)濟成本、開發(fā)成本和維護成本。
 
宜川县| 正定县| 铁力市| 临武县| 磐石市| 临洮县| 南通市| 丰台区| 屏东县| 太湖县| 大姚县| 南丹县| 拉孜县| 车险| 锡林郭勒盟| 上虞市| 西华县| 积石山| 杭锦旗| 五原县| 肇源县| 公主岭市| 夏津县| 梁河县| 沾益县| 谷城县| 龙井市| 会泽县| 东海县| 繁昌县| 巧家县| 锡林郭勒盟| 云阳县| 乌鲁木齐县| 东至县| 福建省| 花垣县| 巴林右旗| 乐山市| 九台市| 泽普县|