0

このコードは、Web サイトの html ファイルを検索し、ドメイン名のリストを抽出します...

httrack --skeleton http://www.ilovefreestuff.com -V "cat \$0" | grep -iEo '[[:alnum:]-]+\.(com|net|org)'

結果はこんな感じ。

  • domain1.com
  • domain2.com
  • domain3.com

このコードを非常に大規模な Web サイトで使用する予定であるため、非常に大きなドメイン名のリストが生成されます。さらに、上記のコードは多くの重複したドメイン名を生成します。したがって、重複が挿入されないように、一意のフィールドを使用して mysql データベースをセットアップします。

プログラミングに関する私の限られた知識を使用して、以下の行をハッキングしましたが、これは機能しません。コマンドを実行すると、エラーは発生せず、新しいコマンド プロンプト > と点滅するカーソルだけが表示されます。私は、正しい構文や方法論を使用していないと思います。また、コマンドラインではやりたいことを実行できない可能性があります。どんな助けでも大歓迎です。

httrack --skeleton http://www.ilovefreestuff.com -V "cat \$0" | domain=“$(grep -iEo '[[:alnum:]-]+\.(com|net|org)’)” | mysql -pPASSWORD -e "INSERT INTO domains.domains (domains) VALUES ($domain)”

はい、データベース名はドメイン、テーブル名はドメイン、フィールド名はドメインです。

4

1 に答える 1

0

INSERTの MySQL 構文から判断すると、次のようになります。

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name,…)] 
    [(col_name,…)]
    {VALUES | VALUE} ({expr | DEFAULT},…),(…),…
    …

ドメイン名を、括弧で囲まれた引用符で囲まれたカンマ区切りの項目に変換する必要があります。

('domain1.com'),('domain2.com'),…

次に、このリストを、生成した INSERT ステートメントの最後に添付します。

httrack --skeleton http://www.ilovefreestuff.com -V "cat \$0" |
grep -iEo '[[:alnum:]-]+\.(com|net|org)’ |
sort -u |
sed -e "s/.*/,('&')/" -e '1s/,/INSERT IGNORE INTO domains.domains(domain) VALUES /' |
mysql -pPASSWORD

により、sort -u名前が一意になります。最初-esed、行の内容 (例: domain1.com) を,('domain1.com);に変換します。2 番目-eは、最初の行 (最初の によって追加された) のコンマを削除し、プレフィックス-eに置き換えます。INSERTステートメントのIGNOREINSERT、ドメインが既にテーブルにある場合、新しいエントリが無視されることを意味します。

明らかに、生成されたドメインの数が MySQL で有効な SQL ステートメントに対して多すぎる場合、データを分割する必要がありますが、一度に数千のドメインを処理できる可能性があります。

于 2014-05-25T18:02:56.483 に答える