Home > database >  How to exctract data from JSON with scrapy?
How to exctract data from JSON with scrapy?

Time:10-12

I need to extract the validity data from a JSON, but it is at another level and I have not been able to access the data, I tried some things, but it does not work, this is the base code before testing.

import scrapy
import json
 
API_URL = "https://banco.santander.cl/beneficios/promociones.json?per_page=9999&tags=home&custom_fields=true&order_by=updated_at&desc=true&hash=721"

class BanSantanderSpider(scrapy.Spider):
    name = "bansantander"
    start_urls = [API_URL]
 
    # Custom Settings are needed to send the User Agent.         
    custom_settings = {
        'USER_AGENT' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
    }
 
    def parse(self, response):
        json_response = json.loads(response.text)
        datas = json_response["promociones"]
        for data in datas:
            yield {
                "title": data["title"],
                "description": data["description"],
                "summary": data["slug"],
                "discount": data["excerpt"],
                "discountURL": data["url"]
                }

CodePudding user response:

The below code is producing the neat and clean text node value as string from the description portion that's mix and match with html tags.

import scrapy
import json
from bs4 import BeautifulSoup
 
API_URL = "https://banco.santander.cl/beneficios/promociones.json?per_page=9999&tags=home&custom_fields=true&order_by=updated_at&desc=true&hash=721"

