1

ホームページから始めて、Web サイトからランダムなページをロードする非常に基本的なベンチマーク スクリプトを作成しようとしています。

curl を使用してページのコンテンツを取得しますが、そこからランダムな次のページもロードしたいと考えています。curl コマンドの出力からランダムな a href から URL を取得するシェル コードを少し教えてもらえますか?

4

4 に答える 4

1

lynx と bash 配列の両方を使用:

hrefs=($(lynx -dump http://www.google.com |
sed -e '0,/^References/{d;n};s/.* \(http\)/\1/'))
echo ${hrefs[$(( $RANDOM % ${#hrefs[@]} ))]}
于 2012-07-12T19:26:59.040 に答える
1

解決策ではありません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
于 2012-07-12T19:35:48.273 に答える
1

これが私が思いついたものです:

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ます。

于 2012-07-12T18:55:37.057 に答える
0

子犬の使用

ページ上のすべてのリンクを取得するための柔軟な解決策は、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置き換えます。/

リンクのテキストも含めたいと思うかもしれません。pup2 つの出力関数をサポートしていないため、これは少し厄介です。ただし、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

これはタブ区切りの値の出力であり、必要な場合とそうでない場合があります。

于 2021-11-20T08:18:06.297 に答える