日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python 控制有线网卡_Python 使用指定的网卡发送HTTP请求的实例

發(fā)布時(shí)間:2023/12/2 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 控制有线网卡_Python 使用指定的网卡发送HTTP请求的实例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

需求: 一臺機(jī)器上有多個(gè)網(wǎng)卡, 如何訪問指定的 URL 時(shí)使用指定的網(wǎng)卡發(fā)送數(shù)據(jù)呢?

$ curl --interface eth0 www.baidu.com # curl interface 可以指定網(wǎng)卡

閱讀 urllib.py 的源碼, 追述到 open_http –> httplib.HTTP –> httplib.HTTP._connection_class = HTTPConnection

HTTPConnection 在創(chuàng)建的時(shí)候會指定一個(gè) source_address.

HTTPConnection.connect 時(shí)調(diào)用 HTTPConnection._create_connection = socket.create_connection

# 先看一下本地網(wǎng)卡信息

$ ifconfig

lo0: flags=8049 mtu 16384

options=3

inet6 ::1 prefixlen 128

inet 127.0.0.1 netmask 0xff000000

inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1

nd6 options=1

en0: flags=8863 mtu 1500

ether c8:e0:eb:17:3a:73

inet6 fe80::cae0:ebff:fe17:3a73%en0 prefixlen 64 scopeid 0x4

inet 192.168.20.2 netmask 0xffffff00 broadcast 192.168.20.255

nd6 options=1

media: autoselect

status: active

en1: flags=8863 mtu 1500

options=4

ether 0c:5b:8f:27:9a:64

inet6 fe80::e5b:8fff:fe27:9a64%en8 prefixlen 64 scopeid 0xa

inet 192.168.8.100 netmask 0xffffff00 broadcast 192.168.8.255

nd6 options=1

media: autoselect (100baseTX )

status: active

可以看到en0和en1, 這兩塊網(wǎng)卡都可以訪問公網(wǎng). lo0是本地回環(huán).

直接修改 socket.py 做測試.

def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT,

source_address=None):

"""If *source_address* is set it must be a tuple of (host, port)

for the socket to bind as a source address before making the connection.

An host of '' or port 0 tells the OS to use the default.

source_address 如果設(shè)置, 必須是傳遞元組 (host, port), 默認(rèn)是 ("", 0)

"""

host, port = address

err = None

for res in getaddrinfo(host, port, 0, SOCK_STREAM):

af, socktype, proto, canonname, sa = res

sock = None

try:

sock = socket(af, socktype, proto)

# sock.bind(("192.168.20.2", 0)) # en0

# sock.bind(("192.168.8.100", 0)) # en1

# sock.bind(("127.0.0.1", 0)) # lo0

if timeout is not _GLOBAL_DEFAULT_TIMEOUT:

sock.settimeout(timeout)

if source_address:

print "socket bind source_address: %s" % source_address

sock.bind(source_address)

sock.connect(sa)

return sock

except error as _:

err = _

if sock is not None:

sock.close()

if err is not None:

raise err

else:

raise error("getaddrinfo returns an empty list")

參考說明文檔, 直接分三次綁定不通網(wǎng)卡的 IP 地址, 端口設(shè)置為0.

# 測試 en0

$ python -c 'import urllib as u;print u.urlopen("http://ip.haschek.at").read()'

.148.245.16

# 測試 en1

$ python -c 'import urllib as u;print u.urlopen("http://ip.haschek.at").read()'

.94.115.227

# 測試 lo0

$ python -c 'import urllib as u;print u.urlopen("http://ip.haschek.at").read()'

Traceback (most recent call last):

File "", line 1, in

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 87, in urlopen

return opener.open(url)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 213, in open

return getattr(self, name)(url)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 350, in open_http

h.endheaders(data)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 1049, in endheaders

self._send_output(message_body)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 893, in _send_output

self.send(msg)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 855, in send

self.connect()

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 832, in connect

self.timeout, self.source_address)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 578, in create_connection

raise err

IOError: [Errno socket error] [Errno 49] Can't assign requested address

測試通過, 說明在多網(wǎng)卡情況下, 創(chuàng)建 socket 時(shí)綁定某塊網(wǎng)卡的 IP 就可以, 端口需要設(shè)置為0. 如果端口不設(shè)置為0, 第二次請求時(shí), 可以看到拋異常, 端口被占用.

Traceback (most recent call last):

File "", line 1, in

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 87, in urlopen

return opener.open(url)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 213, in open

return getattr(self, name)(url)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 350, in open_http

