一 什么是ADSL

ADSL:非对称数字用户环路,它的上行和下行带宽不对称,它采用频分复用技术把普通的电话线分成了电话、上行和下行3个相对独立的信道,从而避免了相互之间的干扰。

ADSL通过拨号的方式上网,需要输入ADSL账号和密码,每次拨号就更换一个IP。IP分布在多个A段,如果IP都能使用,则意味着IP量级和达千万。如果我们将ADSL主机作为代理。每隔一段时间主机拨号就换一个IP,这样可以有效防止IP被封禁。另外,主机的稳定性很好,代理响应速度很快。

二 准备工作

成功安装Redis数据库,另外还需要安装下面软件。

'requests>=2.13.0', 'tornado>=4.4.3', 'redis>=2.10.5'

三 购买动态拨号主机

1 可到云立方购买:https://www.yunlifang.cn/dynamicvps.asp

2 购买后推荐安装CentOS 7操作系统。

3 通过远程管理面板连接VPS主机

4 运行ppp.sh脚本进行配置

5 拨号的两条命令

adsl-start
adsl-stop

6 不停的启动关闭,并执行命令ifconfig,会发现IP在不停的变化

四 安装代理服务器

以CentOS上TinyProxy为例进行安装:

1 安装

yum install -y epel-release
yum update -y
yum install -y tinyproxy

2 配置

vi /etc/tinyproxy/tinyproxy.conf

取消注释

Allow 127.0.0.1

3 启动

systemctl enable tinyproxy.service
systemctl restart  tinyproxy.service

4 防火墙

如不能访问可能是防火墙问题,可以放行端口

iptables -I INPUT -p tcp --dport 8888 -j ACCEPT

或直接关闭防火墙

systemctl stop firewalld.service

5 测试

curl -x  192.168.0.110:8888 httpbin.org/get

五 动态获取IP

多配置一些拨号主机,因为存在主机拨号切换IP的间歇代理不可用问题,所以可以将可用的代理信息存到一个Redis数据库,并把不用的信息删除。

六 存储模块

各个拨号机器只需要将各自的主机标识和当前IP和端口发送给数据库就好了。

# coding=utf-8
import redis
import random
from adslproxy.config import *class RedisClient(object):def __init__(self, host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, proxy_key=PROXY_KEY):"""初始化Redis连接:param host: Redis 地址:param port: Redis 端口:param password: Redis 密码:param proxy_key: Redis 哈希表名"""self.db = redis.StrictRedis(host=host, port=port, password=password, decode_responses=True)self.proxy_key = proxy_keydef set(self, name, proxy):"""设置代理:param name: 主机名称:param proxy: 代理:return: 设置结果"""return self.db.hset(self.proxy_key, name, proxy)def get(self, name):"""获取代理:param name: 主机名称:return: 代理"""return self.db.hget(self.proxy_key, name)def count(self):"""获取代理总数:return: 代理总数"""return self.db.hlen(self.proxy_key)def remove(self, name):"""删除代理:param name: 主机名称:return: 删除结果"""return self.db.hdel(self.proxy_key, name)def names(self):"""获取主机名称列表:return: 获取主机名称列表"""return self.db.hkeys(self.proxy_key)def proxies(self):"""获取代理列表:return: 代理列表"""return self.db.hvals(self.proxy_key)def random(self):"""随机获取代理:return:"""proxies = self.proxies()return random.choice(proxies)def all(self):"""获取字典:return:"""return self.db.hgetall(self.proxy_key)

七 拨号模块

