
私は現在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 -u
POSIXは次のように言います。
固有:除外を除く一つ同じキーを持つ各行グループに。 -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 HREF
URLを使用して行われます。無能なユーザーやユーザーを追跡しようとしているからです。どちらも。
#! /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-perl
akaを使ってウェブボットを作成しますLWP
。私は特にHTML::TokeParser
Perlモジュールが好きですが、これはLWP
。