h.endheaders(data)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 1049, in endheaders

self._send_output(message_body)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 893, in _send_output

self.send(msg)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 855, in send

self.connect()

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 832, in connect

self.timeout, self.source_address)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 577, in create_connection

raise err

IOError: [Errno socket error] [Errno 48] Address already in use

如果是在項(xiàng)目中, 只需要把 socket.create_connection 這個(gè)函數(shù)的形參 source_address 設(shè)置為對應(yīng)網(wǎng)卡的 (IP, 0) 就可以.

# test-interface_urllib.py

import socket

import urllib, urllib2

_create_socket = socket.create_connection

SOURCE_ADDRESS = ("127.0.0.1", 0)

#SOURCE_ADDRESS = ("172.28.153.121", 0)

#SOURCE_ADDRESS = ("172.16.30.41", 0)

def create_connection(*args, **kwargs):

in_args = False

if len(args) >=3:

args = list(args)

args[2] = SOURCE_ADDRESS

args = tuple(args)

in_args = True

if not in_args:

kwargs["source_address"] = SOURCE_ADDRESS

print "args", args

print "kwargs", str(kwargs)

return _create_socket(*args, **kwargs)

socket.create_connection = create_connection

print urllib.urlopen("http://ip.haschek.at").read()

通過測試, 可以發(fā)現(xiàn)已經(jīng)可以通過制定的網(wǎng)卡發(fā)送數(shù)據(jù), 并且 IP 地址對應(yīng)網(wǎng)卡分配的 IP.

問題, 爬蟲經(jīng)常使用 requests, requests 是否支持呢. 通過測試, 可以發(fā)現(xiàn), requests 并沒有使用 python 內(nèi)置的 socket 模塊.

看源碼, requests 是如果創(chuàng)建的 socket 連接呢. 方法和查看 urllib 創(chuàng)建socket 的方式一樣. 具體就不寫了.

因?yàn)槲矣玫氖?python 2.7, 所以可以定位到 requests 使用的 socket 模塊是 urllib3.utils.connection 的.

修改方法和 urllib 相差不大.

import urllib3.connection

_create_socket = urllib3.connection.connection.create_connection

# pass

urllib3.connection.connection.create_connection = create_connection

# pass

運(yùn)行后, 可能會拋出異常. requests.exceptions.ConnectionError: Max retries exceeded with .. Invalid argument

這個(gè)異常不是每次出現(xiàn), 跟 IP 段有關(guān)系, 跳轉(zhuǎn)遞歸層數(shù)太多導(dǎo)致, 只需要將 kwargs 中的 socket_options去掉即可. 127.0.0.1肯定會出異常.

import socket

import urllib

import urllib2

import urllib3.connection

import requests as req

_default_create_socket = socket.create_connection

_urllib3_create_socket = urllib3.connection.connection.create_connection

SOURCE_ADDRESS = ("127.0.0.1", 0)

#SOURCE_ADDRESS = ("172.28.153.121", 0)

#SOURCE_ADDRESS = ("172.16.30.41", 0)

def default_create_connection(*args, **kwargs):

try:

del kwargs["socket_options"]

except:

pass

in_args = False

if len(args) >=3:

args = list(args)

args[2] = SOURCE_ADDRESS

args = tuple(args)

in_args = True

if not in_args:

kwargs["source_address"] = SOURCE_ADDRESS

print "args", args

print "kwargs", str(kwargs)

return _default_create_socket(*args, **kwargs)

def urllib3_create_connection(*args, **kwargs):

in_args = False

if len(args) >=3:

args = list(args)

args[2] = SOURCE_ADDRESS

in_args = True

args = tuple(args)

if not in_args:

kwargs["source_address"] = SOURCE_ADDRESS

print "args", args

print "kwargs", str(kwargs)

return _urllib3_create_socket(*args, **kwargs)

socket.create_connection = default_create_connection

# 因?yàn)榕紶枙鰡栴}, 所以使用默認(rèn)的 socket.create_connection

# urllib3.connection.connection.create_connection = urllib3_create_connection

urllib3.connection.connection.create_connection = default_create_connection

print " *** test requests: " + req.get("http://ip.haschek.at").content

print " *** test urllib: " + urllib.urlopen("http://ip.haschek.at").read()

print " *** test urllib2: " + urllib2.urlopen("http://ip.haschek.at").read()

注意:使用 urllib3.utils.connection 好像不起作用

稍微再完善一下, 就是把根據(jù)網(wǎng)卡名自動(dòng)獲取 IP.

import subprocess

def get_all_net_devices():

