一個靠爬蟲賺錢的思路

一個靠爬蟲賺錢的思路

今天早上登錄我的虛擬機,發現速度慢得出奇。每次運行命令,都要等好一段時間才能看到結果。就如 cat 一個文件的內容這種命令,都要等好一會兒。查看CPU使用率、內存使用率,都很正常。但查看網絡連接的時候,發現有好多人連到我的3128端口。

熟悉代理服務器的朋友們知道,3128是squid的默認端口。之前我在虛擬機上配了一個squid,本來是自己用的,因為沒有設用戶名密碼,這兩天被別人掃出來,作為公共的代理被用了。於是我停掉squid服務,果然,一下子虛擬機的速度就回復正常了。

但是問題來了,是誰在用我的代理呢?

其實猜也才能猜到,一定是那些代理提供商掃出了我的機器,然後把我的代理提供給他們的用戶。我拿我的IP去百度了一下,果然發現被一些代理提供商收錄了。

進一步深入思考一下,代理提供商是怎麼掃到我的代理的呢?

掃代理的原理其實很簡單,就是掃描一個網絡中的服務器,掃出那些啟用代理服務的機器,測試它們是哪種類型的代理(透明代理、匿名代理還是高匿代理),然後代理提供商將這些代理提供給它的客戶。

這麼想想,其實做一個代理提供商也不是很難。那這樣,我們不是自己也可以掃描代理,把資源賣給有需要的客戶了?

順著上面的思路,我整理了一下自己搭建這樣一個服務涉及的幾個步驟,列了幾個關鍵點。

掃描代理服務器

掃端口我們可以用 nmap 這個工具。nmap 是一個網絡掃描的工具,它可以用來掃描對方服務器啟用了哪些端口、哪些服務,服務器是否在線,以及猜測服務器可能運行的操作系統。

我們針對一臺機器運行 nmap 命令,可以掃出這個機器啟用了哪些端口(服務),比如

$ nmap 49.51.193.128
Starting Nmap 7.01 ( https://nmap.org ) at 2019-03-09 20:32 CST
Nmap scan report for 49.51.193.128
Host is up (0.18s latency).
Not shown: 995 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp filtered smtp
111/tcp open rpcbind
445/tcp filtered microsoft-ds
1080/tcp open socks
Nmap done: 1 IP address (1 host up) scanned in 27.34 seconds

要掃出一個網段中的代理服務器,我們可以針對一個網段作掃描,如下

$ nmap 49.51.193.0/24

上面的命令會掃出所有在 49.51.193.0/24這個網段中有哪些在線的機器,每臺機器上啟用了哪些服務。

檢測代理類型

掃出來代理服務器後,我們可以對這些代理服務器做測試,看看它們是什麼類型的代理。

代理基本上分成這三種類型:

  • 透明代理匿名代理高匿代理

通過字面意思,大致能猜到這三種代理的區別。簡單的說,透明代理就是用了之後,對方服務器很清楚的知道你是誰,你來自哪個IP。匿名代理用了之後,對方沒法知道你是誰,但是知道你用了代理。而高匿代理比匿名代理隱藏性更高,對方不僅不知道你是誰,也不知道你用了代理。

三者在技術層面的區別,主要在於HTTP請求頭的內容不同

透明代理

REMOTE_ADDR = Proxy IP

HTTP_VIA = Proxy IP

HTTP_X_FORWARDED_FOR = Your IP

匿名代理

REMOTE_ADDR = proxy IP

HTTP_VIA = proxy IP

HTTP_X_FORWARDED_FOR = proxy IP

高匿代理

REMOTE_ADDR = Proxy IP

HTTP_VIA = not determined

HTTP_X_FORWARDED_FOR = not determined

檢測代理類型的方法也非常簡單,只需要自己搭建一個web服務器,在上面跑一個web程序。客戶端通過代理向web服務器發起請求,web程序打印出請求頭,通過分析請求頭的內容就可以知道這個代理是哪種類型的。

下面是我用 Flask 寫了一個例子,大致是這麼個意思

import json
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def hello():
 header = {}
 if "REMOTE_ADDR" in request.headers:
 header["REMOTE_ADDR"] = request.headers["REMOTE_ADDR"]
 if "HTTP_VIA" in request.headers:
 header["HTTP_VIA"] = request.headers["HTTP_VIA"]
 if "HTTP_X_FORWARDED_FOR" in request.headers:
 header["HTTP_X_FORWARDED_FOR"] = request.headers["HTTP_X_FORWARDED_FOR"]
 return json.dumps(header)
if __name__ == "__main__":
 app.run(host="0.0.0.0", port=8080)

運行這個程序,當我們通過代理訪問這個web服務,它就會返回代理請求頭的信息,我們可以據此判斷代理是透明、匿名還是高匿代理。

維護代理池

好,有了代理和代理的類型,我們可以將他們做成一個代理池,提供一個接口給客戶,讓他們通過接口來獲取可用的代理。

當然這些掃出來的代理有效時間長短不一,有的代理也許可以用很久,有的代理可能一會兒時間就失效了。我們需要保證代理池中的代理是有效的,可以定期的去檢查代理的有效性,把失效的從列表中去除,把新的有效的加入進來。

當我們做出了這樣一個接口後,我們可以把這個接口打包成服務賣給客戶,比如按照調用次數收費或者按月收費。

市面上,對於代理池的需求還是很大的,主要是爬蟲用戶,有些公司也需要爬取競爭對手網站的數據來做分析。用代理池可以避免短時間內請求次數太多而被封掉的情況,當然對於公司來說,除了這方面因素,也想隱藏自己的IP來源,不讓競爭對手發現自己的意圖。

以上是一個賺錢項目的思路,分享給大家。


分享到:


相關文章: