Вот улучшенная версия вашего скрипта.
Он по-прежнему довольно дрянный, потому что (помимо минимальных усилий с первоначальным поиском в Google) он не пытается справиться с какими-либо действительно ужасными вещами, которые, к сожалению, большой процент веб-сайтов делает с 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
Парсинг веб-страниц затруднен, главным образом потому, что HTML является чрезвычайно слабым стандартом, но также и потому, что веб-дизайнеры часто либо некомпетентные отсталые, либо пытаются намеренно запутать свои страницы, либо и то, и другое. Ему нужен более функциональный язык, чем bash
.
Лично я пишу веб-роботов на perl
, используя libwww-perl
aka LWP
. Мне особенно нравится модуль perl HTML :: TokeParser
как достаточно простой анализатор HTML в сочетании с LWP
.