# coding=utf-8
import re
import time
import requests
from requests.exceptions import ConnectionError, ReadTimeout
from adslproxy.db import RedisClient
from adslproxy.config import *
import platformif platform.python_version().startswith('2.'):import commands as subprocess
elif platform.python_version().startswith('3.'):import subprocess
else:raise ValueError('python version must be 2 or 3')class Sender():def get_ip(self, ifname=ADSL_IFNAME):"""获取本机IP:param ifname: 网卡名称:return:"""(status, output) = subprocess.getstatusoutput('ifconfig')if status == 0:pattern = re.compile(ifname + '.*?inet.*?(\d+\.\d+\.\d+\.\d+).*?netmask', re.S)result = re.search(pattern, output)if result:ip = result.group(1)return ipdef test_proxy(self, proxy):"""测试代理:param proxy: 代理:return: 测试结果"""try:response = requests.get(TEST_URL, proxies={'http': 'http://' + proxy,'https': 'https://' + proxy}, timeout=TEST_TIMEOUT)if response.status_code == 200:return Trueexcept (ConnectionError, ReadTimeout):return Falsedef remove_proxy(self):"""移除代理:return: None"""self.redis = RedisClient()self.redis.remove(CLIENT_NAME)print('Successfully Removed Proxy')def set_proxy(self, proxy):"""设置代理:param proxy: 代理:return: None"""self.redis = RedisClient()if self.redis.set(CLIENT_NAME, proxy):print('Successfully Set Proxy', proxy)def adsl(self):"""拨号主进程:return: None"""while True:print('ADSL Start, Remove Proxy, Please wait')self.remove_proxy()(status, output) = subprocess.getstatusoutput(ADSL_BASH)if status == 0:print('ADSL Successfully')ip = self.get_ip()if ip:print('Now IP', ip)print('Testing Proxy, Please Wait')proxy = '{ip}:{port}'.format(ip=ip, port=PROXY_PORT)if self.test_proxy(proxy):print('Valid Proxy')self.set_proxy(proxy)print('Sleeping')time.sleep(ADSL_CYCLE)else:print('Invalid Proxy')else:print('Get IP Failed, Re Dialing')time.sleep(ADSL_ERROR_CYCLE)else:print('ADSL Failed, Please Check')time.sleep(ADSL_ERROR_CYCLE)def run():sender = Sender()sender.adsl()if __name__ == '__main__':run()

八 接口模块

