ホームページから始めて、Web サイトからランダムなページをロードする非常に基本的なベンチマーク スクリプトを作成しようとしています。
curl を使用してページのコンテンツを取得しますが、そこからランダムな次のページもロードしたいと考えています。curl コマンドの出力からランダムな a href から URL を取得するシェル コードを少し教えてもらえますか?
lynx と bash 配列の両方を使用:
hrefs=($(lynx -dump http://www.google.com |
sed -e '0,/^References/{d;n};s/.* \(http\)/\1/'))
echo ${hrefs[$(( $RANDOM % ${#hrefs[@]} ))]}
解決策ではありませんcurl
が、タスクを考えるとより効果的だと思います。
perl
WWW::Mechanize
これにはモジュールを使用することをお勧めします。たとえば、ページからすべてのリンクをダンプするには、次のように使用します。
use WWW::Mechanize;
$mech = WWW::Mechanize->new();
$mech->get("URL");
$mech->dump_links(undef, 'absolute' => 1);
注URL
は、必要なページに置き換える必要があります。
その後、 内で続行しますperl
。以下は、URL
ページ上のランダムなリンクをたどります。
$number_of_links = "" . @{$mech->links()};
$mech->follow_link( n => int(rand($number_of_links)) )
または、dump_links
上記のバージョンを使用して URL を取得し、シェル内でさらに処理します。たとえば、ランダムな URL を取得します (上記のスクリプトが呼び出された場合get_urls.pl
):
./get_urls.pl | shuf | while read; do
# Url is now in the $REPLY variable
echo "$REPLY"
done
これが私が思いついたものです:
curl <url> 2> /dev/null | egrep "a href=" | sed 's/.*<a href="//' | \
cut -d '"' -f 1-1 | while read i; do echo "`expr $RANDOM % 1000`:$i"; done | \
sort -n | sed 's/[0-9]*://' | head -1
リンクを取得しようとしている URL にビットを置き換えます。
編集: 以下を含む getrandomurl.sh というスクリプトを作成する方が簡単な場合があります。
#!/bin/sh
curl $1 2> /dev/null | egrep "a href=" | sed 's/.*<a href="//' | \
cut -d '"' -f 1-1 | while read i; do echo "`expr $RANDOM % 1000`:$i"; done | \
sort -n | sed 's/[0-9]*://' | head -1
そしてそれを実行し./getrandomurl.sh http://stackoverflow.com
ます。
ページ上のすべてのリンクを取得するための柔軟な解決策は、pupを使用してCSS セレクターを指定することです。たとえば、次の<a>
コマンドを使用して、ブログからすべてのリンク ( タグ) を取得できます。
curl https://jlericson.com/ 2>/dev/null \
| pup 'a attr{href}'
attr{href}
最後の は属性のみを出力しますhref
。このコマンドを実行すると、私のサイトの投稿ではなく、私のメール アドレスと Twitter アカウントへのリンクがいくつかあることがわかります。
ブログ記事のリンクだけを取得したい場合は、もう少し慎重に選ぶことができます。
curl https://jlericson.com/ 2> /dev/null \
| pup 'a.post-link attr{href}'
class='post-link'
これは、私の投稿へのリンクである のリンクのみを取得します。
これで、出力のランダムな行を選択できます。
curl https://jlericson.com/ 2> /dev/null \
| pup 'a.post-link attr{href}' \
| shuf | head -1
このshuf
コマンドは、カードのデッキのように行を混ぜ合わせ、デッキからhead -1
一番上のカードを引きます。(または、必要に応じて最初の行。)
私のリンクはすべて相対なので、次を使用してドメインを追加しますsed
。
curl https://jlericson.com/ 2> /dev/null \
| pup 'a.post-link attr{href}' \
| sed -e 's|/|https://jlericson.com/|' \
| shuf | head -1
このコマンドは、最初の URL を残りの URL にsed
置き換えます。/
リンクのテキストも含めたいと思うかもしれません。pup
2 つの出力関数をサポートしていないため、これは少し厄介です。ただし、JSON への出力はサポートされており、次のコマンドで読み取ることができますjq
。
curl https://jlericson.com/ 2> /dev/null \
| pup 'a.post-link json{}' \
| jq -r '.[] | [.text,.href] | @tsv' \
| sed -e 's|/|https://jlericson.com/|' \
| shuf | head -1
これはタブ区切りの値の出力であり、必要な場合とそうでない場合があります。