版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | http://vearne.cc

起因

最近公司有一批数据要备份到对象存储中。机房为3线机房,为了充分利用机房的出口带宽,我只能轮流绑定源IP(本机有3个IP,分别是联通、移动、电信)

源码如下:

# -*- coding: utf-8 -*-
import socket
import requests

class BindAddress(object):
    def __init__(self, ip):
        self.ipbind = ip
        self.real_socket = socket.socket

    def __enter__(self):
        def bound_socket(*a, **k):
            sock = self.real_socket(*a, **k)
            sock.bind((self.ipbind, 0))
            return sock

        socket.socket = bound_socket

    def __exit__(self, type, value, trace):
        socket.socket = self.real_socket

ip= 'xxx.xxx.xxx.xxx'
with BindAddress(ip):
    r = requests.get('http://ip.vearne.cc:8080/')
    print r.content

我在峰云大神的基础上做了进一步封装,使得bind操作变得更简单
另外代码中用到了我在 快速获取本机出口IP 一文中搭建的服务,以判断bind是否生效。

额外的说明1

其实我们在爬虫的时候,也有用这种方法,在增加客户端IP,以减少被封杀的概率。只需要在一块网卡上绑定多个公网IP即可。

额外的说明2

由于以上的做法修改的是模块的函数,因此对于多线程的场景,它不是线程安全的。

参考资料

  1. 分布式爬虫之python动态获取随机选择出口ip

如果我的文章对你有帮助,你可以给我打赏以促使我拿出更多的时间和精力来分享我的经验和思考总结。

微信支付码

anyShare分享到:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.