Cómo generar Python XHR Solicitud en peticiones.post()

Estoy tratando de obtener información de un sitio web usando AJAX. El Sitio web mostrando diferente tamaño para el perfume y básicamente, el precio cambiaría al seleccionar diferente tamaño. He comprobado cromo Network Tab y he encontrado que es una solicitud XHR, pero mirando el cabezal de solicitud no tengo idea de cómo generar los mismos encabezados y datos con el paquete de peticiones.

Así es como mi código se ve actualmente:

import requests    
url = "https://www.beautyfresh.com/uc_aac"
session = requests.Session()
data = {"attributes[Size]":"100ml"} # I want to get the price for 100ml
headers = {"Referer": "https://www.beautyfresh.com/product/fragrance/men/perfume-fragrance/women/perfume-men/fragrance/perfume/jo-malone-orange-blossom-cologne",}
r = session.post(url,headers=headers,data=data)
print(r.text)

El General información bajo Chrome Network pestaña es

Request URL: https://www.beautyfresh.com/uc_aac
Request Method: POST
Status Code: 200 OK
Remote Address: 103.255.250.100:443
Referrer Policy: no-referrer-when-downgrade

El Headers Response es

HTTP/1.1 200 OK
date: Fri, 18 Dec 2020 02:01:05 GMT
expires: Sun, 19 Nov 1978 05:00:00 GMT
x-site: beautyfresh
x-url: /uc_aac
last-modified: Fri, 18 Dec 2020 02:01:05 GMT
x-backend-server: web4
content-type: application/json
x-varnish: 700512226
age: 0
via: 1.1 varnish (Varnish/6.0)
x-cache: MISS
cache-control: Cache-Control: store, no-cache, must-revalidate
accept-ranges: bytes
content-length: 2193

El Solicitud de encabezados es

POST /uc_aac HTTP/1.1
Host: www.beautyfresh.com
Connection: keep-alive
Content-Length: 164
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Origin: https://www.beautyfresh.com
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://www.beautyfresh.com/product/fragrance/men/perfume-fragrance/women/perfume-men/fragrance/perfume/jo-malone-orange-blossom-cologne
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: has_js=1; SESSc5f2026dce40de323b60d32130e6ce0b=n7tr5e2fsragf1js6garc6u06n; _ga=GA1.2.959938064.1608216963; _gid=GA1.2.1979056032.1608216963; _v1EmaticSolutionsUTMData=%7B%22utm_source%22%3A%22%22%2C%22utm_medium%22%3A%22%22%2C%22utm_campaign%22%3A%22%22%7D; _fbp=fb.1.1608216963288.1600789170; _v1EmaticSolutionsBye=%7B%2228732%22%3A%7B%2230038%22%3A%7B%22dont_show_till%22%3A%222020-12-20%22%2C%22loop%22%3A1%7D%7D%2C%2228739%22%3A%7B%2230045%22%3A%7B%22dont_show_till%22%3A%222020-12-20%22%2C%22loop%22%3A1%7D%7D%7D; _v1EmaticSolutionsEI=%7B%22c_28739_1%22%3A%5B1%2C1608216997180%2C33181%5D%2C%22c_28732_2%22%3A%5B1%2C1608216969616%2C0%5D%7D; _v1EmaticSolutions=%5B%22fc5d18b3-4077-11eb-970e-0242ac160003%22%2C1608217230870%2C%5B%22IMG%22%2C%22%22%2C1%2C%22glasshouse_fragrances_amalfi_coast_sea_candle_350gr.jpg%22%5D%5D; __atuvc=8%7C51; __atuvs=5fdc0d5961186ea4000; _gat=1; _dc_gtm_UA-63339192-1=1

Y Datos del formulario muestra:

attributes%5BSize%5D=100ml&nid=2905&qty=1&form_build_id=form-991e88780c30fdf883375a36a986b550&form_id=uc_product_add_to_cart_form_2905&product-nid=2905&aac_nid=2905

En realidad no sé cómo construir mi solicitud para que pueda publicarse con éxito en el servidor la respuesta adecuada. Debería devolver el precio por "100ml", pero actualmente mi código no consigue nada.

¡Muchas gracias por cualquier ayuda!

Pregunta hecha hace 3 años, 4 meses, 28 días - Por syntaxsorcerer


