6

tl;dr: 情報が欠落しているデータベース内のエントリを検索し、その情報を Web サイトから取得してデータベース エントリに追加する方法を探しています。


mySQL テーブルを使用して情報を保存するメディア管理プログラムがあります。従業員がメディア (ビデオ ファイル、画像、オーディオ ファイル) をダウンロードしてメディア マネージャーにインポートするとき、メディアの説明も (ソース Web サイトから) コピーし、メディア マネージャーの説明に追加することを想定しています。ただし、これは何千ものファイルに対して行われていません。

ファイル名 (例: file123 .mov) は一意であり、ソース Web サイトの URL にアクセスすると、そのファイルの詳細ページにアクセスできます。

website.com/content/ file123

そのページからスクレイピングしたい情報には、常に同じ要素 ID があります。

私の考えでは、プロセスは次のようになります。

  1. データベースに接続してテーブルをロード
  2. フィルター:"format""Still Image (JPEG)"
  3. フィルター:"description""NULL"
  4. 最初の結果を取得
  5. "FILENAME"拡張子なしで入手)
  6. URL を読み込みます: website.com/content/FILENAME
  7. 要素のコンテンツをコピーする"description"(Web サイト上)
  8. 内容を"description"(SQL エントリ)に貼り付けます
  9. 2 番目の結果を取得
  10. 最後の結果に到達するまで、すすぎと繰り返し

私の質問は次のとおりです。

  1. そのようなタスクを実行できるソフトウェアはありますか、それともスクリプト化する必要があるものですか?
  2. スクリプト化されている場合、どのタイプのスクリプトが最適でしょうか (たとえば、AppleScript を使用してこれを実現できますか、それとも Java や php などで作成する必要がありますか?)
4

3 に答える 3

2
  1. そのようなタスクを実行できるソフトウェアはありますか、それともスクリプト化する必要があるものですか?

    箱から出してすぐに必要なことを実行できるものは何も知りません (もしあったとしても、必要な構成は、独自のソリューションを展開するために必要なスクリプト作成よりもはるかに少ない作業ではありません)。

  2. スクリプト化されている場合、どのタイプのスクリプトが最適でしょうか (たとえば、AppleScript を使用してこれを実現できますか、それとも Java や php などで作成する必要がありますか?)

    AppleScript はデータベースに接続できないので、間違いなく別のものをミックスに投入する必要があります。Java と 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();
    }
    
于 2012-05-25T08:27:26.233 に答える
1

PHP は優れたスクレーパーです。ここで、PHP の cURL ポートをラップするクラスを作成しました。

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

おそらく、いくつかのオプションを使用する必要があります。

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

HTML をスクレイピングするには、通常は正規表現を使用しますが、問題なく HTML をクエリできるように作成したクラスを次に示します。

http://pastebin.com/Jm9jKjAU

使用法は次のとおりです。

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

スクレイピングに最適なオプションは XPath ですが、ダーティな HTML を処理することはできません。これを使用して、次のようなことができます。

//div[@class = 'itm']/p[last() and text() = 'Hello World'] <- innerHTML 'Hello World' を持つ div 要素の最後の p を選択します

PHPでDOMクラス(組み込み)を使用して使用できます。

于 2012-05-23T03:11:14.790 に答える
1

私も、あなたが探しているすべてを実行する既存のソフトウェア パッケージを認識していません。ただし、Python はデータベースに接続し、Web リクエストを簡単に作成し、ダーティ html を処理できます。すでに Python がインストールされていると仮定すると、次の 3 つのパッケージが必要になります。

  • データベースに接続するためのMySQLdb 。
  • http Web リクエストを簡単に作成するためのリクエスト
  • html の堅牢な解析のためのBeautifulSoup 。

これらのパッケージは、pip コマンドまたは 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))

そのコードを「正しく見えるよう」にするために十分な努力をしたことを警告しますが、実際にはテストしていません。個人情報を入力する必要があります。

于 2012-05-31T00:34:11.760 に答える