13

でいくつかのリクエストを行うスクリプトがありますurllib2

スタック オーバーフローの他の場所で提案されているトリックを使用して、別の IP をアプリケーションにバインドします。私のコンピューターには 2 つの IP アドレス (IP A と IP B) があります。

requestsライブラリの使用に切り替えたい。そのライブラリで同じ機能を実現する方法を知っている人はいますか?

4

2 に答える 2

19

requestsモジュールを調べてみるとhttplib、http リクエストの送信に使用されているようです。www ホストへの接続にhttplib使用します。socket.create_connection()

それを知って、あなたが提供したリンクの猿のパッチ方法に従ってください:

import socket

real_create_conn = socket.create_connection

def set_src_addr(*args):
    address, timeout = args[0], args[1]
    source_address = ('IP_ADDR_TO_BIND_TO', 0)
    return real_create_conn(address, timeout, source_address)

socket.create_connection = set_src_addr

import requests
r = requests.get('http://www.google.com')

内部の dictを拡張しようとして失敗したhttplibため、すべての引数 ( to create_connection()) を args (vs キーワード) として渡すようです。上記はあなたが望むものだと思いますが、テストするデュアルホームマシンがありません。kwargsset_src_addr

于 2012-09-25T20:35:34.067 に答える
0

実際には、次のようなリクエストにIP をバインドする必要があります。

import urllib3
real_create_conn = urllib3.util.connection.create_connection

def set_src_addr(address, timeout, *args, **kw):
    source_address = ('YOUR_BIND_IP', 0)
    return real_create_conn(address, timeout=timeout, source_address=source_address)

urllib3.util.connection.create_connection = set_src_addr

import requests
r = requests.get('http://ipecho.net/plain')
print( r.text)
于 2022-01-19T15:02:12.717 に答える