2012-05-23 16 views
6

tl; dr: Sto cercando un modo per trovare voci nel nostro database in cui mancano informazioni, ottenere tali informazioni da un sito Web e aggiungerle al database iscrizione.Accoppiamento di contenuti su un sito Web esterno con voci in un database mySQL


Abbiamo un programma di gestione dei media che utilizza una tabella MySQL per memorizzare le informazioni. Quando i dipendenti scaricano contenuti multimediali (file video, immagini, file audio) e li importano nel gestore media, sono supporre che copi anche la descrizione del supporto (dal sito Web di origine) e la aggiunga alla descrizione in Media Manager. Tuttavia questo non è stato fatto per migliaia di file. (Es. file123 .mov)

Il nome del file è unico e la pagina dei dettagli per quel file si può accedere andando a un URL sul sito web di origine:

website.com/content/ file123

le informazioni che vogliamo raschiare da quella pagina ha un ID elemento che è sempre lo stesso.

Nella mia mente il processo sarebbe:

  1. Connettersi al database e carico tavolo
  2. Filtro: "format" è "Still Image (JPEG)"
  3. Filtro: "description" è "NULL"
  4. Get primo risultato
  5. Get "FILENAME" senza estensione)
  6. caricare l'URL: website.com/content/ FILENAME
  7. contenuti copia dell'elemento "description" (sul sito web)
  8. contenuti incollare nel "description" (ingresso SQL)
  9. Get secondo risultato
  10. Sciacquare e ripetere fino a quando ultimo risultato viene raggiunto

La mia domanda (s) sono:

  1. C'è un software in grado di svolgere tale compito o si tratta di qualcosa che avrebbe bisogno di essere sceneggiato?
  2. Se scriptato, quale sarebbe il miglior tipo di script (ad esempio, potrei ottenerlo usando AppleScript o sarebbe necessario farlo in java o php, ecc.

risposta

1

anche io non sono a conoscenza di tutti i pacchetti software esistenti che farà tutto quello che stai cercando. Tuttavia, Python può connettersi al tuo database, fare richieste web facilmente e gestire html sporco. Supponendo che tu abbia già installato Python, avrai bisogno di tre pacchetti:

È possibile installare questi pacchetti con comandi pip o programmi di installazione di Windows. Le istruzioni appropriate sono su ogni sito. L'intero processo non richiederà più di 10 minuti.

import MySQLdb as db 
import os.path 
import requests 
from bs4 import BeautifulSoup 

# Connect to the database. Fill in these fields as necessary. 

con = db.connect(host='hostname', user='username', passwd='password', 
       db='dbname') 

# Create and execute our SELECT sql statement. 

select = con.cursor() 
select.execute('SELECT filename FROM table_name \ 
       WHERE format = ? AND description = NULL', 
       ('Still Image (JPEG)',)) 

while True: 
    # Fetch a row from the result of the SELECT statement. 

    row = select.fetchone() 
    if row is None: break 

    # Use Python's built-in os.path.splitext to split the extension 
    # and get the url_name. 

    filename = row[0] 
    url_name = os.path.splitext(filename)[0] 
    url = 'http://www.website.com/content/' + url_name 

    # Make the web request. You may want to rate-limit your requests 
    # so that the website doesn't get angry. You can slow down the 
    # rate by inserting a pause with: 
    #    
    # import time # You can put this at the top with other imports 
    # time.sleep(1) # This will wait 1 second. 

    response = requests.get(url) 
    if response.status_code != 200: 

     # Don't worry about skipped urls. Just re-run this script 
     # on spurious or network-related errors. 

     print 'Error accessing:', url, 'SKIPPING' 
     continue 

    # Parse the result. BeautifulSoup does a great job handling 
    # mal-formed input. 

    soup = BeautifulSoup(response.content) 
    description = soup.find('div', {'id': 'description'}).contents 

    # And finally, update the database with another query. 

    update = db.cursor() 
    update.execute('UPDATE table_name SET description = ? \ 
        WHERE filename = ?', 
        (description, filename)) 

ti avverto che ho fatto un buon sforzo per far sì che il codice "guardare a destra", ma in realtà non l'ho testato. Dovrai inserire i dettagli privati.

1

PHP è un buon scrapper. Ho fatto una classe che avvolge il porto ricciolo di PHP qui:

http://semlabs.co.uk/journal/object-oriented-curl-class-with-multi-threading

avrete probabilmente bisogno di utilizzare alcune delle opzioni:

http://www.php.net/manual/en/function.curl-setopt.php

per raschiare HTML, io di solito utilizzare le espressioni regolari, ma qui è una classe che ho fatto che dovrebbe essere in grado di interrogare HTML senza problemi:

http://pastebin.com/Jm9jKjAU

Usage è:

$h = new HTMLQuery(); 
$h->load($string_containing_html); 
$h->getElements('p', 'id'); // Returns all p tags with an id attribute 

L'opzione migliore per raschiare sarebbe XPath, ma non può gestire sporca HTML. Puoi usare quello per fare cose come:

// div [@class = 'itm']/p [ultimo() e testo() = 'Ciao mondo'] < - seleziona l'ultimo p in elementi div che avere l'innerHTML 'Hello World'

Puoi usarlo in PHP con la classe DOM (built-in).

+0

grazie per la risposta! Qualche idea su come potrei quindi prendere le informazioni raschiate e abbinarle alle voci in una tabella mySQL? – OrangeBox

2
  1. C'è un software in grado di svolgere tale compito o si tratta di qualcosa che avrebbe bisogno di essere script?

    Non sono a conoscenza di nulla che faccia ciò che si vuole fuori dalla scatola (e anche se ci fosse, la configurazione richiesta non sarà molto meno lavoro rispetto allo scripting coinvolto nella rotazione della propria soluzione) .

  2. Se sceneggiato, quale sarebbe il miglior tipo di script (ad esempio, ho potuto ottenere questo usando AppleScript o sarebbe bisogno di essere realizzato in Java o PHP, ecc)

    AppleScript non è possibile connettersi ai database, quindi sarà sicuramente necessario inserire qualcos'altro nel mix. Se la scelta è tra Java e PHP (e hai una certa familiarità con entrambi), ti consiglio vivamente PHP per questo scopo, in quanto ci sarà molto meno codice coinvolto.

    Lo script PHP sarebbe simile a questa:

    $BASEURL = 'http://website.com/content/'; 
    
    // connect to the database 
    $dbh = new PDO($DSN, $USERNAME, $PASSWORD); 
    
    // query for files without descriptions 
    $qry = $dbh->query(" 
        SELECT FILENAME FROM mytable 
        WHERE format = 'Still Image (JPEG)' AND description IS NULL 
    "); 
    
    // prepare an update statement 
    $update = $dbh->prepare(' 
        UPDATE mytable SET description = :d WHERE FILENAME = :f 
    '); 
    
    $update->bindParam(':d', $DESCRIPTION); 
    $update->bindParam(':f', $FILENAME); 
    
    // loop over the files 
    while ($FILENAME = $qry->fetchColumn()) { 
        // construct URL 
        $i = strrpos($FILENAME, '.'); 
        $url = $BASEURL . (($i === false) ? $FILENAME : substr($FILENAME, 0, $i)); 
    
        // fetch the document 
        $doc = new DOMDocument(); 
        $doc->loadHTMLFile($url); 
    
        // get the description 
        $DESCRIPTION = $doc->getElementsById('description')->nodeValue; 
    
        // update the database 
        $update->execute(); 
    } 
    
Problemi correlati