V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
liuxurong
V2EX  ›  Python

1个VPS,有2个IP,Python用Requests抓取网页,如何使用第二个IP?

  •  
  •   liuxurong · 2012-11-20 08:46:19 +08:00 · 8275 次点击
    这是一个创建于 4381 天前的主题,其中的信息可能已经有所发展或是发生改变。
    xxx.xxx.xxx.xx1
    xxx.xxx.xxx.xx2

    .xx1是默认那个,如何在python内用第二个IP?
    19 条回复    1970-01-01 08:00:00 +08:00
    manoon
        1
    manoon  
       2012-11-20 10:28:30 +08:00   ❤️ 1
    socket proxy
    mudone
        2
    mudone  
       2012-11-20 17:52:52 +08:00
    cURL可以指定ip发起请求。
    CoX
        3
    CoX  
       2012-11-20 18:11:57 +08:00
    以前做过个小应用,用的是httplib2,稍作了下修改就能bind ip 了,不知道requests能不能直接bind ip
    Livid
        4
    Livid  
    MOD
       2012-11-20 18:15:16 +08:00
    import requests

    headers = {}
    headers['Host'] = 'www.example.com'
    requests.get('http://10.0.0.1/', headers=headers)
    BigZ
        5
    BigZ  
       2012-11-20 18:35:01 +08:00
    @Livid 你没有看懂lz意思,

    lz,你只能修改路由表,让系统使用指定IP作为源址,用ip route 来改
    简单的做法是,你先在本机取消一个ip的绑定,只留你想要的那个
    或者你起一个nginx做代理,配置文件里面listen两个不同的ip,python使用这个代理去采集,反正都是本机,性能损失不大
    liuxurong
        6
    liuxurong  
    OP
       2012-11-20 18:39:50 +08:00
    谢谢楼上各位
    看来要用 @BigZ 的方法
    bhuztez
        7
    bhuztez  
       2012-11-20 18:44:44 +08:00   ❤️ 1
    SO_BINDTODEVICE 泪流满面啊
    CoX
        8
    CoX  
       2012-11-20 19:00:03 +08:00   ❤️ 1
    @liuxurong 虽然性能损失不大,但是为此做个nginx代理真必要

    httplib2改个三五行代码,直接就能实现你的要求
    liuxurong
        9
    liuxurong  
    OP
       2012-11-20 19:50:00 +08:00
    @CoX 可否给个示例代码?
    zbgzao
        10
    zbgzao  
       2012-11-20 19:57:48 +08:00   ❤️ 2
    当然random_ip务必要改为外网IP
    http://gist.github.com/4117504
    zbgzao
        11
    zbgzao  
       2012-11-20 20:00:42 +08:00   ❤️ 1
    感觉v2ex积分策略有点不靠谱, 我们算是绞尽脑汁给楼主想解决方案, 居然还要扣点, 而楼主可是一箭双雕 @Livid
    kuaizi
        12
    kuaizi  
       2012-11-20 20:10:35 +08:00
    一句命令修改VPS出口ip
    http://actgod.com/archives/33/
    这个?
    CoX
        13
    CoX  
       2012-11-20 20:30:47 +08:00
    @liuxurong 和10L代码类似,就是加上 socket.bind((source_ip,0)) 即可
    ledzep2
        14
    ledzep2  
       2012-11-20 20:32:39 +08:00
    bind正解
    liuxurong
        15
    liuxurong  
    OP
       2012-11-21 00:58:18 +08:00
    @zbgzao 代码可用,谢谢你们!采用这个方案了 我愿意给积分都给你 哈哈 :)
    @CoX
    humiaozuzu
        16
    humiaozuzu  
       2012-11-21 01:48:55 +08:00   ❤️ 1
    @Livid @zbgzao 你的绞尽脑汁就是copy的很辛苦吗? http://stackoverflow.com/a/1150408/492864

    @liuxurong google: python set source ip 就有很多答案了
    yaotian
        17
    yaotian  
       2012-12-05 08:12:49 +08:00
    @zbgzao 这个random ip要在线吗?还是说任意的ip地址?
    BOYPT
        18
    BOYPT  
       2012-12-05 10:56:16 +08:00
    @zbgzao 充分说明v2ex是一个鼓励吐槽的社区。
    neildd
        19
    neildd  
       2012-12-05 11:08:40 +08:00
    --- /usr/lib64/python2.4/httplib.py 2009-09-04 03:38:18.000000000 +0800
    +++ /usr/lib64/python2.4/httplib.py 2010-07-06 18:07:18.000000000 +0800
    @@ -156,6 +156,7 @@
    # maximal amount of data to read at one time in _safe_read
    MAXAMOUNT = 1048576

    +Local_BindIP = None
    class HTTPMessage(mimetools.Message):

    def addheader(self, key, value):
    @@ -621,6 +622,8 @@
    af, socktype, proto, canonname, sa = res
    try:
    self.sock = socket.socket(af, socktype, proto)
    + if Local_BindIP is not None:
    + self.sock.bind((Local_BindIP,0))
    if self.debuglevel > 0:
    print "connect: (%s, %s)" % (self.host, self.port)
    self.sock.connect(sa)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1098 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:22 · PVG 03:22 · LAX 11:22 · JFK 14:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.