当前位置: 首页 > news >正文

python http代理_python HTTP代理中转服务

不知道该取一个什么名字,所以叫HTTP代理中转服务,其实就是将客户端HTTP请求转发给代理IP,再把代理IP的响应返回给客户端,这个有什么用处呢?

很简单,像python的爬虫为了防爬会使用代理IP,代码如下:

import requests

def jc_proxies():

try:

s = requests.session()

proxies={

"http": "x.x.x.x:yyyy",

}

r = s.get('http://www.baidu.com')

print r.content

except Exception,e:

if isinstance(e,requests.exceptions.ReadTimeout):

print e

else:

print(e)

jc_proxies()

但是一个代理IP被封了咋办,所以会准备很多,然后要不断改变 proxies 里的http,这样就很麻烦,能不能ip一直不换,后台开一个服务帮我自动请求不同的代理IP呢?

哈哈哈......

走过路过不要错过

这个HTTP代理中转就是干这事儿用的,不过我这里只用了一个代理IP,不过稍微改一下代码就可以多个代理IP了

代码很简单,就用到socket变成,有注释就不啰嗦了

代码如下:

# -*-coding:utf-8-*-

"""

ayou

"""

import socket

from socket import error

import threading

class ProxyServerTest():

def __init__(self):

#本地socket服务

self.ser=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

def run(self):

try:

#本地服务IP和端口

self.ser.bind(('127.0.0.1', 9999))

#最大连接数

self.ser.listen(5)

except error as e:

print("The local service : "+str(e))

return "The local service : "+str(e)

while 1:

try :

#接收客户端数据

client,addr=self.ser.accept()

print 'accept %s connect'%(addr,)

data=client.recv(1024)

if not data:

break

print data

except error as e:

print("Local receiving client : "+str(e))

return "Local receiving client : "+str(e)

try:

#目标代理服务器,将客户端接收数据转发给代理服务器

mbsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

mbsocket.connect(('202.171.253.72', 80))

mbsocket.send(data)

except error as e:

print("Sent to the proxy server : "+str(e))

return "Sent to the proxy server : "+str(e)

while 1:

try:

#从代理服务器接收数据,然后转发回客户端

data_1 = mbsocket.recv(1024)

if not data_1:

break

print data_1

client.send(data_1)

except error as e:

print("Back to the client : "+str(e))

return "Back to the client : "+str(e)

#关闭连接

client.close()

mbsocket.close()

def main():

try:

pst = ProxyServerTest()

#多线程

t = threading.Thread(target=pst.run, name='LoopThread')

print 'Waiting for connection...'

#关闭多线程

t.start()

t.join()

except Exception as e:

print("main : "+str(e))

return "main : "+str(e)

if __name__ == '__main__':

main()

客户端测试代码:

import requests

def jc_proxies():

try:

s = requests.session()

proxies={

"http": "127.0.0.1:9999",

}

r = s.get('http://1212.ip138.com/ic.asp',proxies=proxies,timeout=10)

print r.content

except Exception,e:

if isinstance(e,requests.exceptions.ReadTimeout):

print e

else:

print(e)

jc_proxies()

http://1212.ip138.com/ic.asp 是查看你当前IP的网站

结果:

可以看到检测到的是代理IP

稍微改一下代码,实现随机向多个代理ip发请求

代码如下:

# -*-coding:utf-8-*-

"""

ayou

"""

import socket

from socket import error

import threading

import random

class ProxyServerTest():

def __init__(self,proxyip):

#本地socket服务

self.ser=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

self.proxyip = proxyip

def run(self):

try:

#本地服务IP和端口

self.ser.bind(('127.0.0.1', 9999))

#最大连接数

self.ser.listen(5)

except error as e:

print("The local service : "+str(e))

return "The local service : "+str(e)

while 1:

try :

#接收客户端数据

client,addr=self.ser.accept()

print 'accept %s connect'%(addr,)

data=client.recv(1024)

if not data:

break

print data

except error as e:

