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