-2

Я выполняю проверку ссылок на сайте из списка URL-адресов, и я могу думать только о том, чтобы использовать wget: wget --server-response -i inputfile 2> output а затем проанализировать ответ заголовка. Это выводит относительно большой файл для большого списка, и я только хочу знать, присутствует ли 404. Типичный ответ выглядит примерно так:

--2017-03-28 19:14:39--  https://www.example.com/foo/bar
Reusing existing connection to www.example.com:443.
HTTP request sent, awaiting response... 
  HTTP/1.1 404 NotFound
<snip>

Как я могу выполнить сопоставление регулярных выражений из выходных данных с помощью wget для каждого URL (из stderr), и, если присутствует 404, выведите URL, который я затем могу перенаправить в файл, чтобы у меня остался файл с списком 404 ? (Пожалуйста, не предлагайте использовать curl, сайт, к сожалению, настроен на возврат METHOD NOT ALLOWED .

3 ответа3

0

Как насчет

#!/bin/bash

URLLIST=/path/to/file

for each in `cat $URLLIST`
do
   IS404=`wget -S "$each" -O /dev/null 2>&1 | grep "HTTP/1.1 404" | wc -l`

    if [ $IS404 -gt 0 ]
    then
        echo $each
    fi
done

Я только частично проверил вышеизложенное, но ключевая строка, начиная с IS404, делает wget для каждого URL (потому что он находится в каждом цикле), отбрасывает вывод, перенаправляет стандартный вывод - это то, что делает 2> & 1 - и, таким образом, заголовки (благодаря -S) к stdout, где он подсчитывает количество 404 ответов. Если один или несколько найден, он печатает URL.

0

Извините, изначально я пропустил предостережение "не предлагать завиток". Но вы все еще можете получить что-то из этого поста ...

Способ сделать это - использовать curl. Если вы получите ответ МЕТОД НЕ РАЗРЕШЕН, тот же самый ответ должен содержать список разрешенных методов. Вы могли бы, возможно, опубликовать это. Иногда метод GET запрещен, а метод HEAD разрешен; в других случаях это наоборот. Единственный способ узнать это проверить ответ. Я предполагаю , что вы попробовали метод GET и автоматически пришли к выводу, что метод HEAD (то есть загрузка только заголовков) одинаково запрещен. Это не обязательно так, иногда администраторы запрещают GET избегать перегрузки своих ограниченных ресурсов соединения, но они разрешают HEAD. Нет способа узнать априори.

Преимущества curl :

  1. curl можно сказать загружать только заголовок, тем самым отбрасывая бесполезную (в данном случае) загрузку реальной страницы; просто попробуй:

    curl -I http://www.debian.org
    
  2. curl автоматически сохраняет соединение открытым в течение времени по умолчанию (я думаю, 900 секунд):

    # curl -v http:://www.debian.org -I www.debian.org
      ......
      * Connection #0 to host www.debian.org left intact
    

    Это опция по умолчанию, но, чтобы ошибиться в безопасности, в Руководстве указано, что вы можете использовать, если хотите, опцию --keepalive .

Чтобы ускорить процесс, вы можете распараллелить curl:

URL_LIST=$(cat inputfile)
echo $URL_LIST | xargs -n 1 -P 8 -I{} bash -c 'curl -I {} 2>1 | grep 404 &>/dev/null ; [ $? ] && echo {}'

Это передает имена URL по одному (-n 1) до максимум 8 параллельно (-P 8) следующей команде, которая печатает имя URL тогда и только тогда, когда найден код 404. Опция -I {} сообщает xargs, где разместить выбранное имя URL. Весь вывод отбрасывается, потому что все, что нужно, это код завершения последней команды, grep.

В зависимости от ваших конкретных потребностей возможны и другие варианты адаптации: список вариантов скручивания огромен.

-1

Вы можете установить powershell https://github.com/PowerShell/PowerShell

Затем вы можете легко написать мощный скрипт, который проверяет и выполняет такие вещи, как электронная почта, если URL не работает: https://stackoverflow.com/questions/18500832/script-to-check-the-status-of-a-url

Foreach($Uri in $URLList) {
  $error.Clear()

  $time = Measure-Command { $request = Invoke-WebRequest -Uri $uri } 2>$null

  if ($error.Count -eq 0) {
    $time.TotalMilliseconds
  } else {
    $error[0].Exception.Response
  }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .