爬虫之搭建ip代理

日期: 2020-01-02 13:39

听说你又被封 ip 了,你要学会伪装好自己,这次说说伪装你的头部。可惜加了header请求头,加了cookie 还是被限制爬取了。这时就得祭出IP代理池!!!

response = requests.get(url,proxies=proxies)
爬虫之搭建ip代理

这样就可以使用你定义的代理地址去访问网站了

但IP代理哪里来阿?有两种方式

付费API接口(IP量虽多,但是稳定性不好,有的代理响应慢延迟非常高)免费IP代理 (IP量少,不稳定,但免费呀,基础爬虫已够,但是公司业务肯定是不够的)

我就采取了第三种自己代理池:

1.首先要准备vps动态拨号服务器,这里给大家推荐云立方(https://www.yunlifang.cn/),这家的vps真心不错,大家要记得先找客服小姐姐要服务器试用, QQ:2851300015,这个小姐姐很负责,问题都很给你解决妥协。

2.vps 购买之后使用 adsl-start 命令进行拨号,这里我使用的是centos系统,系统不同,搭建的方式也不同

adsl-start 拨号成功后我们能看到pppo网卡

爬虫之搭建ip代理

爬虫之搭建ip代理


如果拨号不成功,提示timeout,就艾特客服小姐姐很快帮解决。

pppo表示拨号成功了,这个时候我们要准备下一步,代理端口开放,这里我使用 tinyproxy

yum install tinyproxy

这时有的服务器会提示找不到tinyproxy安装包 ,需要安装 epel-release 然后再安装tinyproxy

yum install epel-release

安装完 tinyproxy 编辑tinyproxy.conf 文件的相关配置。

只需要找到Allow 127.0.0.1 这行注释掉 # Allow 127.0.0.1

保存后 service tinyproxy start 启动服务

爬虫之搭建ip代理

爬虫之搭建ip代理


我们可以看到服务启动了

代理端口是默认的 8888 ,也可以再tinyproxy.conf 的时候改成自己想要的端口

这时候我们用代码远程shell进行拨号在把他存入 redis中 ,构建成自己的代理就ok了:附上代码

# -*- coding:utf-8 -*-
# @Author: HanDh
# @Time: 2019/12/26

import re
import time
import paramiko
import redis
import multiprocessing

cache_data = {}
users = [
{
"host": "服务器地址",
"user": "用户",
"pwd": "密码",
"port": "端口"
}
]
class ADSL(object):
def __init__(self):
self.rd = redis.Redis(host='*************redis.rds.aliyuncs.com', port=6789,
password='********', db=1, decode_responses=True)

def cmd(self,u):
try:
host = u.get("host")
user = u.get("user")
password = u.get("pwd")
port = u.get("port")
k = host + port
ssh = paramiko.SSHClient() # 创建SSH对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接不在know_hosts文件中的主机
ssh.connect(hostname=host,port=port, username=user, password=password,auth_timeout=5) # 连接服务器
d_ip = self.rd.hget("ip_map",k)

time.sleep(1)
ssh.exec_command("service tinyproxy restart")
ssh.exec_command("adsl-stop")
time.sleep(2)
ssh.exec_command("adsl-start")
time.sleep(5)
if d_ip == None:
pass
else:
self.rd.srem("IP2", d_ip)
print("删除成功", d_ip)
#如果拨号尝试3次拨号,
for i in range(3):
try:
stdin, stdout, stderr = ssh.exec_command("ifconfig")
result = stdout.read().decode()
pattern = 'ppp[\s\S]+inet(.*)netmask'
s = re.findall(pattern,result)[0].strip()
ip = s + ":8888"
print('新ip', ip, '\n')
self.rd.hset("ip_map", k, ip)
self.rd.sadd("IP2", ip)
break
except Exception as e:
time.sleep(1)
print(host+port,e)
ssh.close()
except Exception as e:
print(u.get("host"),e,'\n')


def start(u):
s = ADSL()
s.cmd(u)

if __name__=="__main__":
s = ADSL()
s.rd.delete("IP2")
while True:
for u in users:
start(u)
time.sleep(40)

相关新闻