print("Local receiving client : "+str(e))

return "Local receiving client : "+str(e)

try:

#目标代理服务器,将客户端接收数据转发给代理服务器

mbsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

iplen = len(self.proxyip)

prip = self.proxyip[random.randint(0,iplen-1)][0]

prpo = self.proxyip[random.randint(0,iplen-1)][1]

mbsocket.connect((prip, prpo))

mbsocket.send(data)

except error as e:

print("Sent to the proxy server : "+str(e))

return "Sent to the proxy server : "+str(e)

while 1:

try:

#从代理服务器接收数据,然后转发回客户端

data_1 = mbsocket.recv(1024)

if not data_1:

break

print data_1

client.send(data_1)

except error as e:

print("Back to the client : "+str(e))

return "Back to the client : "+str(e)

#关闭连接

client.close()

mbsocket.close()

def main():

#这里只有一个代理IP,可以添加很多,换个思路也可以从数据库里取ip和端口

ip_list = [("202.171.253.72",80)]

try:

pst = ProxyServerTest(ip_list)

#多线程

t = threading.Thread(target=pst.run, name='LoopThread')

print 'Waiting for connection...'

#关闭多线程

t.start()

t.join()

except Exception as e:

print("main : "+str(e))

return "main : "+str(e)

if __name__ == '__main__':

main() 因为比较穷只能去免费的代理IP网站抓免费的代理IP,然后验证是否能用,再存进数据库里,要用的时候从数据库里取

相关文章:

  • wxpython使用简介_wxPython:事件处理介绍一
  • 必须声明标量变量 @sum_level。_Java变量
  • ubuntu localhost可以访问 ip不能访问_通过两次ssh tunnel访问gateway后主机上的jupyter notebook服务...
  • python形参和实参的含义_Python3函数的形参如何接收实参?
  • 在python将字符串中的空格转换为下划线_如何将下划线替换为空格,反之亦然?...
  • python图像锐化_opencv实现图片模糊和锐化操作
  • python中configparser函数_python基础14 ---函数模块4(configparser模块)
  • python接口自动化测试报告_python接口自动化(二十七)--html 测试报告——上(详解)...
  • python中的常量和变量_python中的常量和变量代码详解
  • 常用公差配合表图_《公差配合与测量技术》小结
  • pythonassert关键字_Python assert实现软件测试
  • php 设置会员到期_支付宝推出“轻会员”,先享受优惠再交会员费
  • 很装b那种cmd命令_CMD命令混淆分析
  • 宏定义判定x是否为整数_整数与整数都还差不多从“高斯整数”到“代数整数”...
  • python 邻接矩阵_用Python做社会网络分析(1):简介
  • 【Amaple教程】5. 插件
  • 【Leetcode】104. 二叉树的最大深度
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • canvas 绘制双线技巧
  • CentOS7 安装JDK
  • github从入门到放弃(1)
  • Java精华积累:初学者都应该搞懂的问题
  • jquery ajax学习笔记
  • js
  • node学习系列之简单文件上传
  • PAT A1092
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • vue总结
  • 百度地图API标注+时间轴组件
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端
  • 使用parted解决大于2T的磁盘分区
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 通过几道题目学习二叉搜索树
  • 学习笔记TF060:图像语音结合,看图说话
  • 正则与JS中的正则
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #考研#计算机文化知识1(局域网及网络互联)
  • (¥1011)-(一千零一拾一元整)输出
  • (2015)JS ES6 必知的十个 特性
  • (6)设计一个TimeMap
  • (C语言)字符分类函数
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (九十四)函数和二维数组
  • (算法)求1到1亿间的质数或素数
  • (转)大道至简,职场上做人做事做管理
  • (转)关于pipe()的详细解析
  • (自用)交互协议设计——protobuf序列化
  • .“空心村”成因分析及解决对策122344
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .Net Redis的秒杀Dome和异步执行
  • .NET 命令行参数包含应用程序路径吗?
  • .Net(C#)自定义WinForm控件之小结篇