Forum >> Principianti >> Ottenere una parametro che varia quasi istantaneamente da url

Pagina: 1 2 Avanti

Buonasera a tutti, sono alle prime armi, qualcuno potrebbe spiegarmi come ottenere un parametro tramite richiesta web?
Vorrei creare delle statistiche su un parametro in particolare (cerchiato in rosso), allego un immagine per chiarire.

Questo parametro cambia dinamicamente, si trova nell home del sito (nell'allegato si vede) e facendo click su "dividends".

So che devo usare requests.get() , bs4.BeautifulSoup() e soup.findAll, ma non riesco ad ottenere quel parametro.

Qualcuno può aiutarmi?

Grazie
Allegati
Ciao, oltre a quanto hai già capito, ti posso suggerire di dare un'occhiata a Scrapy che è un ottimo prodotto per me?

Per il resto gli strumenti che indichi sono ottimi, devi fare delle prove seguendo le documentazione ufficiali e/o i mille esempi che troverai.

Cya
Ciao, ho già fatto qualche prova, diciamo che se il codice sorgete é un HTML unico riesco, questo mi sembra abbia delle nidificazioni. Potresti darmi qualche suggerimento?
Grazie
Ciao, ho già fatto qualche prova, diciamo che se il codice sorgete é un HTML unico riesco, questo mi sembra abbia delle nidificazioni. Potresti darmi qualche suggerimento?
Diciamo che non saprei cosa consigliarti, visto che non mostri il tuo codice. La cosa migliore è partire dal li e vedere dove non riesci, per darti un aiuto concreto.

NOTA: Ricordati di usare il tasto <code> quello che trovi vicino ai colori in fase di inserimento, per mantenere la corretta formattazione del codice.

Cya

Si scusami eccolo:
import bs4
import requests
 
def estrapola_sorgente(url):
    if 'https://' in url:
        sorgente = requests.get(url).text
        return(sorgente)
    else:
        return("L url non e valido")
    
def estrapola_h1(sorgente):
    soup = bs4.BeautifulSoup(sorgente,"html.parser")
    elenco = soup.findAll('h1')
    if elenco:
        for a in elenco:
            print(a)
    else:
        print("Non ci sono h1 in questa pagina")
 
lista_siti = [
    'https://tronbet.io/#/',
    'http://www.example.org',
    ]
 
for sito in lista_siti:
    sorgente = estrapola_sorgente(sito)
    print('Elenco degli h1 di ' + sito)
    estrapola_h1(sorgente)
    print()

Tramite ispeziona (ti allego l'immagine) trovo la variabile ma non riesco a capire come farla stampare, tiene presente che sono alle prime armi sia con html che python, di programmazione classica mi intendo ma questo è arabo per me :confused:

Grazie

Allegati
Ciao, girando il web e guardando un po' di tutorial ho capito che il dato che mi interessa è all'interno di un javascript code, pertanto ho creato questo codice che usa SCRAPY+SPLASH

import scrapy
from scrapy_splash import SplashRequest

class QuotesJSSpider(scrapy.Spider):
    name = 'quotesjs'

    def start_requests(self):
    	yield SplashRequest(
            #  url = 'http://quotes.toscrape.com/js',
            #  url = 'https://www.tronbet.io/static/js/main.53d1ebc2.js',
             url = 'https://www.tronbet.io/#/',
             callback = self.parse,
        )

    def parse(self, response):
al di sotto di "def parse" dovrei introdurre l'istruzione per estrarre quel parametro, dovrei usare "response.css" credo.

Potresti aiutarmi in quest'ultimo passaggio? quale istruzione dovrei scrivere? Ti allego l'immagine dell'ispezione del codice (in rosso il parametro che mi servirebbe).

Grazie.
Allegati
Questo weekend non sono nei pressi di un computer, ma quello che posso dirti è che devi contestualizzare il problema.

Per un umano è facile capire cosa leggere e prendere, mentre per uno stupido computer/programma/coso non lo è. Quindi devi trovare univocamente qualcosa che identifichi il dato che vuoi estrapolare, un tag certo che sei sicuro di intercettare sempre e comunque. A quel punto, a seconda della complessità di quanto sei riuscito a desumere dalla risorsa, dovrai agire di fino, a quanto vedo dal pezzettino di pagina web che proponi, e cercare (magari tramite una semplice funzione) di prendere solo il dato che ti interessa.

Certo, se il tutto fosse stato dentro un tag facilmente leggibile, il gioco sarebbe stato semplice, ma così non è (ovviamente), quindi devi usare vari strumenti per raggiungere il tuo obiettivo.

Fammi sapere come procede, ho fiducia in te. ;)
quindi sono ben lontano dalla soluzione? :O
Almeno sono sulla strada giusta? :question:

Gli esempi trovati in rete erano piuttosto semplici, questo sembra una scatola cinese XD
Aggiornamento XD
Ho deciso di partire da qualcosa di più semplice, ho provato ad estrarre del testo da siti come gazzetta.it o diretta.it (una partita a caso), da questi due riesco ad estrarre la porzione di testo, da quel maledetto sito NO.

Ad esempio l'istruzione data per gazzetta.it è la seguente.

for body in response.css("body"):
         yield{
              'RISULTATO': body.css("#home > section.footer > div.get-in-touch-container > \
               div > div.section-footer-get-in-touch-address > p > span.p-iva").extract_first(),
         }
Mi sono limitato ad ispezionare l'elemento testo, e copiare il "JS PATH" ed incollarlo dopo body.css, analoga cosa per diretta.it.

Allego il pdf con l'ispezione dei 3 siti.

Dall'ispezione, quello che mi salta all'occhio è che i 2 (che funzionano) presentano una struttura del tipo : elemento+class+testo, l'altro presenta invece: elemento+class+style+testo.

Potrebbe essere questa a ragione?

L'istruzione data per estrarre, e quindi il JS PATH del terzo (che non funziona) è:

for body in response.css("body"):
         yield{
               'RISULTATO': body.css("body > #root > section > section:nth-child(2) > \
                section:nth-child(4) > footer > div.tac").extract_first(),
          }


Cosa dovrei modificare?

Grazie
Allegati
Ciao Leon, come procede la tua avventura?

Ho riletto i messaggi e confermo le tue perplessità. Purtroppo nelle risorse web non sempre riesci correttamente a trovare il valore che cerchi, perché non è detto che questo sia contenuto esattamente in dei tag "amici" e che riuscirai facilmente ad ottenere. Il discorso con i JS è poi ancora più complesso, oltretutto la risorsa in questione vuole offuscure quel risultato, per renderti proprio difficile un'operazione di scraping. Se ho capito bene la tua domanda, la risposta è no, non devi effettuare lo scraping del file JS. Questo passaggio è inutile perché non conterrà il valore che invece sarà generato quando la pagina viene creata.


Se tu avessi un qualcosa delimitato, ad esempio, da <p class="qualcosa">dato_interessante</p>, sarebbe estremamente facile desumere dato_interessante, in maniera del tutto simile a quello che hai fatto tu. Ma non è così facile purtroppo nel tuo caso, perché di mezzo c'è la componente JS. Allora puoi effettuare un po' di prove e cercare di ottenere l'oggetto più vicino a quello che devi includere, ad esempio il l'<... id="ante_des" ...> potrebbe andare bene. All'interno di questo identificare quell'<h1> che vedo, così da isolare ancora di più il risultato ed a quel punto andare a ragionare sul dato che hai.

Facciamo un esempio concreto, con una delle tante strade che puoi seguire, non necessariamente LA strada. Se tu avessi un HTML "lineare", passami il termine improprio, faresti prestissimo a rintracciare il tuo contenuto:
>>> HTML = ''' 
   ... <span id="id_A">Hello, Palmux</span> 
   ... <span id="id_B">Hello, Leon</span> 
   ... '''                                                                     
>>> from scrapy.selector import Selector                                    
>>> selector = Selector(text=HTML)                                          
>>> selector.css('span#id_A::text').extract()                               
['Hello, Palmux']
>>> selector.css('span#id_B::text').extract()                               
['Hello, Leon']
Ora nel tuo caso non hai una cosa così elementare, ma seguendo quello che ti ho detto prima potresti comunque trovare una macro aggregazione e poi usare strumenti di fino per raggiungere il risultato.

Spero di essermi spiegato.

Cya



Pagina: 1 2 Avanti



Esegui il login per scrivere una risposta.