2012-05-23 16 views
6

tl; डॉ: मैं अपने डेटाबेस में प्रविष्टियों को ढूंढने का एक तरीका ढूंढ रहा हूं, जो जानकारी खो रहे हैं, वेबसाइट से उस जानकारी को प्राप्त करने और डेटाबेस में जोड़ने के लिए एक तरीका ढूंढ रहे हैं प्रवेश।एक mySQL डेटाबेस


हम एक मीडिया प्रबंधन कार्यक्रम जो जानकारी संग्रहीत करने के लिए एक MySQL तालिका का उपयोग करता है। जब कर्मचारी मीडिया डाउनलोड करते हैं (वीडियो फाइलें, छवियां, ऑडियो फाइलें) और इसे मीडिया मैनेजर में आयात करते हैं तो वे मानते हैं मीडिया के विवरण (स्रोत वेबसाइट से) की प्रतिलिपि बनाने के लिए और मीडिया प्रबंधक में विवरण में जोड़ें। हालांकि यह हजारों फ़ाइलों के लिए नहीं किया गया है। (। जैसे file123 .mov)

फ़ाइल नाम अद्वितीय है और उस फ़ाइल के लिए विवरण पृष्ठ स्रोत वेबसाइट पर एक URL पर जाकर पहुँचा जा सकता है:

website.com/content/ file123

जानकारी हम उस पृष्ठ से स्क्रैप करना चाहते हैं एक तत्व आईडी जो हमेशा एक ही है।

मेरे मन में प्रक्रिया होगी:

  1. कनेक्ट डेटाबेस और लोड मेज पर
  2. फ़िल्टर: "format" है "Still Image (JPEG)"
  3. फ़िल्टर: "description""NULL" है
  4. पहला परिणाम प्राप्त
  5. विस्तार के बिना "FILENAME")
  6. लोड जाओ यूआरएल: website.com/content/ FILENAME
  7. कॉपी तत्व "description" की सामग्रियों (वेबसाइट पर)
  8. में पेस्ट सामग्री "description" (एसक्यूएल प्रविष्टि)
  9. जाओ 2 परिणाम
  10. रिंस और दोहराने अंतिम परिणाम तक
तक पहुँच जाता है

मेरा प्रश्न (ओं) हैं:

  1. वहाँ सॉफ्टवेयर है कि इस तरह के एक कार्य या यह कुछ ऐसा है की आवश्यकता होगी है सकता है लिखित हो?
  2. यदि स्क्रिप्ट किया गया है, तो स्क्रिप्ट का सबसे अच्छा प्रकार क्या होगा (उदाहरण के लिए मैं इसे ऐप्पलस्क्रिप्ट का उपयोग करके प्राप्त कर सकता हूं या इसे जावा या पीएचपी आदि में बनाया जाना चाहिए।)

उत्तर

1

मैं भी किसी भी मौजूदा सॉफ्टवेयर संकुल है कि सब कुछ आप देख रहे हैं क्या करेंगे के बारे में पता नहीं कर रहा हूँ। हालांकि, पाइथन आपके डेटाबेस से कनेक्ट हो सकता है, आसानी से वेब अनुरोध कर सकता है, और गंदे एचटीएमएल को संभाल सकता है। डेटाबेस से कनेक्ट करने के लिए

  • MySQLdb: आप पहले से ही अजगर स्थापित किया है मान लिया जाये कि, आप तीन संकुल की आवश्यकता होगी। Http12 अनुरोधों को आसानी से बनाने के लिए
  • Requests। एचटीएमएल के मजबूत पार्सिंग के लिए
  • BeautifulSoup

आप पिप आदेशों या Windows संस्थापक के साथ इन पैकेजों स्थापित कर सकते हैं। उचित निर्देश प्रत्येक साइट पर हैं। पूरी प्रक्रिया में 10 मिनट से ज्यादा समय नहीं लगेगा।

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)) 

मैं चेतावनी देंगे कि अगर मुझे लगता है कि कोड "सही लग रही" लेकिन मैं वास्तव में यह परीक्षण नहीं किया बनाने के लिए एक अच्छा प्रयास किया जाता है। आपको निजी विवरण भरना होगा।

1

PHP एक अच्छा स्क्रैपर है। ,

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

एचटीएमएल स्क्रैप करने के लिए मैं आमतौर पर:

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

आप शायद विकल्पों में से कुछ का उपयोग करना होगा: मैं एक वर्ग है कि यहाँ PHP के cURL बंदरगाह लपेटता बना दिया है नियमित अभिव्यक्तियों का उपयोग करें, लेकिन यहां एक वर्ग है जिसे मैंने बिना किसी समस्या के एचटीएमएल से पूछने में सक्षम होना चाहिए:

http://pastebin.com/Jm9jKjAU

useage है:

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

सबसे अच्छा स्क्रैप करने का विकल्प XPath होगा, लेकिन यह गंदा एचटीएमएल को संभाल नहीं कर सकते हैं। आप इसका उपयोग इस तरह की चीजों को करने के लिए कर सकते हैं:

// div [@class = 'itm']/p [अंतिम() और टेक्स्ट() = 'हैलो वर्ल्ड'] < - div तत्वों में अंतिम पी का चयन करता है आंतरिक HTML 'हैलो वर्ल्ड'

आप इसे PHP में डीओएम कक्षा (अंतर्निर्मित) के साथ उपयोग कर सकते हैं।

+0

उत्तर के लिए धन्यवाद! किसी भी विचार से मैं स्क्रैप की गई जानकारी कैसे ले सकता हूं और इसे mySQL तालिका में प्रविष्टियों के साथ मेल कर सकता हूं? – OrangeBox

2
  1. वहाँ सॉफ्टवेयर है कि इस तरह के एक कार्य या यह कुछ ऐसा है पटकथा करने की आवश्यकता होगी है सकता है?

    मुझे कुछ भी पता नहीं है जो आप बॉक्स से बाहर करना चाहते हैं (और यहां तक ​​कि अगर वहां भी कॉन्फ़िगरेशन आवश्यक है, तो अपने स्वयं के समाधान को चलाने में शामिल स्क्रिप्टिंग से बहुत कम काम नहीं होगा) ।

  2. तो पटकथा, क्या स्क्रिप्ट का सबसे अच्छा प्रकार होगा (जैसे मैं इस AppleScript का उपयोग कर प्राप्त कर सकते हैं या इसे जावा या php आदि में किए जाने की आवश्यकता होगी)

    AppleScript नहीं कर सकते डेटाबेस से कनेक्ट करें, इसलिए आपको निश्चित रूप से मिश्रण में कुछ और फेंकने की आवश्यकता होगी। यदि पसंद जावा और PHP के बीच है (और आप दोनों के साथ समान रूप से परिचित हैं), तो मैं निश्चित रूप से इस उद्देश्य के लिए PHP की अनुशंसा करता हूं, क्योंकि इसमें काफी कम कोड शामिल होगा।

    आपका PHP स्क्रिप्ट कुछ इस तरह दिखेगा:

    $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(); 
    } 
    
संबंधित मुद्दे