Webページ(html)の一部のリストを「解析」したいです。 「解析」するには、<title> </title>
タグ間のコンテンツを特定のファイルにリダイレクトするだけです。まずfor
、ループを使用してwget
から(time
もちろん)curl
このケースがより速いという結論を下します。
だからそれは次のようになります:
for page in $(cat source.txt)
do
echo "$(curl -s https://somewebpage/some_sub_page/$page \
| grep '<title>' -A2 | sed -n '2p')" > tmp/$page/index
done
これらすべてのサブページには、<title>
以下のように私が興味を持っている情報が含まれています。
<title>
...
</title>
そのため、結果を得るために一般的なシェルツールを適用しました。私の問題は何ですか?約400ページなので、ページ全体を読み込んだ後にページをgrep
読み込むなどの作業には時間がかかります。 HTMLドキュメントの最初の10行だけをロードするなど、より複雑なロードソリューションはありますか?私は古典的なbashユーティリティ(curl、wget)を使用していますが、この問題に適していると思われるユーティリティをお勧めします。
UPD:たぶんこれは完璧な解決策ではないかもしれませんが、head
スクリプトを2回減らした後に追加されました。 (コピー)curl
time
答え1
正しい方法で試してください。道表現する:
注文する:
saxon-lint --html --xpath '//title/text()' http://domain.tld/path
確認するサクソンリント(自己プロジェクト)
あなたはテストすることができますxmllinthttps
(ただし、ほとんどの場合、HTMLパーサーはSTDERRを非表示にする必要があり、これはサポートされていません。それ以前に作成したコマンドと同じくらい良いです)
xmllint --html --xpath '//title/text()' http://domain.tld/path 2>/dev/null
ついに:
for page in $(cat source.txt); do
chosen_command "https://somewebpage/some_sub_page/$page" > "/tmp/$page/index"
done
答え2
ここに入りたい内容をパイプできます。
wget -4 -qO- {$query} |\
html2text |\
awk '/<title>/,/<\/title>/{print}'
答え3
一般に、HTTP パフォーマンスを制限する要因は帯域幅ではなく待ち時間です。したがって、ページの一部のみをロードするとパフォーマンスに大きな影響を与えるとは思いません。ただし、HTTPはこれを行うメカニズム(範囲要求)を提供します。そしてもちろん、cURLのサポート。
しかし、タイトルの厳格な要件HTML コンテンツの先頭、すぐに表示される場所に表示されます。心に。
ページが約400ページ程度になりますが、ページ全体を読み込むのに時間がかかります。
上記のように、ここでは多くの利点が得られないようです(私が間違っている場合は、データグラムモデルではなくストリームベースのプロセッサ実装を検討する必要があります)。より迅速に結果を得るには、ワークロードを分割して複数のハンドラを並列に実行します。