मैं इस पेज को स्क्रैप करने की कोशिश कर रहा हूं: https:/ /www.checkers.co.za/c-2256/All-Departments?q=%3Anovelty&page=0 लेकिन रियायती मूल्य प्राप्त करने में असमर्थ।

उदाहरण उत्पाद:

Product example

HTML <span class="now"> के अंतर्गत R17.59 की कीमत दिखाता है लेकिन अनुरोध <span class="now">\n R21<sup>.99</sup>\n </span>\n दिखाते हैं

1
Jak 19 मार्च 2020, 12:44

1 उत्तर

सबसे बढ़िया उत्तर

मुख्य यूआरएल केवल उत्पाद आईडी, नाम और प्रारंभिक मूल्य देता है। छूट और अन्य उत्पाद संदेश प्राप्त करने के लिए आप उत्पादों की सूची के साथ POST https://www.checkers.co.za/populateProductsWithHeavyttributes को फॉर्म डेटा के रूप में कॉल करते हैं। पूर्व अनुरोधों के लिए मुख्य पृष्ठ पर input में स्थित csrf टोकन के मान के साथ csrftoken नाम के शीर्षलेख की आवश्यकता होती है

साथ ही उत्पादों के नाम को व्यक्तिगत रूप से पुनः प्राप्त करने की आवश्यकता है।

import requests
from bs4 import BeautifulSoup
import json
import html

url = "https://www.checkers.co.za/c-2256/All-Departments"
urlAttributes = "https://www.checkers.co.za/populateProductsWithHeavyAttributes"

session = requests.Session()

r = session.get(url, params = { "q": ":novelty", "page": "0"})

soup = BeautifulSoup(r.text, "html.parser")

csrf = soup.find("input", { "name": "CSRFToken"})["value"]
products = json.loads(soup.find("div", { "id": "productListJSON"}).text)

nameDict = {}
for i in soup.findAll("div", {"class":"product-frame"}):
    t = json.loads(i["data-product-ga"])
    nameDict[t["id"]] = t["name"]

r = session.post(urlAttributes, json = products, headers= { "csrftoken": csrf })

productsAttr = json.loads(r.text)

for i in productsAttr:
    htmlData = html.unescape(i["information"][0]["htmlBBs"])
    soup = BeautifulSoup(htmlData, "html.parser")
    print({
        "product": i["product"],
        "name": nameDict[i["product"]],
        "priceInfo": i["information"][0]["price"],
        "priceBefore": soup.find("span", {"class":"before"}).text.strip() if soup.find("span", {"class":"before"}) else None,
        "priceAfter": soup.find("span", {"class":"now"}).text.strip(),
        "discount": soup.find("span", {"class":"special-price__extra__title"}).text.strip() if soup.find("span", {"class":"special-price__extra__title"}) else None,
        "productMessage": soup.find("span", {"class":"item-product__message__text"}).text.strip() if soup.find("span", {"class":"item-product__message__text"}) else None
    })

ध्यान दें कि दूसरे अनुरोध (छूट की जानकारी प्राप्त करने के लिए) को कुकीज़ की आवश्यकता है, इसलिए हमें requests.Session() का उपयोग करने की आवश्यकता है

2
Bertrand Martel 19 मार्च 2020, 11:56