Python实现请求代理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python实现请求代理相关的知识,希望对你有一定的参考价值。

前端开发调试的时候,通常是localhost,而接口不在本机,会有跨域问题。通过http.server 实现的请求代理,解决了跨域问题并且实现登录。

class MyRequestHandler(SimpleHTTPRequestHandler):

    def addHeader(self):
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Access-Control-Allow-Headers", "*")
        self.send_header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
        self.send_header("Content-type", "text/html")

    def do_GET(self):
        print(Get请求:+self.path)
        rep_get = requests.get(serverurl + self.path, cookies=cookie_jar)
        if rep_get.status_code == 200:
            self.send_response(200)
            self.addHeader()
            self.end_headers()
            self.wfile.write(rep_get.text.encode("utf-8"))
        else:
            self.Login()
            rep_get = requests.get(serverurl + self.path, cookies=cookie_jar)
            self.send_response(200)
            self.addHeader()
            self.end_headers()
            self.wfile.write(rep_get.text.encode("utf-8"))

    def do_POST(self):
        print(Post请求:+self.path)
        request_contentType = str(self.headers["Content-Type"])
        if request_contentType.find(application/x-www-form-urlencoded)>-1:
            data = str(self.rfile.read(int(self.headers["content-length"])),UTF-8)

            #data = str(self.rfile.readlines(), ‘UTF-8‘)  # 先解码
            p1 = urllib.parse.parse_qs(urllib.parse.unquote(data))  # 解释参数
            rel_par={}
            for it in p1:
                rel_par[it]=p1[it][0]

            rep_post = requests.post(serverurl + self.path, cookies=cookie_jar,data=rel_par)
            if rep_post.status_code==200:

                self.send_response(200)
                self.addHeader()
                self.end_headers()
                self.wfile.write(rep_post.text.encode("utf-8"))
            else:
                self.Login()
                rep_post = requests.post(serverurl + self.path, cookies=cookie_jar, data=rel_par)
                self.send_response(200)
                self.addHeader()
                self.end_headers()
                self.wfile.write(rep_post.text.encode("utf-8"))

        else:
            req = {"success": "false", "message": "暂时只支持Content-Type=application/x-www-form-urlencoded"}
            self.send_response(200)
            self.addHeader()
            self.end_headers()
            rspstr = json.dumps(req)
            self.wfile.write(rspstr.encode("utf-8"))

    def Login(self):
        isLogin =True
        req_login1 = requests.post(serverurl + /SUP/Login/WebLogin,data={
            ocode: ‘‘,
            UserID: user,
            UserPwd: pwd,
            DataBase: ucode,
            Language: "zh-CN",
            verifyCode: ""
        })
        if req_login1.status_code == 200:
            if req_login1.text.find(success: true) > 0:
                globals()[cookie_jar]=req_login1.cookies
            else:
                i1 = req_login1.text.find(msg)
                km = json.loads(req_login1.text[i1 + 5:-2])
                if km != None:
                    print(开始踢人)
                    req_kill = requests.post(serverurl + /SUP/Login/KillOnlineUser, data={
                        IpAddress: km[IpAddress],
                        Devicetype: km[Devicetype],
                        UserId: km[UserId],
                        SessionID: km[SessionID]
                    })
                    if req_kill.status_code == 200:
                        print(踢人成功,重新登录)
                        req_login2 = requests.post(serverurl + /SUP/Login/WebLogin, data={
                            ocode: ‘‘,
                            UserID: user,
                            UserPwd: pwd,
                            DataBase: ucode,
                            Language: "zh-CN",
                            verifyCode: "",
                            IsOnlineCheck: 1
                        })
                        if req_login2.status_code == 200:
                            globals()[cookie_jar] = req_login2.cookies
                        else:
                            isLogin = False
                            print(踢人以后登录返回错误,请检查服务器是否可访问)
                    else:
                        isLogin = False
                        print(踢人接口错误,请检查服务器是否可访问)
                else:
                    isLogin = False
                    print(登录返回错误,请检查服务器是否可访问)
        else:
            isLogin = False
            print(服务器登录返回错误,请检查服务器是否可访问)
        return isLogin

使用:

try:
    config = configparser.ConfigParser()
    isread = config.read(ngproxy.ini)
    if len(isread) == 0:
        serverurl = input("请输入服务器url: ")
        ucode = input("请输入服务器账套: ")
        user = input("请输入服务器用户: ")
        pwd = input("请输入服务器密码: ")
        port = input("请输入代理端口: ")

        config.add_section(userinfo)
        config.set(userinfo, serverurl, serverurl)
        config.set(userinfo, username, user)
        config.set(userinfo, password, pwd)
        config.set(userinfo, ucode, ucode)
        config.set(userinfo, port, port)
        f = open(ngproxy.ini, "w")
        config.write(f)  # 写进文件
        f.close()
    else:
        serverurl = config[userinfo][serverurl]
        user = config[userinfo][username]
        pwd = config[userinfo][password]
        ucode = config[userinfo][ucode]
        port = config[userinfo][port]
    bytes_user=user.encode()
    user = str(base64.b64encode(bytes_user), utf-8)

    bytes_pwd = pwd.encode()
    pwd = base64.b64encode(bytes_pwd)
    pwd = str(pwd, utf-8)

    cookie_jar = RequestsCookieJar()

    server = HTTPServer(("", int(port)), MyRequestHandler)
    print("代理服务器启动成功, serving at http://localhost:" + port)
    server.serve_forever()

 

以上是关于Python实现请求代理的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

Python实现请求代理

Android主流视频播放及缓存实现原理调研

即使 curl 工作,带有代理 407 状态代码的 Python 请求

python 爬虫 ip池怎么做

Python_01_IP代理池_实现代理池的校验模块