Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумСофт и программы

Чем заменить тяжёлый комбайн под одну простую задачу

stackfix
stackfix
Участник
сообщений 495
с окт
8 июня, 11:17первое сообщение

Держу на рабочей машине комбайн, который умеет всё на свете. Стартует полминуты, съедает под два гигабайта памяти, лицензия прибита к железу.

А задача у меня одна и та же каждую неделю: взять список из сорока тысяч адресов, вытащить заголовок страницы и первый h1, сложить в таблицу. Больше ничего оттуда не нужно.

Кто чем заменил такое? Хочется запуск из консоли и без мышки.

пишу скрипты, чтобы не писать скрипты
ostrov
ostrov
Участник
сообщений 505
с окт
15 ноября, 14:34#2

Тут хватит трёх утилит. curl тянет, htmlq разбирает, xargs держит параллель.

cat spisok.txt | xargs -P 12 -I{} sh -c '
  h=$(curl -sL --max-time 20 "{}")
  t=$(printf "%s" "$h" | htmlq -t title | head -1)
  z=$(printf "%s" "$h" | htmlq -t h1 | head -1)
  printf "%s\t%s\t%s\n" "{}" "$t" "$z"
' >> vyhod.tsv

Сорок тысяч на двенадцати параллелях у меня уходят за час с небольшим. Памяти при этом меньше сотни мегабайт.

Данила Р
Данила Р
Новичок
сообщений 145
с мар, второй сезон
22 апреля, 17:51#3

а если страница в windows-1251? у меня такие попадаются, в таблице потом кракозябры

hexdump
hexdump
Знаток
сообщений 940
с июн
1 сентября, 08:08#4

Кодировку curl не трогает вовсе, он отдаёт байты как пришли. Перекодировать надо самому, и название брать из заголовка ответа: в meta внутри страницы оно врёт заметно чаще, особенно на старых движках, где шапку правили руками, а сервер отдаёт своё.

ct=$(curl -sIL "$u" | grep -i '^content-type:' | tail -1)
enc=$(printf '%s' "$ct" | sed -n 's/.*charset=\([^;[:space:]]*\).*/\1/p')
[ -z "$enc" ] && enc=utf-8
curl -sL "$u" | iconv -f "$enc" -t utf-8//TRANSLIT

Когда заголовок молчит, а страница явно не в utf-8, помогает грубая проверка: попробовать декодировать как utf-8 и посмотреть, не посыпались ли ошибки. Посыпались, значит 1251. На русских сайтах третьего варианта почти не бывает.

stackfix
stackfix
Участник
сообщений 495
с окт
8 февраля, 11:25#5
hexdump: в meta внутри страницы оно врёт заметно чаще

Перепроверил на своей выборке: из сорока тысяч в 1251 сидит около шестисот адресов, и у всех шестисот заголовок ответа честный. Meta у половины из них показывает utf-8.

пишу скрипты, чтобы не писать скрипты
grepwalker
grepwalker
Знаток
сообщений 1330
с мая
15 июля, 14:42#6

Пока прогон короткий, всё выглядит хорошо. На сорока тысячах у тебя обязательно оборвётся связь или упадёт машина, и повторять сначала будет обидно.

Заведи файл сделанного и вычитай его из входа перед стартом:

comm -23 <(sort -u spisok.txt) <(cut -f1 vyhod.tsv | sort -u) > ostalos.txt

Пишешь в vyhod.tsv строку сразу после каждого адреса, и любой обрыв стоит тебе одной страницы.

сколько осталось после обрыва
сколько осталось после обрыва
Тимур Ш.
Тимур Ш.
Участник
сообщений 890
с июн
22 декабря, 17:59#7

Добавлю мелочь, о которой вспоминают после первого прогона: ставь --max-time, иначе одна висящая страница займёт слот до конца ночи. И -L с ограничением по числу переходов, а то попадаются кольца из редиректов.

бэкап перед правкой конфига
stackfix
stackfix
Участник
сообщений 495
с окт
1 мая, 08:16#8

Собрал у себя из ваших кусков, гоняю вторую неделю. Сорок тысяч за пятьдесят минут, память в пике 80 мегабайт, комбайн с машины снёс.

Больше всего выручил файл сделанного: связь рвалась дважды, оба раза дописал остаток за десять минут.

пишу скрипты, чтобы не писать скрипты