哈嘍,大家好,我是強(qiáng)哥。
這幾天,鬼滅之刃游郭篇就要上線(xiàn)了,強(qiáng)哥的一個(gè)朋友非常喜歡鬼滅之刃,可以說(shuō)是到了癡迷的地步。每次新篇上線(xiàn)都會(huì)第一時(shí)間觀看。雖然這次上線(xiàn)之前,這家伙就已經(jīng)看過(guò)了,不過(guò)這消息還是把他激動(dòng)的不行,拉著我要我和他重溫一遍。
這不,昨天,還找我要了個(gè)爬蟲(chóng)代碼,去網(wǎng)上搜刮各種鬼滅之刃相關(guān)的圖片??墒?,在我給他代碼后不到一個(gè)小時(shí),這家伙就又罵罵咧咧的跑過(guò)來(lái)找我算賬了,說(shuō)用了我的代碼,剛開(kāi)始爬得還挺好,很舒服??墒沁^(guò)了將近半小時(shí),就發(fā)現(xiàn),有兩個(gè)他經(jīng)常看圖的網(wǎng)站爬不到圖片了。而且,不用軟件,自己用電腦瀏覽器也沒(méi)法訪(fǎng)問(wèn)這倆網(wǎng)站了,這讓他非常惱火。
聽(tīng)了他這么一說(shuō),我就大概明白了個(gè)十有八九,應(yīng)該是爬的有點(diǎn)兇IP被封了。用手機(jī)5G網(wǎng)絡(luò)看了下對(duì)應(yīng)的網(wǎng)站,確實(shí)還是可以正常訪(fǎng)問(wèn),那就沒(méi)錯(cuò)了。
趕緊和這家伙說(shuō)了一些爬蟲(chóng)相關(guān)法律知識(shí),爬蟲(chóng)雖好可以解脫我們的雙手,可是爬的太兇容易被請(qǐng)喝茶。前幾年不是還有個(gè)公司的CTO和程序員被抓判刑了嗎。所以自己還是要控制好頻率,不要沒(méi)有節(jié)制……
大道理講了一通,可是,現(xiàn)在他還想繼續(xù)下怎么辦呢?沒(méi)辦法,只好找找代理了,這家伙又是化石白嫖黨,讓他出錢(qián)是沒(méi)辦法了,強(qiáng)哥只好自己祭出大招了。
IP代理池
沒(méi)錯(cuò),要解決這個(gè)辦法,最簡(jiǎn)單好用的就是IP代理池了,也就是搞到一大堆的可正常使用的代理IP,然后我們用爬蟲(chóng)的時(shí)候,請(qǐng)求不直接發(fā)送到目標(biāo)網(wǎng)站,而是借助代理IP,把請(qǐng)求先發(fā)到代理服務(wù)器,代理服務(wù)器再幫我們把請(qǐng)求發(fā)送到目標(biāo)網(wǎng)站。這樣,假如被目標(biāo)網(wǎng)站發(fā)現(xiàn)了,封的也是代理的IP不是我們自己的IP啦。
至于為什么要用到代理池,主要還是怕老用同一個(gè)代理IP被封了就又沒(méi)法訪(fǎng)問(wèn)了,多搞幾個(gè)寧濫毋缺嘛。
ProxyPool
既然要白嫖,那必須找找開(kāi)源項(xiàng)目。既然要找開(kāi)源項(xiàng)目,那必須要夠?qū)I(yè)的才配的上強(qiáng)哥的代碼。所以,這次的主角是《Python3網(wǎng)絡(luò)爬蟲(chóng)開(kāi)發(fā)實(shí)戰(zhàn)》的作者崔慶才的開(kāi)源項(xiàng)目:ProxyPool。
先簡(jiǎn)單介紹下項(xiàng)目結(jié)構(gòu)吧:
代理池分為四個(gè)部分,獲取模塊、存儲(chǔ)模塊、檢測(cè)模塊、接口模塊。
- 存儲(chǔ)模塊使用 Redis 的有序集合,用以代理的去重和狀態(tài)標(biāo)識(shí),同時(shí)它也是中心模塊和基礎(chǔ)模塊,將其他模塊串聯(lián)起來(lái)。
- 獲取模塊定時(shí)從代理網(wǎng)站獲取代理,將獲取的代理傳遞給存儲(chǔ)模塊,保存到數(shù)據(jù)庫(kù)。
- 檢測(cè)模塊定時(shí)通過(guò)存儲(chǔ)模塊獲取所有代理,并對(duì)其進(jìn)行檢測(cè),根據(jù)不同的檢測(cè)結(jié)果對(duì)代理設(shè)置不同的標(biāo)識(shí)。
- 接口模塊通過(guò) Web API 提供服務(wù)接口,其內(nèi)部還是連接存儲(chǔ)模塊,獲取可用的代理。
項(xiàng)目原理是在各大提供IP代理池的網(wǎng)站把IP搞過(guò)來(lái)然后程序測(cè)試能用之后,才會(huì)存下來(lái)供我們使用,相當(dāng)于幫助我們省去了找免費(fèi)IP代理的時(shí)間。
當(dāng)然,如果只是拿來(lái)用,也不用過(guò)多的在意這些細(xì)節(jié),我們直接沖。
上手
ProxyPool需要本地運(yùn)行起來(lái),運(yùn)行起來(lái)后,會(huì)在本地暴露一個(gè)接口地址: http://localhost:5555/random 直接訪(fǎng)問(wèn)即可獲取一個(gè)隨機(jī)可用代理IP。
強(qiáng)哥用Docker方式下載項(xiàng)目鏡像后,用docker-compose up命令把服務(wù)運(yùn)行起來(lái)了,然后瀏覽器訪(fǎng)問(wèn)效果如下:
沒(méi)錯(cuò),返回的120.196.112.6:3128就是代理IP啦。
Docker鏡像下載方式:
docker pull germey/proxypool
也想搞一波的小伙伴,自己到GitHub上看看吧,用起來(lái)還是很簡(jiǎn)單的: https://github.com/Python3WebSpider/ProxyPool
怎么幫朋友
既然工具有了,就把之前我給朋友的爬蟲(chóng)代碼拿過(guò)來(lái),把代理池懟上去就行了。當(dāng)然,這里就不直接暴露我的爬蟲(chóng)代碼了,給一個(gè)官方示例代碼吧,和我寫(xiě)的也差不多:
import requests
proxypool_url = 'http://127.0.0.1:5555/random'
target_url = 'http://httpbin.org/get'
def get_random_proxy():
"""
get random proxy from proxypool
:return: proxy
"""
return requests.get(proxypool_url).text.strip()
def crawl(url, proxy):
"""
use proxy to crawl page
:param url: page url
:param proxy: proxy, such as 8.8.8.8:8888
:return: html
"""
proxies = {'http': 'http://' + proxy}
return requests.get(url, proxies=proxies).text
def main():
"""
main method, entry point
:return: none
"""
proxy = get_random_proxy()
print('get random proxy', proxy)
html = crawl(target_url, proxy)
print(html)
if __name__ == '__main__':
main()
可以看到,用到代理的方式關(guān)鍵就是這句:requests.get(url, proxies=proxies),直接把獲取到的代理IP搞到proxies去就行了。
這里還要提到代碼中用到的另一個(gè)開(kāi)源項(xiàng)目的地址,對(duì),就是http://httpbin.org/get,我們可以根據(jù)這個(gè)地址返回的數(shù)據(jù)判斷我們發(fā)起訪(fǎng)問(wèn)該地址的IP。
強(qiáng)哥直接用瀏覽器訪(fǎng)問(wèn)的效果:
可以看到這里用了本地IP。
換用上面的代理代碼訪(fǎng)問(wèn)的效果:
可以看到,返回的origin確實(shí)使用了代理IP。也就是說(shuō),我們的IP代理池使用成功了。
強(qiáng)哥朋友在拿到新的爬蟲(chóng)代碼,并進(jìn)行了頻率的節(jié)制,終于不再怎么被封IP了。順帶送了我一張圖:
怎么說(shuō)呢?沒(méi)咬竹子的禰豆子不是好豆子。
搞更深點(diǎn)
IP代理池這玩意除了用在爬蟲(chóng)上還會(huì)被用在哪呢?
嗯……如果看了強(qiáng)哥上篇文章的小伙伴應(yīng)該能猜到,當(dāng)然是DoS攻擊了,其實(shí)爬蟲(chóng)和DoS攻擊,在某些地方還是有交集的,爬蟲(chóng)控制的不好很可能就成了DoS。這個(gè)就不做過(guò)多擴(kuò)展了。
強(qiáng)哥前天還看了個(gè)DoS攻擊的項(xiàng)目,用到了反射原理來(lái)進(jìn)行的攻擊,哈哈,之前都是看DoS攻擊方式介紹的時(shí)候有了解到,這回看到代碼還挺激動(dòng),有機(jī)會(huì)和大家也介紹下。
好了,這篇文章的內(nèi)容發(fā)貨聯(lián)盟就和大家分享到這里,如果大家網(wǎng)絡(luò)推廣引流創(chuàng)業(yè)感興趣,可以添加微信:80709525 備注:發(fā)貨聯(lián)盟引流學(xué)習(xí); 我拉你進(jìn)直播課程學(xué)習(xí)群,每周135晚上都是有實(shí)戰(zhàn)干貨的推廣引流技術(shù)課程免費(fèi)分享!