首页 > 解决方案 > 从 $.ajax 站点到 python3 服务器的 Cookie

问题描述

基本上我到处寻找答案(谷歌),我似乎找不到解决方案。基本上我正在做的是我有一个 python 服务器来抓取网站并将它们返回到 json 中的页面(取决于 url)。服务器从您输入要搜索的位置和要搜索的内容的站点获取 url。我想做的是在整个过程中添加 cookie,因为您可以登录某些网站以获得折扣。我想不通的是我应该如何将我的网站 cookie 发送到我的服务器。我正在使用简化的代码来测试/找出它是如何工作的。

网站网址: http://localhost/looking/test.html

服务器网址: http://localhost:8082

服务器请求示例: http://localhost:8082/?search=dell&shop=rlyniceshop

代码

<!doctype html>
<html lang="en">
<head>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
        <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
        <meta charset="UTF-8">
</head>

<body>
    <button type="button" class="btn btn-outline-success" data-where="ASWO">Prisijungti</button>

    <script>
        if (Cookies.get('user') == null) {
            var user = Date.now();
            Cookies.set('user', user);
            console.log(Cookies.get('user'));
        }

        $('.btn-outline-success').on('click', function(){
            var url = 'http://localhost:8082/?search=dell&shop=pls';
            $.ajax({
                url: url,
                method: "POST",
                cookie: "TestCookie2=AAA"
            });
        });
    </script>

</body>

蟒蛇代码

from http.server import BaseHTTPRequestHandler, HTTPServer
from bs4 import BeautifulSoup
from urllib.parse import urlparse, parse_qs
import urllib.request
import json
import os
import re
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
crm_path="PATH TO CHROME DRIVER"

class Object:
    def toJSON(self):
        return json.dumps(self, default=lambda o: o.__dict__, sort_keys=True)

class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
    self.send_response(200)
    self.send_header('Content-type','text/html; charset=utf-8')
    self.send_header('Access-Control-Allow-Origin', '*')
    self.end_headers()
    parsed = urlparse(self.path)
    wow = urllib.parse.parse_qs(parsed.query)
    luk = ''.join(wow['search'])
    wer = ''.join(wow['parde'])
    print(luk+wer);
    message = "COMPLEX JSON"
    self.wfile.write(bytes(message, "utf8"))
    return

def run():
  print('starting server...')
  server_address = ('127.0.0.1', 8082)
  httpd = HTTPServer(server_address, testHTTPServer_RequestHandler)
  print('running server...')
  httpd.serve_forever()

run()

如果您认为我对某些事情不清楚,请询问。

标签: javascriptjqueryjsonajaxpython-3.x

解决方案


是的,所以我自己想通了。这也很容易做到。估计睡不好赶上我了。我所做的是创建一个新的varcookie存储在其中并将其作为数据发送。像这样:

var dat = Cookies.get()

$('.btn-outline-success').on('click', function(){
    var url = 'http://localhost:8082/?search=dell&parde=pls';
    $.ajax({
        url: url,
        method: "POST",
        data: dat
    });
});

然后使用get_POST从我的站点获取它们,如下所示:

def do_POST(self):
    self.send_response(200)
    self.send_header('Content-type','text/html; charset=utf-8')
    self.send_header('Access-Control-Allow-Origin', 'http://localhost')
    self.end_headers()
    content_length = int(self.headers['Content-Length'])
    body = self.rfile.read(content_length)
    parsed_q = urlparse(self.path)
    parsed_b = urlparse(body.decode("utf-8"))
    search_info = urllib.parse.parse_qs(parsed_q.query)
    user_info = urllib.parse.parse_qs(parsed_b.path)
    #print(''.join(wow['search']));
    print(search_info);
    print(user_info);
    message = "Json code"
    self.wfile.write(bytes(message, "utf8"))
    return

这样我可以保留我的标题并发送一些额外的数据(content_length)。我将 do_GET保存python 代码中,只是为了将来我需要它

我当前的代码现在看起来像这样:

PYTHON:

from http.server import BaseHTTPRequestHandler, HTTPServer
from bs4 import BeautifulSoup
from urllib.parse import urlparse, parse_qs
import urllib.request
import json
import os
import re
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
crm_path="C:\\Users\\Duma\\Desktop\\site\\BrowersDriver\\chromedriver.exe"

class Object:
    def toJSON(self):
        return json.dumps(self, default=lambda o: o.__dict__, sort_keys=True)

class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        self.send_response(200)
        self.send_header('Content-type','text/html; charset=utf-8')
        self.send_header('Access-Control-Allow-Origin', 'http://localhost')
        self.end_headers()
        content_length = int(self.headers['Content-Length'])
        body = self.rfile.read(content_length)
        parsed_q = urlparse(self.path)
        parsed_b = urlparse(body.decode("utf-8"))
        search_info = urllib.parse.parse_qs(parsed_q.query)
        user_info = urllib.parse.parse_qs(parsed_b.path)
        #print(''.join(wow['search']));
        print(search_info);
        print(user_info);
        message = "Json code"
        self.wfile.write(bytes(message, "utf8"))
        return

    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type','text/html; charset=utf-8')
        self.send_header('Access-Control-Allow-Origin', '*')
        self.end_headers()
        message = "Nothing to see here."
        self.wfile.write(bytes(message, "utf8"))
        return

def run():
  print('starting server...')
  server_address = ('127.0.0.1', 8082)
  httpd = HTTPServer(server_address, testHTTPServer_RequestHandler)
  print('running server...')
  httpd.serve_forever()

run()

HTML:

<!doctype html>
<html lang="en">
    <head>
            <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
            <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
            <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
            <script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
            <meta charset="UTF-8">
    </head>

    <body>
        <button type="button" class="btn btn-outline-success" data-where="ASWO">Prisijungti</button>

        <script>
            if (Cookies.get('user') == null) {
                var user = Date.now();
                Cookies.set('user', user);
                console.log(Cookies.get('user'));
            }

            var dat = Cookies.get()

            $('.btn-outline-success').on('click', function(){
                var url = 'http://localhost:8082/?search=dell&parde=pls';
                $.ajax({
                    url: url,
                    method: "POST",
                    data: dat
                });
            });


        </script>

    </body>
</html>

我希望这对将来正在寻找类似东西的人有所帮助:)


推荐阅读