Python教程

python通过不同的网卡去做网络请求

本文主要是介绍python通过不同的网卡去做网络请求,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

python通过不同的网卡去做网络请求

为什么会有这种需求呢,很多的公司都会有内网和外网,而现在的电脑都会有双网卡,而电脑都会默认用你的以太网,现在刚好有这么一个场景,你写了一个程序要去做网络请求,而你的以太网又访问不到,刚好你可以用wlan网卡去做这个网络请求,那怎么办呢,现在就可以通过下面的办法,去选择你需要的网卡访问。

工具类

from netifaces import interfaces, ifaddresses, AF_INET, AF_INET6
import winreg
import platform

# 获取ipv4地址
def get_ipv4_address(key_name):
    if platform.system() == "Linux":
        try:
            return ifaddresses(key_name)[AF_INET][0]['addr']  # 返回ipv4地址信息
        except ValueError:
            return None
    elif platform.system() == "Windows":
        key = get_key(key_name)  # 获取网卡的键值
        if not key:
            return
        else:
            return ifaddresses(key)[AF_INET][0]['addr']  # 返回ipv4地址信息
    else:
        print('您的系统本程序暂时不支持')

# 获取ipv6地址
def get_ipv6_address(key_name):
    if platform.system() == "Linux":
        try:
            return ifaddresses(key_name)[AF_INET6][0]['addr']
        except ValueError:
            return None
    elif platform.system() == "Windows":
        key = get_key(key_name)
        if not key:
            return
        else:
            return ifaddresses(key)[AF_INET6][0]['addr']
    else:
        print('您的系统本程序暂时不支持')

# 获取Windows系统网卡接口在注册表的键值
def get_key(key_name):
    keys = interfaces()  # 获取所有网卡的键值
    key_name_dict = {}  # 存放网卡键值与键值名称的字典
    try:
        reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)  # 建立注册表链接
        reg_key = winreg.OpenKey(reg , r'SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}')
    except Exception as e:
        return '路径出错或者其他问题,请仔细检查'

    for key in keys:
        try:
            reg_subkey = winreg.OpenKey(reg_key , key + r'\Connection')  # 读取网卡键值的Name
            key_name_dict[winreg.QueryValueEx(reg_subkey , 'Name')[0]] = key  # 写入key_name字典
        except FileNotFoundError:
            pass
    # print('所有接口信息字典列表: ' + str(key_name_dict))
    return key_name_dict[key_name]

具体使用方法

import requests
from requests_toolbelt.adapters.source import SourceAddressAdapter

session = requests.Session()
# 使用以太网的网卡访问 
yitai_ip = get_ipv4_address('以太网')
session.mount('http://', SourceAddressAdapter(yitai_ip))
session.mount('https://', SourceAddressAdapter((yitai_ip, 8999)))
session.get(url="https://www.baidu.com")

# 使用wlan的网卡访问 
wlan_ip = get_ipv4_address('WLAN')
session.mount('http://', SourceAddressAdapter(wlan_ip))
session.mount('https://', SourceAddressAdapter((wlan_ip, 8999)))
session.get(url="https://www.baidu.com")

这篇关于python通过不同的网卡去做网络请求的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!