爬虫代理的作用
在我们的爬虫系统中, 如果在一台服务器上不停的访问通一个目标站点, 很有可能因为对方的发爬虫策略而将您的爬虫请求给阻止, 导致您无法获取网站的信息. 所以我们一般采用一个代理池的方式, 不停的切换代理, 将爬虫的请求伪装成为不同代理发起的, 从而避开这种问题. 这里以 centos7 和 squid 为例介绍如何建立一个 http 或者 https 的代理服务器.
软件安装
该软件需要使用 openssl 组件, 所以如果没有安装请执行如下命令进行安装
yum install openssl
首先检查是否已经安装了 squid 软件. 执行如下的命令
rpm -qa squid
如果显示 package squid is not installed 则表示没有安装, 否则会显示具体的安装包信息. 如果没有安装, 则执行安装命令如下
yum install -y squid*
结束后, 再执行检查命令, 则显示结果如下
- [root@localhost ~]# rpm -qa squid
- squid-3.5.20-12.el7.x86_64
软件配置
squid 的配置文件默认是 /etc/squid/squid.conf 文件. 默认情况下, squid 只允许有限几个内网地址段来访问. 所以我们在的 acl localcal 部分加入如下的内容:
- acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
- acl localnet src 0.0.0.0/20
上面一行是原来有的, 下面一个行是我们先加入的. 然后我们改一下默认的端口号
- #http_port 3128
- http_port 5872
最后修改一下访问日志配置
- coredump_dir /var/spool/squid
- access_log /var/log/squid/access.log
下面一行设置了访问日志的文件为 /var/log/squid/access.log
启动服务
首先需要在防火墙中开放刚才配置的端口 5872 . 执行如下命令
- firewall-cmd --zone=public --add-port=5872/tcp --permanent
- firewall-cmd --reload
这个命将 5872 端口加入到防火墙的开发端口列表中持久化保存, 并且重新载入防火墙策略, 让其生效
然后执行命令启动
systemctl start squid
启动后, 我们执行命令命令
- [root@localhost ~]# netstat -lnp
- Active Internet connections (only servers)
- Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
- tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1689/master
- tcp 0 0 0.0.0.0:15678 0.0.0.0:* LISTEN 20050/sshd
- tcp6 0 0 :::5872 :::* LISTEN 27903/(squid-1)
可以看到, squid 服务已经在端口 5872 上开始监听了
使用和监控
已 Chrome 为例. 打开 Chrome "设置菜单", 在底部展开 "高级", 在底部找到 "打开代理设置" 菜单, 在对话框中点击 "局域网设置" 按钮, 在新出现的界面中输入代理服务器的设置. 如下图所示
Chrome 代理设置
确定后, 就可以在浏览器中使用代理服务器来访问网络了. 为了看到效果, 我们在浏览器上访问《不一样的 Java 日期格式化大全》 这篇文章, 同时对代理服务器的访问日志进行监控, 看到日志输出如下
- [root@localhost ~]# tail -f /var/log/squid/access.log
- 1543289079.273 16467 192.168.1.60 TCP_TUNNEL/200 3687 CONNECT upload-images.jianshu.io:443 - HIER_DIRECT/61.156.196.84 -
- 1543289079.274 16715 192.168.1.60 TCP_TUNNEL/200 152 CONNECT upload.jianshu.io:443 - HIER_DIRECT/150.138.176.244 -
- 1543289079.274 16667 192.168.1.60 TCP_TUNNEL/200 4159 CONNECT upload.jianshu.io:443 - HIER_DIRECT/150.138.176.244 -
- 1543289079.524 0 192.168.1.60 TCP_DENIED/403 4085 CONNECT events.jianshu.io:4006 - HIER_NONE/- text/html
- 1543289081.664 0 192.168.1.60 TCP_DENIED/403 4085 CONNECT events.jianshu.io:4006 - HIER_NONE/- text/HTML
- 1543289082.433 0 192.168.1.60 TCP_DENIED/403 4085 CONNECT events.jianshu.io:4006 - HIER_NONE/- text/HTML
- 1543289097.966 35623 192.168.1.60 TCP_TUNNEL/200 55584 CONNECT upload-images.jianshu.io:443 - HIER_DIRECT/61.156.196.84 -
- 1543289097.991 35259 192.168.1.60 TCP_TUNNEL/200 16029 CONNECT upload-images.jianshu.io:443 - HIER_DIRECT/61.156.196.84 -
- 1543289099.311 60913 192.168.1.60 TAG_NONE/503 0 CONNECT clients4.google.com:443 - HIER_NONE/- -
- 1543289100.321 38894 192.168.1.60 TCP_TUNNEL/200 23165 CONNECT upload.jianshu.io:443 - HIER_DIRECT/150.138.176.244 -
- 1543289109.312 47056 192.168.1.60 TCP_TUNNEL/200 10707 CONNECT upload.jianshu.io:443 - HIER_DIRECT/150.138.176.244 -
可以看到, 是通过代理服务器的转发来访问的目标网站.
代理服务器鉴权
上面的代理服务器如果是在公网上提供服务的, 那么所有人都能使用这个代理服务. 如果我们想加入鉴权机制对这个进行限制, 则需要增加其他配置. 这里我们采用用户名和密码的鉴权方式, 具体方法如下.
首先用 apache 的密码工具生成用户密码, 如果没有的话需要先安装 httpd 软件
yum install httpd
然后生成密码.
- [root@localhost ~]# htpasswd -c /etc/squid/passwd youname
- New password:
- Re-type new password:
- Adding password for user youname
如果没有 htpasswd 命令, 则安装 apache
yum install -y httpd
在 http_access deny all 语句之前, 加入如下的配置内容
- cache_dir ufs /var/spool/squid 100 16 256
- cache_mem 128 MB
- maximum_object_size 128 MB
- cache_dir ufs /var/spool/squid 100 16 256
- auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd
- auth_param basic children 5
- auth_param basic realm your message
- auth_param basic credentialsttl 5 hours
- acl ncsa_users proxy_auth REQUIRED
- http_access allow ncsa_users
然后重启
来源: http://www.jianshu.com/p/da2049f916c4