class BanSantanderSpider(scrapy.Spider):
    name = "bansantander"
    start_urls = [API_URL]
 
    # Custom Settings are needed to send the User Agent.         
    custom_settings = {
        'USER_AGENT' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
    }
 
    def parse(self, response):
        json_response = json.loads(response.text)
        datas = json_response["promociones"]
        for data in datas:
            yield {
                "title": data["title"],
                "description": BeautifulSoup(data["description"],'html.parser').get_text(strip=True),
                "summary": data["slug"],
                "discount": data["excerpt"],
                "discountURL":data["url"]
      

output:

{'title': 'Kitchen Center', 'description': 'Válido en Tiendas físicas Kitchen Center y en Kitchencenter.clExclusivo 
pagando con tu Tarjetas de Crédito Santander.CAE de 0,77%. Calculado por un monto referencial de compra de $1.000.000 en 24 cuotas. Costo total del Crédito: $1.007.920. Operación afecta a impuesto al crédito.Información que debes tener en cuenta:Las promociones de cuotas sin interés no siempre las verás reflejadas en el terminal de pago (POS) del comercio, ni en los comprobantes de la compra (voucher). Por eso, siempre que estés comprando bajo las condiciones 
indicadas en Santander. cl, tendrás el beneficio de cuotas sin interés y tu compra, para tu tranquilidad, quedará sin interés. Además, podrás revisarlas en el estado de cuenta de tu Tarjeta de Crédito con todo sus detalles.', 'summary': 'kitchen-center', 'discount': '', 'discountURL': 'https://banco.santander.cl/beneficios/hogar/promociones/kitchen-center'}
2022-10-12 08:51:52 [scrapy.core.scraper] DEBUG: Scraped from <200 https://banco.santander.cl/beneficios/promociones.json?per_page=9999&tags=home&custom_fields=true&order_by=updated_at&desc=true&hash=721>
{'title': 'Bosch', 'description': 'Descuento no aplica a compra de repuestos, accesorios ni productos de limpieza.Exclusivo pagando con tus Tarjetas SantanderVálido en Casa Bosch Vitacura (Av. Alonso de Córdova 4213), Casa Bosch Las Condes (Av. Las Condes 9765, local 115), Mall Las Condes Design o con atención personalizada desde casa, llamando al  56 2 289 93 555, anexos5620/5621/5626, vía teléfonoo whatsapp al  56 9 4090 7399 o al  56 9 5407 6155 y escribiendo al e-mail casabosch.vitacura@bosch-home .com. Días sábados no presencial, de 10 a 14 hrs, vía telefónica y mail.Direcciones:Av. Alonso de Córdova 4213.Av. Las Condes 9765, local 115.CAE de 1,47%. Calculado por un monto referencial de compra de $1.000.000 en 12 cuotas. Costo total del Crédito: $1.007.962. Operación afecta a impuesto al crédito.Información que debes tener en cuenta:Las promociones de cuotas sin interés no siempre las verás reflejadas en el terminal de pago (POS) del comercio, ni en los comprobantes de la compra (voucher). Por eso, siempre que estés comprando bajo las condiciones indicadas en Santander. cl, tendrás el beneficio de cuotas sin interés y tu compra, para tu 
tranquilidad, quedará sin interés. Además, podrás revisarlas en el estado de cuenta de tu Tarjeta de Crédito con todo sus detalles.', 'summary': 'bosch', 'discount': '', 'discountURL': 'https://banco.santander.cl/beneficios/hogar/promociones/bosch'}
2022-10-12 08:51:52 [scrapy.core.scraper] DEBUG: Scraped from <200 https://banco.santander.cl/beneficios/promociones.json?per_page=9999&tags=home&custom_fields=true&order_by=updated_at&desc=true&hash=721>
{'title': 'Defontana ', 'description': 'Gestiona todos los procesos de tu empresa con Defontana ERPUsa tu tarjeta de crédito Santander y paga en cuotas el plan que necesites para que optimices tus procesos reduciendo costos y aumentando tu productividad.Exclusivo pagando con tu Tarjeta de Crédito Santander.CAE 0,77%. CAE calculado en base a una compra de $1.000.000 en 24 cuotas mensuales. Monto total a pagar de $1.007.920.', 'summary': 'defontana-empresas', 'discount': '', 'discountURL': 'https://banco.santander.cl/beneficios/empresas/promociones/defontana-empresas'}       
2022-10-12 08:51:52 [scrapy.core.engine] INFO: Closing spider (finished)
2022-10-12 08:51:52 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 404,
 'downloader/request_count': 1,
 'downloader/request_method_count/GET': 1,
 'downloader/response_bytes': 72110,
 'downloader/response_count': 1,
 'downloader/response_status_count/200': 1,
 'elapsed_time_seconds': 2.512249,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2022, 10, 12, 2, 51, 52, 101632),
 'httpcompression/response_bytes': 469529,
 'httpcompression/response_count': 1,
 'item_scraped_count': 145,
 

... so on

CodePudding user response:

You can use the response.json() convenience function to convert the response to a json object which you can then iterate through to extract the data you need. See sample usage below. I have added the use of Items to clean up the outputted data.

import scrapy
from scrapy.loader import ItemLoader
from dataclasses import dataclass, field
from typing import Optional
from itemloaders.processors import TakeFirst

@dataclass
class BanSantanderItem:
    title: Optional[str] = field(default=None)
    description: Optional[str] = field(default=None)
    summary: Optional[str] = field(default=None)
    discount: Optional[str] = field(default=None)
    discountURL: Optional[str] = field(default=None)


class BanSantanderSpider(scrapy.Spider):
    name = 'bansantander'
    allowed_domains = ['banco.santander.cl']
    start_urls = ['https://banco.santander.cl/beneficios/promociones.json?per_page=9999&tags=home&custom_fields=true&order_by=updated_at&desc=true&hash=721']

    custom_settings = {
        'USER_AGENT' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
    }

    def parse(self, response):
        for entry in response.json().get('promociones'):
            loader = ItemLoader(item=BanSantanderItem(), selector=entry)
            loader.default_output_processor = TakeFirst()
            loader.add_value("title", entry.get('title'))
            loader.add_value("description", entry.get("description"))
            loader.add_value("summary", entry.get("slug"))
            loader.add_value("discount", entry.get("discount"))
            loader.add_value("discountURL", entry.get("url"))

            yield loader.load_item()
  • Related