爬虫之ADSL拨号代理
一 什么是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拨号代理相关推荐
- 关于在linux上面配置ADSL拨号代理的注意事项
首先按照崔大的步骤安装代理:崔大ADSL拨号代理 安装的时候有几点需要注意: 第一个注意点: epel-release是一个源,类似pip的阿里源,这里也要把yum源换成阿里的,不然在执行yum命令时 ...
- Python使用Tornado+Redis维护ADSL拨号服务器代理池
们尝试维护过一个免费的代理池,但是代理池效果用过就知道了,毕竟里面有大量免费代理,虽然这些代理是可用的,但是既然我们能刷到这个免费代理,别人也能呀,所以就导致这个代理同时被很多人使用来抓取网站,所以当 ...
- 使用Tornado+Redis维护ADSL拨号服务器代理池
我们尝试维护过一个免费的代理池,但是代理池效果用过就知道了,毕竟里面有大量免费代理,虽然这些代理是可用的,但是既然我们能刷到这个免费代理,别人也能呀,所以就导致这个代理同时被很多人使用来抓取网站,所以 ...
- Python爬虫技巧一之设置ADSL拨号服务器代理
Python爬虫技巧一之设置ADSL拨号服务器代理 https://zhuanlan.zhihu.com/p/25286144
- Python3爬虫教程之ADSL拨号爬虫ip池的使用
在我之前做爬虫经常需要维护自己的爬虫ip池,他可以挑选出很多有用的爬虫地址,因为不是专业的而且这些爬虫ip通常是公共爬虫ip,所以可用率不是太高,而且这样类型的地址很大情况下都是多人共用的,被封地址概 ...
- C# 通过ADSL拨号更换IP
环境 开发环境:vs2010 操作系统:win10 .net版本 : .net4.0 需求 当进行http请求的时候,短时间内同一个IP发送大量请求,有些网站会禁止这个IP获取到资源,这种时候就需要更 ...
- 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 ...
- Ubuntu ADSL 拨号上网时断时续问题
在使用 pppoeconf 后可能出现网络链接时断时续以及网络管理器显示设备未托管.原因是 NetWorkManager 与 networking 命令有冲突,不能混合使用.如果遇到该问题,请尝试: ...
- ADSL拨号中出现的错误代码
ADSL拨号中出现的错误代码 Error 602 The port is already open 问题:拨号网络网络由于设备安装错误或正在使用,不能进行连接 原因:RasPPPoE没有完全和正确的安 ...
最新文章
- delphi ScriptGate 调用JS
- python中删除对象方法的区别_python中delattr删除对象方法的代码分析
- 动态二级下拉菜单html,js实现简洁大方的二级下拉菜单效果代码
- 分页及其管理、页面置换算法
- linux之如何复制文件夹所有文件到其它文件夹
- matlab r2014a错误,MATLAB中的潜在错误使R2014a回归
- Centos7.2 域名解析 /etc/resolv.conf 被覆盖
- 怎么使用hsqldb 和 mybatis 构造单元测试
- arm linux 蜂鸣器qt,Qt 程序中使用蜂鸣器 ioctl()
- 亿航智能⻓续航⻜机有望在4-8周内首⻜亮相
- 小米11渲染图曝光:屏下摄像头技术现身还有方形5摄相机模组
- Spring中控制反转IoC理论推导
- java中的控制器,java-两个控制器在Spring Boot中具有不同的最...
- fabs在python中是什么意思_Python fabs() 与 abs() 区别是什么?
- 汉字转拼音之Jpinyin 简单使用
- 内容推荐场景中自监督学习的应用
- 论信息系统人力资源管理
- 基本概念的理解与讨论
- python圣诞雪人
- Tita 绩效宝:让管理者提高1对1面谈水平的5大技巧
热门文章
- Android APP增量升级的实现方式
- android启动界面修改工具,安卓 软件界面修改 修改安卓启动界面
- java中的string是什么意思_java中String[][] 是什么东西?string[]又是什么东西?
- qrcode 自定义二维码组件
- 基于ArcGIS的Python编程秘笈笔记(三):自动化地图制图和打印
- 80后相亲面面观 男生找富婆不怕倒插门。80后的特点!你占几样?
- 面试题---框架阶段
- UWA学堂上新|虚幻引擎源码解析——基础容器篇
- 解决Pandas的to_excel()写入不同Sheet,而不会被重写
- 一个Mathematica能解、maple不行的高阶线性常微分方程