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