# coding=utf-8
import json
import tornado.ioloop
import tornado.web
from tornado.web import RequestHandler, Application
from adslproxy.config import *class MainHandler(RequestHandler):def initialize(self, redis):self.redis = redisdef get(self, api=''):if not api:links = ['random', 'proxies', 'names', 'all', 'count']self.write('<h4>Welcome to ADSL Proxy API</h4>')for link in links:self.write('<a href=' + link + '>' + link + '</a>
')if api == 'random':result = self.redis.random()if result:self.write(result)if api == 'names':result = self.redis.names()if result:self.write(json.dumps(result))if api == 'proxies':result = self.redis.proxies()if result:self.write(json.dumps(result))if api == 'all':result = self.redis.all()if result:self.write(json.dumps(result))if api == 'count':self.write(str(self.redis.count()))def server(redis, port=API_PORT, address=''):application = Application([(r'/', MainHandler, dict(redis=redis)),(r'/(.*)', MainHandler, dict(redis=redis)),])application.listen(port, address=address)print('ADSL API Listening on', port)tornado.ioloop.IOLoop.instance().start()

爬虫之ADSL拨号代理相关推荐

  1. 关于在linux上面配置ADSL拨号代理的注意事项

    首先按照崔大的步骤安装代理:崔大ADSL拨号代理 安装的时候有几点需要注意: 第一个注意点: epel-release是一个源,类似pip的阿里源,这里也要把yum源换成阿里的,不然在执行yum命令时 ...

  2. Python使用Tornado+Redis维护ADSL拨号服务器代理池

    们尝试维护过一个免费的代理池,但是代理池效果用过就知道了,毕竟里面有大量免费代理,虽然这些代理是可用的,但是既然我们能刷到这个免费代理,别人也能呀,所以就导致这个代理同时被很多人使用来抓取网站,所以当 ...

  3. 使用Tornado+Redis维护ADSL拨号服务器代理池

    我们尝试维护过一个免费的代理池,但是代理池效果用过就知道了,毕竟里面有大量免费代理,虽然这些代理是可用的,但是既然我们能刷到这个免费代理,别人也能呀,所以就导致这个代理同时被很多人使用来抓取网站,所以 ...

  4. Python爬虫技巧一之设置ADSL拨号服务器代理

    Python爬虫技巧一之设置ADSL拨号服务器代理 https://zhuanlan.zhihu.com/p/25286144

  5. Python3爬虫教程之ADSL拨号爬虫ip池的使用

    在我之前做爬虫经常需要维护自己的爬虫ip池,他可以挑选出很多有用的爬虫地址,因为不是专业的而且这些爬虫ip通常是公共爬虫ip,所以可用率不是太高,而且这样类型的地址很大情况下都是多人共用的,被封地址概 ...

  6. C# 通过ADSL拨号更换IP

    环境 开发环境:vs2010 操作系统:win10 .net版本 : .net4.0 需求 当进行http请求的时候,短时间内同一个IP发送大量请求,有些网站会禁止这个IP获取到资源,这种时候就需要更 ...

  7. linux拨号上网的命令,LINUX下ADSL拨号上网

    环境:RHEL 5 1.安装PPP包(ppp-2.4.4-1.el5.i386.rpm) # rpm -ivh ppp-2.4.4-1.el5.i386.rpm 2.安装pppoe包(rp-pppoe ...

  8. Ubuntu ADSL 拨号上网时断时续问题

    在使用 pppoeconf 后可能出现网络链接时断时续以及网络管理器显示设备未托管.原因是 NetWorkManager 与 networking 命令有冲突,不能混合使用.如果遇到该问题,请尝试: ...

  9. ADSL拨号中出现的错误代码

    ADSL拨号中出现的错误代码 Error 602 The port is already open 问题:拨号网络网络由于设备安装错误或正在使用,不能进行连接 原因:RasPPPoE没有完全和正确的安 ...

最新文章

  1. delphi ScriptGate 调用JS
  2. python中删除对象方法的区别_python中delattr删除对象方法的代码分析
  3. 动态二级下拉菜单html,js实现简洁大方的二级下拉菜单效果代码
  4. 分页及其管理、页面置换算法
  5. linux之如何复制文件夹所有文件到其它文件夹
  6. matlab r2014a错误,MATLAB中的潜在错误使R2014a回归
  7. Centos7.2 域名解析 /etc/resolv.conf 被覆盖
  8. 怎么使用hsqldb 和 mybatis 构造单元测试
  9. arm linux 蜂鸣器qt,Qt 程序中使用蜂鸣器 ioctl()
  10. 亿航智能⻓续航⻜机有望在4-8周内首⻜亮相
  11. 小米11渲染图曝光:屏下摄像头技术现身还有方形5摄相机模组
  12. Spring中控制反转IoC理论推导
  13. java中的控制器,java-两个控制器在Spring Boot中具有不同的最...
  14. fabs在python中是什么意思_Python fabs() 与 abs() 区别是什么?
  15. 汉字转拼音之Jpinyin 简单使用
  16. 内容推荐场景中自监督学习的应用
  17. 论信息系统人力资源管理
  18. 基本概念的理解与讨论
  19. python圣诞雪人
  20. Tita 绩效宝:让管理者提高1对1面谈水平的5大技巧

热门文章

  1. Android APP增量升级的实现方式
  2. android启动界面修改工具,安卓 软件界面修改 修改安卓启动界面
  3. java中的string是什么意思_java中String[][] 是什么东西?string[]又是什么东西?
  4. qrcode 自定义二维码组件
  5. 基于ArcGIS的Python编程秘笈笔记(三):自动化地图制图和打印
  6. 80后相亲面面观 男生找富婆不怕倒插门。80后的特点!你占几样?
  7. 面试题---框架阶段
  8. UWA学堂上新|虚幻引擎源码解析——基础容器篇
  9. 解决Pandas的to_excel()写入不同Sheet,而不会被重写
  10. 一个Mathematica能解、maple不行的高阶线性常微分方程