Topic: Web scraping, database e pagina web  (Letto 104 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Dcautomation

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Web scraping, database e pagina web
« il: Maggio 20, 2019, 09:34 »
Salve a tutti,

Premetto che sono un neofita della programmazione python,  quindi scusate eventualmente errori nel post.

Ho in mente un progetto che comprende 3 fasi diverse comunicanti tra di loro.

Vorrei che dalla pagina web che creerò (vorrei farla con Django) ci sia un barra di ricerca con dei filtri per cercare all'interno di un database (suggerimenti su quale usare con python sono super apprezzati) tutte le corrispondenze simili digitate nella ricerca e mostrarmele in ordine di pertinenza e disponibilità.
Il database dal quale prendere tali informazioni vorrei riempirlo e tenerlo aggiornato tramite il webscraping di alcune pagine rilevanti al progetto.

Avete qualche suggerimento che un neofita dovrebbe considerare?

Quale libreria o database sono più facilmente comprensibili?

Grazie per eventuali suggerimenti.  :caffè:

Offline bebo

  • python erectus
  • ***
  • Post: 211
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Web scraping, database e pagina web
« Risposta #1 il: Maggio 20, 2019, 14:01 »
Ciao, benvenuto!
Se vuoi fare un sito "non-dinamico, ossia dove cerchi qualcosa e poi vieni "spostato" in una nuova pagina (tipo barra di google iniziale, dove una volta scritto vieni mandato in una diversa pagina di risultati), allora quello riesci a farlo con django e un qualunque database (personalmente consiglio postgres).
Se invece vuoi fare una ricerca "dinamica", dove cerchi qualcosa e la ricerca viene popolata nella stessa pagina (ad es. siti dove non c'e' un nuovo caricamento di pagina, forse twitter mi pare che e' uno di questi), allora quello e' AJAX (no, non e' una parolaccia); ossia c'e' del Javascript da qualche parte.

Se non hai bisogni particolari, evita di inserire anche JS nell'equazione, e' una rottura in meno: quindi io andrei di django liscio.

Io inizierei con una bella analisi di cosa devi mettere nel DB. Non so se e' il caso di fare due schemi separati, oppure cercare di salvare anche le parti di scraping direttamente nello schema/database di django. La seconda soluzione faciliterebbe un sacco la scrittura del sito, ma rischi che con un aggiornamento di django si spacchi tutto (e quindi restare con versioni vecchie magari).
Quindi forse farei due schemi/database separati, uno per il backend del sito, e uno contenente i dati che vuoi esporre al sito, e poi quando l'utente ti chiede dei dati, vai a leggerli nel database separato.

PS: se vorrai configurare seriamente un server, ho creato una formula saltstack per automatizzare la gestione, con un esempio che configura Nginx+Postgres+Django+Gunicorn+Let's Encrypt.
https://github.com/bebosudo/django-formula
« Ultima modifica: Maggio 20, 2019, 14:06 da bebo »

Offline Dcautomation

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:Web scraping, database e pagina web
« Risposta #2 il: Maggio 20, 2019, 17:10 »
Ciao bebo e grazie per le dritte.

Vorrei evitare di usare ajax( so che non è una parolaccia, ma quando ho avuto a che fare con ajax me ne ha fatte uscire tante  :quiet:).

Vorrei che le ricerche venissero mostrate nella stessa pagina dove si effettua la ricerca.(mia pagina web)

Le pagine dove dovrei fare scraping sono i principali siti di componenti per automazione industriale( plc, motori, relè ecc..).

Cercherò di capire come gestire i due database, avevo usato con discreto successo mysql, ma avevo creato il tutto per un blog con WordPress, forse non é ideale per python?

Offline bebo

  • python erectus
  • ***
  • Post: 211
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Web scraping, database e pagina web
« Risposta #3 il: Maggio 20, 2019, 17:52 »
Citazione
- Vorrei evitare di usare ajax
- Vorrei che le ricerche venissero mostrate nella stessa pagina dove si effettua la ricerca

Devi scegliere una delle due. Se vuoi avere la ricerca nella stessa pagina, devi smazzarti un bel po' di js (checche' ne dicano i vari framework js che promettono faville, appena sono andato una riga fuori dal seminato, sono stati dolori) ed in piu' devi mettere in piedi anche un endpoint rest, e gestire anche quello (e a quel punto forse ti conviene fare tutto in REST ed ignorare la parte di "frontend" di django).
Tieni conto che nessun grosso ecommerce (amazon, ebay) renderizza nella stessa pagina: considera che html e' uno standard, js ha uno standard implementato in modi diversi in tutti i browsers ("standards" related: https://xkcd.com/927/): certo, puoi dirmi che esistono soluzioni per cross-compilare typescript in js verso tutti i js di tutti i browser, ma ne vale davvero la pena per questo progetto? Sempre che tu non voglia farlo per imparare a giocare con il frontend, ovviamente.

Citazione
avevo usato con discreto successo mysql .. per un blog con WordPress, forse non é ideale per python?
No, perche' mai? Cosa centra WP (che e' un framework/cms in PHP) con il linguaggio Python? ci sono pacchetti python per parlare praticamente con tutto, quindi pure mysql.
Quello a cui mi riferivo e' il fatto che mysql (ah, stiamo parlando del fork open source mariadb o della CE di mysql di oracle?) ha un po' di problemi in generale (niente di visibile con un hello world, sia chiaro). Postgres invece ha molte feature interessanti, e soprattutto mette l'integrita' dei dati come principio cardine.

https://stackoverflow.com/questions/9540154/which-database-engine-to-choose-for-django-app
E poi googla "mysql vs postgres".
« Ultima modifica: Maggio 20, 2019, 17:54 da bebo »

Offline Dcautomation

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:Web scraping, database e pagina web
« Risposta #4 il: Maggio 20, 2019, 18:46 »
Bé se devo scegliere allora farò a meno di ajax, pensavo solo alla comodità ed estetica per utente/cliente.

Avrei voluto fare una cosetta simile a questa ( https://octopart.com).

Ma essendo  il progetto un tools per professionisti, dove il tempo é sempre stretto, estetica del sito ( almeno inizialmente), conta veramente poco.


Ho usato mysql (oracle), ho pensato subito a quello perché é l'unico che abbia mai usato, ma avendo googlato quanto suggerito da te, opterò per la soluzione open-source.



Offline bebo

  • python erectus
  • ***
  • Post: 211
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Web scraping, database e pagina web
« Risposta #5 il: Maggio 20, 2019, 23:29 »
Citazione
Bé se devo scegliere allora farò a meno di ajax, pensavo solo alla comodità ed estetica per utente/cliente.
Non penso che l'utente finale/cliente possa "apprezzare" la differenza tra un popolamento dinamico in ajax oppure classico.

Citazione
Ma essendo  il progetto un tools per professionisti, dove il tempo é sempre stretto, estetica del sito ( almeno inizialmente), conta veramente poco.
Vedi il primo punto sopra: non penso che l'utente sappia percepire questa differenza.

E l'estetica la fai con una pennellata di css.
PS: se ti piace bootstrap come framework css+js, dai un occhio a bulma, che e' simile ma solo css, niente js. Sono un paio di dipendenze in meno, che significa del lavoro in piu' per fare quei 2 effetti magici di animazione, ma eviti di aggiungere almeno 2 librerie js obbligatorie, il js di bootstrap e jquery (less is more).

Citazione
Avrei voluto fare una cosetta simile a questa ( https://octopart.com).
Beh, ma neanche questo portale popola i risultati in ajax.
Se scrivo 'esp82' lui cerca di completarmelo (con una semplice funzione di autocompletamento), ma quando ho scelto quello che mi serve, vengo mandato in una nuova pagina: es. https://octopart.com/search?q=esp8266
La differenza con un sito che fa popolamento in ajax la vedi aprendo la console (F12 su FF), e guardando le richieste in arrivo. Se prendi ad es twitter e provi a fare una ricerca nella barra, vedi che la console viene continuamente "bombardata" di richieste: viene cambiato l'url della pagina (sempre in js) per consistenza con il contenuto, ma non viene ricaricata una nuova pagina. Se prendi invece un qualche altro sito (google, amazon, ebay), la pagina viene ricaricata ad ogni click su un link.

Mi viene il dubbio che stiamo parlando di due cose diverse forse: te intendi l'autocompletamento in una barra di ricerca, cosa che fanno tutti (google, amazon, ebay, twitter, etc). Corretto? Perche' in tal caso e' abbastanza facile, vedi ad es. https://www.w3schools.com/howto/howto_js_autocomplete.asp, solo che anziche' caricare la lista in cui cercare in un array definito a mano, la riempi durante il caricamento della pagina, scaricandola da un endpoint "rustico" fatto a mano, fine.


Citazione
Ho usato mysql (oracle), ho pensato subito a quello perché é l'unico che abbia mai usato, ma avendo googlato quanto suggerito da te, opterò per la soluzione open-source.
Occhio, non ho detto che Mysql e' closed, ma che Oracle ne fornisce una sua versione "Community Edition" limitata, sotto licenza GPL: quindi e' open anche quella. Il "problema" e' che se un domani oracle chiude i rubinetti, quel Mysql che fine fa?
Per questo, il giorno che l'azienda originale Mysql fu comprata da Sun, gli sviluppatori storici di mysql hanno creato il fork MariaDB: https://en.wikipedia.org/wiki/MariaDB
Quindi vedi te insomma, sono praticamente uguali e compatibili, uno pero' ha i genitori ricchi.

Offline Dcautomation

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:Web scraping, database e pagina web
« Risposta #6 il: Maggio 21, 2019, 09:32 »
Ok, sto arrivando a capire sempre di più, se nel sito esempio non si fa uso di ajax cercherò di farlo simile.

Scusa, probabilmente mi sono spiegato male, non mi riferivo all'autocompletamento (che ho deciso comunque di usare  ;)), ma voglio che il risultato della ricerca non mi si apra in una nuova finestra o scheda del browser.

Ricapitolando:

-Django
- Postgres

Ora volendo abbinare una libreria per il webscraping, fra le varie opzioni: Request, scrapy, bs4, lxml, selenium ecc.. Tra una queste, quali sono più raccomandabili? O è solo una questione di usabilità a discrezione del programmatore? Sarei indeciso tra scrapy e bs4.





Offline bebo

  • python erectus
  • ***
  • Post: 211
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Web scraping, database e pagina web
« Risposta #7 il: Maggio 21, 2019, 12:50 »
Citazione
voglio che il risultato della ricerca non mi si apra in una nuova finestra o scheda del browser
Ma no, quello succede solo se specifichi target="_blank" nel campo form. Ti basta non mettere quel target e il tuo sito carichera' il form nella stessa scheda del browser, come fanno amazon, ebay, google.


Per lo scraping, io ho usato solo bs4 ed e' comodissimo, scrapy non lo conosco. lxml non so se si possa usare direttamente per lo scraping di html (html =/= xml), ma so che e' uno dei possibili engine utilizzabili con bs4. selenium si usa solitamente quando devi automatizzare operazioni su un vero browser (ad es se il sito da manipolare usa js in alcuni spazi importanti).
Quindi consiglierei bs4 + selenium se ce n'e' bisogno.

Ricorda anche che se al sito che frughi non piace che gli fai scraping, il tuo ip potrebbe venire bannato. Considera di fare "caching" delle pagine, o di scaricare i siti interi da una vm esterna (se fai un buon design del tuo scraper, separando la parte di fetch delle pagine da quella di analisi, viene facile questa separazione), oppure di usare un proxy.

Offline Dcautomation

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:Web scraping, database e pagina web
« Risposta #8 il: Maggio 25, 2019, 07:57 »
Grazie Bebo, sono ancora alle prese con tutte le installazioni del caso, (con annessi problemi di debug, mannaggia alla punteggiatura).

Il setup iniziale è:

Python 3.7
Django 2. 2
Bs4
Postgres

Se trovo il tempo farò un breve post per tutti gli altri neofiti che sicuramente avranno gli stessi problemi da ma riscontrati.