ソートがうまくいかないようです。

ソートがうまくいかないようです。

私は現在Webクローラーボットを作成しています。重複したエントリを削除し、行をアルファベット順に並べ替える必要があるURLのリストを生成します。私のコードは次のとおりです

#! /bin/bash
URL="google.com"
while [ 1 ]; do
  wget --output-document=dl.html $URL
  links=($(grep -Po '(?<=href=")[^"]*' dl.html))
  printf "%s\n" ${links[@]} >> results.db

  sort results.db | uniq -u

  URL=$(shuf -n 1 results.db)
  echo $URL
done

特にこの行は:

sort results.db | uniq -u

答え1

POSIX説明するuniq -u

入力に重複した行を書き込むのを抑制します。

これは、冗長行(元の行を含む)がフィルタリングされることを意味します。おそらく(完了POSIX返品):

sort -u results.db

の場合、sort -uPOSIXは次のように言います。

固有:除外を除く一つ同じキーを持つ各行グループに。 -cオプションと一緒に使用すると、入力ファイルがソートされていることを確認するだけでなく、重複キーを含む行がないことを確認します。

どちらの場合も、次の行は

URL=$(shuf -n 1 results.db)

sort/uniq の目的は次のとおりです。修正する results.db(そうではありません)。これを行うには、スクリプトをさらに変更する必要があります。

sort -u results.db >results.db2 && mv results.db2 results.db

または(@drewbennが提案したように)前の行と組み合わせます。しかしそれ以来追加ファイルに(その答えに示されているコマンドを組み合わせても最新のprintfとファイルの内容との重複は削除されません)、別のコマンドsort / mvが元のスクリプトに近いように見えます。

nullでないことを確認するには$URL(実際には別の質問です)、testを使用してください[

  [ -n "$URL" ] && wget --output-document=dl.html $URL

単にループを終了する方が簡単ですが、

[ -z "$URL" ] && break

答え2

これはスクリプトの改良版です。

(初期のGoogle検索の最小限の努力を超えて)本当にひどいものを処理しようとしないので、それはまだ悪いです。残念ながら、ほとんどのWebサイトはA HREFURLを使用して行われます。無能なユーザーやユーザーを追跡しようとしているからです。どちらも。

#! /bin/sh

# exit on any error
set -e    

dbfile="results.db"

# if "$dbfile" doesn't exist (or is empty), or if a URL has been
# provided as a command-line argument, fetch the initial URLs
# from "$1" (or a google search), and strip off the google-junk:

if [ ! -s "$dbfile" ] || [ -n "$1" ] ; then 
    URL="{$1:-https://www.google.com/search?q=interesting+stuff}"

    lynx -accept_all_cookies -dump -listonly -nonumbers "$URL" | 
        sed -e '/^http.*url?/!d; s/^.*\/url?q=//; s/\&.*//' > "$dbfile"

fi

URL=$(shuf -n 1 "$dbfile")

while [ 1 ]; do
  lynx -accept_all_cookies -dump -listonly -nonumbers "$URL" | 
      grep http >> "$dbfile"

  tmpfile=$(mktemp) && 
    sort -u "$dbfile" > "$tmpfile" &&
    mv -f "$tmpfile" "$dbfile" &&
    rm -f "$tmpfile"

  URL=$(shuf -n 1 "$dbfile")
  echo "$URL"
done

Webスクレイピングは難しいのですが、主にHTMLが非常に緩い標準であるためだけでなく、Webデザイナーが一般に無能または意図的にページを難読化しようとするか、または両方をダイアするためです。比率が必要ですbash

perl個人的には、libwww-perlakaを使ってウェブボットを作成しますLWP。私は特にHTML::TokeParserPerlモジュールが好きですが、これはLWP

関連情報