sub = subprocess.Popen("ls /sys/class/net", shell=True, stdout=subprocess.PIPE)

sub.wait()

net_devices = sub.stdout.read().strip().splitlines()

# ['eth0', 'eth1', 'lo']

# 這里簡單過濾一下網(wǎng)卡名字, 根據(jù)需求改動(dòng)

net_devices = [i for i in net_devices if "ppp" in i]

return net_devices

ALL_DEVICES = get_all_net_devices()

def get_local_ip(device_name):

sub = subprocess.Popen("/sbin/ifconfig en0 | grep '%s ' | awk '{print $2}'" % device_name, shell=True, stdout=subprocess.PIPE)

sub.wait()

ip = sub.stdout.read().strip()

return ip

def random_local_ip():

return get_local_ip(random.choice(ALL_DEVICES))

# code ...

只需要把 args[2] = SOURCE_ADDRESS 和 kwargs["source_address"] = SOURCE_ADDRESS改成 random_local_ip() 或者 get_local_ip("eth0")

至于有什么用途, 就全憑想象了.

以上這篇Python 使用指定的網(wǎng)卡發(fā)送HTTP請求的實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

總結(jié)

以上是生活随笔為你收集整理的python 控制有线网卡_Python 使用指定的网卡发送HTTP请求的实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日日狠狠| 欧美影院一区二区三区 | 日韩av专区片 | 欧美黑人性猛交xxxx | 国产高清视频免费在线观看 | 伊人亚洲| 日韩黄色网络 | 亚洲熟妇无码久久精品 | 光溜溜视频素材大全美女 | 黄色裸体网站 | 伊人影院网 | 日韩激情一区二区三区 | 秘密基地电影免费版观看国语 | 玖玖精品视频 | 青青导航 | 伊人免费在线观看 | 国产精品无码av在线有声小说 | 晨勃顶到尿h1v1 | 大肉大捧一进一出好爽动态图 | 任你躁av一区二区三区 | 黄色片在线免费观看 | 免费美女视频网站 | 国产乱子视频 | 男女偷爱性视频刺激 | 口爆吞精一区二区三区 | 欧美成人精品一区 | 日韩高清一二三区 | 日本亚洲欧美 | 91天天 | 亚洲看片网 | 99久久久久无码国产精品 | cao在线视频| a级黄色小视频 | 欧美色图综合网 | 久久久黄色片 | 久久久在线免费观看 | 亚洲风情第一页 | 尤物影院在线观看 | 人妻熟女一区二区三区 | 宅男视频污 | 波多一区 | 各处沟厕大尺度偷拍女厕嘘嘘 | 日韩最新在线 | 成年人午夜免费视频 | 亚洲日本欧美在线 | 久久av资源 | 国产 欧美 精品 | 精品黑人一区二区三区观看时间 | 日本精品免费在线观看 | 色综合久久久 | 国产婷婷综合 | 国产精品ⅴa有声小说 | av在线看片 | 波多野结衣影片 | 中国a级大片 | 日韩色小说| 九九热最新视频 | 一级片免费观看视频 | 嫩草视频在线播放 | 伊人久久免费视频 | 色婷婷精品国产一区二区三区 | 欧美人妻精品一区二区免费看 | 波多野吉衣一区二区 | 午夜做爰xxxⅹ性高湖视频美国 | 日韩亚洲视频 | 日本中文字幕在线观看视频 | 欧美大浪妇猛交饥渴大叫 | 国产精品九一 | 色呦呦在线观看视频 | 成人三级电影网站 | 亚洲爱爱爱 | 亚洲精品无码永久在线观看 | 中文字幕一区二区三区在线不卡 | 欧美特级黄色片 | 制服丝袜成人动漫 | 午夜黄色 | 中文字幕免费在线视频 | 影音先锋毛片 | 日韩一页 | 嫩草嫩草嫩草嫩草嫩草嫩草 | 91av精品| 久久久成人免费视频 | 香蕉视频黄色片 | 亚洲精品一线二线三线 | 国产电影一区在线观看 | 成人软件在线观看 | 少妇特黄a一区二区三区88av | 国内性爱视频 | 蜜臂av| 欧美日韩一区在线观看 | 懂色av蜜臀av粉嫩av分享吧最新章节 | 六月色丁香 | 国产精品一区二区自拍 | 国产免费视频一区二区三区 | 殴美一级黄色片 | 国产性色av | 欧美sm凌虐视频网站 | 成人免费无码大片a毛片抽搐色欲 | 奇米影视在线观看 |