那是一个寂静的深夜,科比还没起床练球,虽然他真的可能不练了。html
我废了好大劲,爬虫终于写好了!BUG也所有调通了!心想,终于能够不劳而获了!python
泡杯茶,安静地坐在椅子上看着屏幕上一行行文字在控制台跳出,一条条数据嗖嗖进入个人数据库,一张张图片悄悄存入个人硬盘。人生没有几个比这更惬意的事情了。git
我端起茶杯,抿了一口,静静地回味着茶香。github
这时,什么状况!屏幕爆红了!爆红了!一口茶的功夫啊喂!数据库
怎么回事!咋爬不动了,不动了!我用浏览器点开那一个个报错的连接,浏览器显示浏览器
您的请求过于频繁,IP已经被暂时封禁,请稍后再试!bash
沃日,我IP被封了?此时此刻,空气凝固了,茶也再也不香了,请给我一个爱的抱抱啊。服务器
时候不早了,仍是洗洗睡吧。网络
那一晚,展转反侧难以入睡。curl
怎么办?怎么办?若是是你你该怎么办?
手动换个IP?得了吧,一会又要封了,还能不能安心睡觉啊?
找免费代理?可行,不过我以前测过很多免费代理IP,一大半都很差用,并且慢。不过能够一直维护一个代理池,定时更新。
买代理?能够能够,不过优质的代理服务商价格但是不菲的,我买过一些廉价的,好比几块钱套餐一次提取几百IP的,算了仍是不说了都是泪。
然而最行之有效的方法是什么?那固然是ADSL拨号!
这是个啥?且听我慢慢道来。
ADSL (Asymmetric Digital Subscriber Line ,非对称数字用户环路)是一种新的数据传输方式。它由于上行和下行带宽不对称,所以称为非对称数字用户线环路。它采用频分复用技术把普通的电话线分红了电话、上行和下行三个相对独立的信道,从而避免了相互之间的干扰。
他有个独有的特色,每拨一次号,就获取一个新的IP。也就是它的IP是不固定的,不过既然是拨号上网嘛,速度也是有保障的,用它搭建一个代理,那既能保证可用,又能自由控制拨号切换。
若是你是用的ADSL上网方式,那就不用过多设置了,直接本身电脑调用一个拨号命令就行了,自动换IP,分分钟解决封IP的事。
然而,你可能说?我家宽带啊,我连得公司无线啊,我蹭的网上的啊!那咋办?
这时,你就须要一台VPS拨号主机。
某度广告作的那么好是吧?一搜一片,这点谷歌但是远远比不上啊。
因而乎,我就搜了搜,键入:拨号服务器,有什么骑士互联啊、无极网络啊、挂机宝啊等等的。我选了个价钱还凑合的,选了个无极网络(这里不是在打广告),80一个月的配置,一天两块钱多点。
2核、512M内存,10M带宽。
下面是连接:
你们以为有更便宜的更好用请告诉我呀!
接下来开始装操做系统,进入后台,有一个自助装系统的页面。
我装的CentOS的,在后面设置代理啊,定时任务啊,远程SSH管理啊之类的比较方便。若是你想用Windows,能配置好代理那也没问题。
有的小伙伴可能会问了,既然它的IP是拨号变化的,你咋用SSH连?其实服务商提供了一个域名,作了动态解析和端口映射,映射到这台主机的22端口就行了,因此不用担忧IP变化致使SSH断开的问题。
好了装好了服务器以后,服务商提供了一个ADSL的拨号操做过程,用pppoe命令均可以完成,若是你的是Linux的主机通常都是用这个。而后服务商还会给给你一个拨号帐号和密码。
那么接下来就是试下拨号了。
服务商会提供详细的拨号流程说明。
好比无极的是这样的:
设置好了以后,就有几个关键命令:
1 2 3 |
pppoe-start 拨号 pppoe-stop 断开拨号 pppoe-status 拨号链接状态 |
若是想从新拨号,那就执行stop、start就能够了。
反复执行,而后查看下ip地址,你会发现拨号一次换一个IP,是否是爽翻了!
好,那接下来就设置代理吧。
以前老是用别人的代理,没本身设置过吧?那么接下来咱们就来亲自搭建HTTP代理。
Linux下搭建HTTP代理,推荐Squid和TinyProxy。都很是好配置,你想用哪一个都行,且听我慢慢道来。
个人系统是CentOS,以它为例进行说明。
首先利用yum安装squid
1 |
yum -y install squid |
设置开机启动
1 |
chkconfig --level 35 squid on |
修改配置文件
1 |
vi /etc/squid/squid.conf |
修改以下几个部分:
1 2 3 |
http_access allow !Safe_ports #deny改为allow http_access allow CONNECT !SSL_ports #deny改为allow http_access allow all #deny改为allow |
其余的不须要过多配置。
启动squid
1 |
sudo service squid start |
如此一来配置就完成了。
代理使用的端口是3128
首先添加一下镜像源,而后安装
1 2 3 |
rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm yum update yum install tinyproxy |
修改配置
1 |
vi /etc/tinyproxy/tinyproxy.conf |
能够修改端口和容许的IP,若是想任意主机都链接那就把Allow这一行注释掉。
1 2 3 4 |
Port 8888 #预设是8888 Port,你能够更改 Allow 127.0.0.1 #将127.0.0.1改为你本身的IP #例如你的IP 是1.2.3.4,你改为Allow 1.2.3.4,那只有你才能够连上这个Proxy #若你想任何IP均可以脸到Proxy在Allow前面打#注释 |
启动TinyProxy
1 |
service tinyproxy start |
好了,两个代理都配置好了。
你想用那个均可以!
不过你觉得这样就完了吗?太天真了,我被困扰了好几天,怎么都连不上,我还在怀疑是否是我哪里设置得不对?各类搜,一直觉得是哪里配置有遗漏,后来发现是iptables的锅,万恶的防火墙。踩过的的坑,那就不要让你们踩了,用下面的命令设置下iptables,放行3128和8888端口就行了。
1 2 3 4 5 6 |
service iptables save systemctl stop firewalld systemctl disable firewalld systemctl start iptables systemctl status iptables systemctl enable iptables |
修改iptables配置
1 |
vi /etc/sysconfig/iptables |
在
1 |
-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT |
的下面添加两条规则
1 2 |
-A IN_public_allow -p tcp -m tcp --dport 3128 -m conntrack --ctstate NEW -j ACCEPT -A IN_public_allow -p tcp -m tcp --dport 8888 -m conntrack --ctstate NEW -j ACCEPT |
如图所示
保存,而后重启iptables
1 |
sudo service iptabels restart |
输入
ifconfig获得IP地址,在其余的主机上输入
1 |
curl -x IP:8888 www.baidu.com |
测试一下,若是能出现结果,那就说明没问题。
若是怎么配都连不上,那干脆关了你的防火墙吧。虽然不推荐。
接下来才是重头戏,你咋知道你的服务器IP如今究竟是多少啊?拨一次号IP就换一次,那这还了得?
若是服务商提供了端口映射!那一切都解决了!直接用端口映射过去就行了。然而,个人并无。
自力更生,艰苦创业!
首先我研究了一下DDNS服务,也就是动态域名解析。即便你的IP在变化,那也能够经过一个域名来映射过来。
原理简单而统一:当前拨号主机定时向一个固定的服务器发请求,服务器获取remote_addr就行了,能够作到定时更新和解析。
那么我找了一下,国内作的比较好的就是花生壳了,而后又找到了DNSPOD的接口解析。
下面简单说下个人折腾过程,你们能够先不用试,后面有更有效的方法。
如今花生壳出到3.0版本了,有免费版和付费版之分,我就试用了一下免费版的。这里是花生壳的一些配置和下载:
下载花生壳客户端以后,会生成SN码,用这个在花生壳的官网登陆后,会分配给你一个免费的域名。
接下来这个域名就能解析到你的主机了。
DNSPOD原理也是同样,不过好处是你能够配置本身的域名。
在GitHub上有脚本可使用。
具体的细节我就不说了,实际上就是定时请求,利用remote_addr更新DNSPOD记录,作到动态解析。
不过!这两个有个通病!慢!
什么慢?解析慢!但这不是他们的锅,由于DNS修改后彻底生效就是须要必定的时间,这一秒你拨号了,而后更新了IP,可是域名可能仍是解析着原来的IP,须要过几分钟才能变过来。这能忍吗?
我但是在跑爬虫啊,这还能忍?
嗯,V2EX果真是个好地方,逛了一下,收获不小。
参考了 abelyao 的思路,本身写了脚原本获取IP,保证秒级更新!
此时,你还须要另外一台固定IP的主机或者某个云服务器,只要是地址固定的就好。在这里我用了另外一台有固定IP的阿里云主机,固然你若是有什么新浪云啊之类的也能够。
那么如今的思路就是,拨号VPS定时拨号换IP,而后请求阿里云主机,阿里云主机获取VPS的IP地址便可。
拨号VPS作的事情:
定时拨号,定时请求服务器。使用bash脚本,而后crontab定时执行。
远程服务器:
接收请求,获取remote_addr,保存起来。使用Flask搭建服务器,接收请求。
废话少说,上代码
因为DDNS生效时间过长,对于爬虫等一些时间要求比较紧迫的项目就不太适用,为此本项目根据DDNS基本原理来实现实时获取ADSL拨号主机IP。
client文件夹由ADSL拨号客户机运行。它会定时执行拨号操做,而后请求某个固定地址的服务器,以便让服务器获取ADSL拨号客户机的IP,主要是定时bash脚本运行。
server文件夹是服务器端运行,利用Python的Flask搭建服务器,而后接收ADSL拨号客户机的请求,获得remote_addr,获取客户机拨号后的IP。
服务器提供两个功能,record方法是客户机定时请求,而后获取客户机IP并保存。proxy方法是供咱们本身用,返回保存的客户机IP,提取代理。
克隆项目
1 |
git clone https://github.com/Germey/AutoProxy.gi |
修改配置
修改config.py文件
1 2 |
cd server nohup python main.py |
ADSL客户机
克隆项目
1 |
git clone https://github.com/Germey/AutoProxy.git |
修改配置
修改reqeust.conf文件
http://120.27.14.24/record
。修改pppoe.sh文件
这里面写上从新拨号的几条命令,记得在前两行配置一下环境变量,配置上拨号命令所在的目录,以防出现脚本没法运行的问题。
设置定时任务
1 |
crontab -e |
输入crontab的实例命令
1 |
*/5 * * * * /var/py/AutoProxy/client/request.sh /var/py/AutoProxy/client/request.conf >> /var/py/AutoProxy/client/request.log |
注意修改路径,你的项目在哪里,都统一修改为本身项目的路径。
最前面的*/5是5分钟执行一次。
好了,保存以后,定时任务就会开启。
这样一来,访问服务器地址,就能够获得ADSL拨号客户机的IP了。
1 2 3 4 5 |
import requests
url = 'http://120.27.14.24:5000' proxy = requests.get(url, auth=('admin', '123')).text print(proxy) |
实例结果:
1 |
116.208.97.22:8888 |
若是你有域名,能够本身解析一个域名,这样就能够直接请求本身的域名,拿到实时好用的代理了,并且定时更新。
1 2 3 4 5 6 |
import urllib2 proxy_handler = urllib2.ProxyHandler({"http": 'http://' + proxy}) opener = urllib2.build_opener(proxy_handler) urllib2.install_opener(opener) response = urllib2.urlopen('http://httpbin.org/get') print response.read() |
1 2 3 4 5 6 |
import requests proxies = { 'http': 'http://' + proxy, } r = requests.get('http://httpbin.org/get', proxies=proxies) print(r.text) |
以上便秒级解决了动态IP解析,本身实现了一遍DDNS,爽!
那这样以来,之后就能够直接请求你的主机获取一个最新可用的代理IP了,稳定可用,定时变化!
以上即是ADSL拨号服务器配置的全过程,但愿对你们有帮助!