最近在写一个高可用的分布式代理抓取和校验程序 ,由于细节还没实现得比较完美,测试也还没完成,所以暂时项目还是private
状态。其中在实现代理IP校验器的时候,遇到了很多困难。比如,1.如何合理地对代理IP的质量进行判定,到底以代理速度还是代理的可用性为考核标准,还是以一个加权的方式来考核?如果加权的话,应该怎么进行加权计算? 2.由于地理位置和一些其他因素,某些IP访问某些特定网站会被屏蔽或者失败,这种我们应该如何来进行评判? 这些问题困扰我两周了,还没想到特别好的实现方法,现在想到的一个方法是在过滤掉透明IP之后,对剩下来的IP进行进行持续校验和打分,根据采集量的大小,从校验过的IP中拿出得分最高的N个IP,再把他们放到squid中,让squid去做调度。这种服务化的方式,可以省去一些客户端校验和反馈的步骤,勉强也能做到不错的效果。
现在的问题就是,由于该项目是开源程序,为了对项目更好地做宣传和普及,我想通过实际的效果来赢得更多地用户,为此我在我的腾讯云服务器上搭了一个squid代理来做二级代理,有兴趣的小伙伴可以点击这里查看搭建方法。但是我不想让端口扫描器把squid给扫到,让我的服务器充当肉鸡,所以需要想个办法做权限控制。squid虽然提供了通过ip来做访问控制的功能,但这样就不能让用户试用了。后来查到可以使用用户名密码这种方式,这是我比较满意的方式。下面是它的配置步骤。
现在假设大家都读了使用squid为爬虫添加二级代理 这篇文章并且已经成功搭建起了squid代理服务器。现在我们要做的就是为其设置用户名和密码。我使用的是64位的CentOS7。我们需要使用htpasswd
命令来生成用户名和密码,在CentOS上,可以通过
yum install httpd-tools
然后生成我们想要的用户名和密码
htpasswd -c /etc/squid/passwd test
这里test
是我的用户名,在输入这个命令之后,终端会提示你输入密码,并确认密码。我测试设置的密码是123456
。
然后我们再修改squid的配置文件
vim /etc/squid/squid.conf
如果你是根据我前面那篇博文搭建的squid,那么需要把http_access allow all
改成 http_access deny all
,然后在配置文件中添加下面内容
auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 10 # 设置认证程序的进程数,根据请求量的大小做设置
auth_param basic credentialsttl 2 hours #设置认证的有效时间,我在实际用的时候并没有设置这个参数,让认证不过期
acl auth_user proxy_auth REQUIRED # 设置认证用户需要密码
http_access allow auth_user #设置允许认证的用户进行访
该段内容需写在http_access deny all
之前。这里的/usr/lib64/squid/basic_ncsa_auth
是由操作系统的版本决定的,也可能是/usr/lib64/squid/ncsa_auth
,32位系统的话就是/usr/lib/squid/basic_ncsa_auth
,可以使用
find / -name "ncsa"
这个命令来查找。
此外,注意防火墙要放行3128这个端口,我用的CentOS7,所以直接通过
service firewalld stop
关闭了firewalld
,如果是iptables
的话,通过vim /etc/sysconfig/iptables
对3128放行
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3128 -j ACCEPT
然后直接通过
service squid restart
重启squid即可。
通过上述步骤,我们便可以搭建起一个根据用户名和密码进行认证的squid代理服务器
了,搭建成功后,如何进行验证呢?通过wget
即可验证
wget -e "http_proxy=http://test:123456@202.105.42.14:3138/" http://www.baidu.com/
如果你熟悉Python,也可以使用requests
来进行验证
import requests
proxy = {'http': 'http://test:123456@202.105.42.14:3138/', 'https': 'http://test:123456@202.105.42.14:3138/'}
resp = requests.get('https://httpbin.org/ip', proxies=proxy)
print(resp.json())
可以看到响应的内容是代理IP。
参考博文
网友评论