写爬虫总会有用到http代理的时候,通常的做法都是直接去代理网站(比如快代理,米扑代理)找代理ip来用,但是这些http代理的原理是什么?代理网站是怎么扫描到这么多代理ip的?这两个问题一直困扰着我,可能以前也查过相关资料,但没记住=。=# 今天还是把这个记下来吧,好记性不如烂笔头不是嘛。
一、http代理原理
参考:https://imququ.com/post/web-proxy.html
python实现简单的http代理:https://github.com/abhinavsingh/proxy.py
著名的开源http代理程序有:squid、harproxy、varnish。关于squid的用法可以参考我的下一篇文章《使用squid搭建代理服务器》
从知乎上摘抄了一份对比图,对比了这些开源代理的特性,可以了解一下。
二、端口扫描
代理网站如何扫描到那些可用的代理ip,最直接的方法就是使用暴力穷举:
扫描所有ipv4公网地址(ipv4地址数量有255*255*255*255大概42亿个,其中公网ip大概占20多亿个);
对每个公网ip进行端口扫描(最常用的是TCP SYN扫描),确认该ip下有哪些端口号对外开放(一台主机的端口数量是65535个);
然后再对这几个端口分别进行http代理测试,确认是否可用。
端口扫描的原理其实就是对该[ip: port]尝试进行TCP三次握手,参考:http://zenoh.iteye.com/blog/1264915
下面是一段python实现的最简单的端口扫描脚本:
#!/usr/bin/env python from socket import * if __name__ == '__main__': target = raw_input('Enter host to scan: ') targetIP = gethostbyname(target) print 'Starting scan on host ', targetIP # 尝试扫描20 ~ 1025号端口 for i in range(20, 1025): s = socket(AF_INET, SOCK_STREAM) # 连接测试(CONNECT扫描,进行三次握手) result = s.connect_ex((targetIP, i)) if(result == 0) : print 'Port %d: OPEN' % (i,) s.close()
ps:github上有一个用java实现的ip端口扫描器:https://github.com/angryziber/ipscan