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,然后验证是否能用,再存进数据库里,要用的时候从数据库里取

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值