3 Respuestas:

  • Te estás perdiendo información en tu data. Para recibir una respuesta, trate de agregar "aac_nid": "2905" a su data cuando envía el post solicitud:

    import requests
    
    
    headers = {
        "Referer": "https://www.beautyfresh.com/product/fragrance/men/perfume-fragrance/women/perfume-men/fragrance/perfume/jo-malone-orange-blossom-cologne",
    }
    
    data = {"attributes[Size]": "30ml", "aac_nid": "2905"}
    
    response = requests.post(
        "https://www.beautyfresh.com/uc_aac", headers=headers, data=data
    )
    

    >>> print(response.content)
    b'{"nid":"2905","model":"690251006564","replacements":{"sellprice":"
    City Price:
    S$110.00<\\/span><\\/div><\\/div>\\r\\n
    Our Price:
    S$89.00<\\/span><\\/div><\\/div><\\/div>","model":"
    Product Code: <\\/span>690251006564<\\/div>"},"form":"
    \\n
    \\n

    Para obtener el precio, trate de buscarlo con la ayuda de la re (regex) módulo:

    import re
    
    prices = re.findall(r"'uc-price\\'>S(\$\d.*?)<", str(response.content))
    
    print("Original Price:", prices[0])
    print("Our Price:", prices[1])
    

    Producto:

    Original Price: $110.00
    Our Price: $89.00
    

    Respondida el Dec 18, 2020 a las 04:08 - por syntaxsensei

    Votos positivos: 0 | Votos negativos: 0

  • Para generar una solicitud XHR en Python con el paquete requests, necesitas ajustar algunos detalles en tu código. Aquí te muestro cómo puedes hacerlo:

    • Asegúrate de incluir el encabezado "X-Requested-With: XMLHttpRequest" en tus encabezados de solicitud.
    • Codifica los datos del formulario como una cadena `application/x-www-form-urlencoded` y envíalos en el cuerpo de la solicitud.

    Aquí hay un ejemplo modificado de tu código:

    python
    import requests
    
    url = "https://www.beautyfresh.com/uc_aac"
    session = requests.Session()
    headers = {
        "Referer": "https://www.beautyfresh.com/product/fragrance/men/perfume-fragrance/women/perfume-men/fragrance/perfume/jo-malone-orange-blossom-cologne",
        "X-Requested-With": "XMLHttpRequest"
    }
    data = {
        "attributes[Size]": "100ml",
        "nid": "2905",
        "qty": "1",
        "form_build_id": "form-991e88780c30fdf883375a36a986b550",
        "form_id": "uc_product_add_to_cart_form_2905",
        "product-nid": "2905",
        "aac_nid": "2905"
    }
    
    r = session.post(url, headers=headers, data=data)
    print(r.text)
    

    En este código, he agregado los datos adicionales requeridos en el formulario y codificado todos los datos en el formato adecuado. Al enviar esta solicitud, deberías poder obtener la respuesta correcta del servidor que incluye el precio para "100ml".

    Espero que esta información te sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 19, 2020 a las 04:08 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para generar una solicitud XHR en Python usando el paquete requests, puedes seguir estos pasos:

    • Crear una sesión: Crea una sesión `requests.Session()` para mantener las cookies y otros datos de estado entre las solicitudes.
    • Establecer encabezados: Define un diccionario con los encabezados de solicitud necesarios, como `Referer`, `X-Requested-With` y `Content-Type`.
    • Crear datos de formulario: Crea un diccionario con los datos del formulario necesarios, como `attributes[Size]`, `nid`, `qty`, etc.
    • Enviar la solicitud POST: Utiliza el método `post()` de la sesión para enviar la solicitud POST con los encabezados y datos de formulario establecidos.
    • Procesar la respuesta: Obtén el texto de respuesta de la solicitud utilizando el atributo `text`.

    Aquí tienes un código Python actualizado que debería ayudarte a obtener el precio para el tamaño "100 ml" del perfume:

    python
    import requests
    
    

    Crea una sesión

    session = requests.Session()

    Establece encabezados

    headers = { "Referer": "https://www.beautyfresh.com/product/fragrance/men/perfume-fragrance/women/perfume-men/fragrance/perfume/jo-malone-orange-blossom-cologne", "X-Requested-With": "XMLHttpRequest", "Content-Type": "application/x-www-form-urlencoded", }

    Crea datos de formulario

    data = { "attributes[Size]": "100ml", "nid": "2905", "qty": "1",

    Este formulario se toma de la pestaña "Datos del formulario" en la pestaña "Red" de Chrome

    "form_build_id": "form-991e88780c30fdf883375a36a986b550", "form_id": "uc_product_add_to_cart_form_2905", "product-nid": "2905", "aac_nid": "2905", }

    Envía la solicitud POST

    r = session.post("https://www.beautyfresh.com/uc_aac", headers=headers, data=data)

    Procesa la respuesta

    precio = r.json()["price"]

    Suponiendo que el precio está en un campo "precio" en la respuesta JSON

    print(precio)

    Este código debería generar una solicitud XHR POST válida al servidor y obtener el precio para el tamaño "100 ml" del perfume.

    Respondida el Dec 19, 2020 a las 04:18 - por Gemini

    Votos positivos: 0 | Votos negativos: 0