概述
点击上方“简说Python”,选择“置顶/星标公众号”
福利干货,第一时间送达!
作者 | 强哥
来源 | Python与数据分析
今天早上登录我的虚拟机,发现速度慢得出奇。每次运行命令,都要等好一段时间才能看到结果。就如 cat 一个文件的内容这种命令,都要等好一会儿。查看 CPU 使用率、内存使用率,都很正常。但查看网络连接的时候,发现有好多人连到我的 3128 端口。
熟悉代理服务器的朋友们知道,3128 是 squid 的默认端口。之前我在虚拟机上配了一个 squid,本来是自己用的,因为没有设用户名密码,这两天被别人扫出来,作为公共的代理被用了。于是我停掉 squid 服务,果然,一下子虚拟机的速度就回复正常了。
但是问题来了,是谁在用我的代理呢?
其实猜也才能猜到,一定是那些代理提供商扫出了我的机器,然后把我的代理提供给他们的用户。我拿我的 IP 去百度了一下,果然发现被一些代理提供商收录了。
进一步深入思考一下,代理提供商是怎么扫到我的代理的呢?
扫代理的原理其实很简单,就是扫描一个网络中的服务器,扫出那些启用代理服务的机器,测试它们是哪种类型的代理(透明代理、匿名代理还是高匿代理),然后代理提供商将这些代理提供给它的客户。
这么想想,其实做一个代理提供商也不是很难。那这样,我们不是自己也可以扫描代理,把资源卖给有需要的客户了?
顺着上面的思路,我整理了一下自己搭建这样一个服务涉及的几个步骤,列了几个关键点。
01 扫描代理服务器
扫端口我们可以用 nmap 这个工具。nmap 是一个网络扫描的工具,它可以用来扫描对方服务器启用了哪些端口、哪些服务,服务器是否在线,以及猜测服务器可能运行的操作系统。
我们针对一台机器运行 nmap 命令,可以扫出这个机器启用了哪些端口(服务),比如
1$ nmap 49.51.193.128
2
3Starting Nmap 7.01 ( https://nmap.org ) at 2019-03-09 20:32 CST
4Nmap scan report for 49.51.193.128
5Host is up (0.18s latency).
6Not shown: 995 closed ports
7PORT STATE SERVICE
822/tcp open ssh
925/tcp filtered smtp
10111/tcp open rpcbind
11445/tcp filtered microsoft-ds
121080/tcp open socks
13
14Nmap done: 1 IP address (1 host up) scanned in 27.34 seconds
要扫出一个网段中的代理服务器,我们可以针对一个网段作扫描,如下
1$ nmap 49.51.193.0/24
上面的命令会扫出所有在 49.51.193.0/24 这个网段中有哪些在线的机器,每台机器上启用了哪些服务。
02 检测代理类型
扫出来代理服务器后,我们可以对这些代理服务器做测试,看看它们是什么类型的代理。
代理基本上分成这三种类型:
透明代理
匿名代理
高匿代理
通过字面意思,大致能猜到这三种代理的区别。简单的说,透明代理就是用了之后,对方服务器很清楚的知道你是谁,你来自哪个 IP。匿名代理用了之后,对方没法知道你是谁,但是知道你用了代理。而高匿代理比匿名代理隐藏性更高,对方不仅不知道你是谁,也不知道你用了代理。
三者在技术层面的区别,主要在于 HTTP 请求头的内容不同:
透明代理
1REMOTE_ADDR = Proxy IP
2
3HTTP_VIA = Proxy IP
4
5HTTP_X_FORWARDED_FOR = Your IP
匿名代理
1REMOTE_ADDR = proxy IP
2
3HTTP_VIA = proxy IP
4
5HTTP_X_FORWARDED_FOR = proxy IP
高匿代理
1REMOTE_ADDR = Proxy IP
2
3HTTP_VIA = not determined
4
5HTTP_X_FORWARDED_FOR = not determined
检测代理类型的方法也非常简单,只需要自己搭建一个 web 服务器,在上面跑一个 web 程序。客户端通过代理向 web 服务器发起请求,web 程序打印出请求头,通过分析请求头的内容就可以知道这个代理是哪种类型的。
下面是我用 Flask 写了一个例子,大致是这么个意思
1import json
2from flask import Flask, request
3app = Flask(__name__)
4
5@app.route('/')
6def hello():
7 header = {}
8 if "REMOTE_ADDR" in request.headers:
9 header["REMOTE_ADDR"] = request.headers["REMOTE_ADDR"]
10 if "HTTP_VIA" in request.headers:
11 header["HTTP_VIA"] = request.headers["HTTP_VIA"]
12 if "HTTP_X_FORWARDED_FOR" in request.headers:
13 header["HTTP_X_FORWARDED_FOR"] = request.headers["HTTP_X_FORWARDED_FOR"]
14 return json.dumps(header)
15
16if __name__ == "__main__":
17 app.run(host="0.0.0.0", port=8080)
运行这个程序,当我们通过代理访问这个 web 服务,它就会返回代理请求头的信息,我们可以据此判断代理是透明、匿名还是高匿代理。
03 维护代理池
好,有了代理和代理的类型,我们可以将他们做成一个代理池,提供一个接口给客户,让他们通过接口来获取可用的代理。
当然这些扫出来的代理有效时间长短不一,有的代理也许可以用很久,有的代理可能一会儿时间就失效了。我们需要保证代理池中的代理是有效的,可以定期的去检查代理的有效性,把失效的从列表中去除,把新的有效的加入进来。
当我们做出了这样一个接口后,我们可以把这个接口打包成服务卖给客户,比如按照调用次数收费或者按月收费。
市面上,对于代理池的需求还是很大的,主要是爬虫用户,有些公司也需要爬取竞争对手网站的数据来做分析。用代理池可以避免短时间内请求次数太多而被封掉的情况,当然对于公司来说,除了这方面因素,也想隐藏自己的 IP 来源,不让竞争对手发现自己的意图。
以上是一个爬虫赚钱思路,分享给你。
| 推荐阅读
/今日留言主题/
你用爬虫赚过钱么,或者做过什么有意思的赚钱门路?
(留言格式:Dayxx:blahblah
字数限制:20 字以上.)
觉得文章不错,帮忙转发一下,谢谢
最后
以上就是呆萌中心为你收集整理的一个靠爬虫赚钱的思路的全部内容,希望文章能够帮你解决一个靠爬虫赚钱的思路所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复