Какой самый быстрый способ проверить правильность большого количества правильно сформированных URL - PullRequest
2 голосов
/ 19 февраля 2009

Мой проект требует от меня проверки большого количества веб-адресов. Эти URL были захвачены очень ненадежным процессом, который я не контролирую. Все URL-адреса уже были проверены регулярным выражением и, как известно, хорошо сформированы. Я также знаю, что все они имеют действительные ДВУ

Я хочу иметь возможность быстро фильтровать эти URL-адреса, чтобы определить, какие из них являются неправильными. На данный момент мне все равно, какой контент находится на страницах - я просто хотел бы как можно быстрее узнать, какие страницы недоступны (например, выдать ошибку 404).

Учитывая, что их много, я не хочу загружать всю страницу, а только заголовок HTTP, а затем сделать правильное предположение на основе содержимого заголовка, существует ли эта страница.

Можно ли это сделать?

Ответы [ 8 ]

7 голосов
/ 19 февраля 2009

Чтобы действительно сделать это быстро, вы также можете использовать eventlet , который использует неблокирующий ввод-вывод для ускорения.

Вы можете использовать запрос головы следующим образом:

from eventlet import httpc
try:
    res = httpc.head(url)
except httpc.NotFound:
    # handle 404

Затем вы можете поместить это в какой-нибудь простой скрипт, например этот пример скрипта, здесь . При этом вы должны получить в значительной степени параллелизм, используя пул сопрограмм.

6 голосов
/ 19 февраля 2009

Я предполагаю, что вы хотите сделать это в Python на основе ваших тегов. В этом случае я бы использовал httplib. При желании можно сгруппировать URL-адреса по хостам, чтобы можно было сделать несколько запросов в одном соединении для тех URL, которые имеют один и тот же хост. Используйте запрос HEAD.

conn = httplib.HTTPConnection("example.com")
conn.request("HEAD", "/index.html")
resp = conn.getresponse()
print resp.status
4 голосов
/ 19 февраля 2009

Использование httplib и urlparse :

def checkURL(url):
    import httplib
    import urlparse

    protocol, host, path, query, fragment = urlparse.urlsplit(url)

    if protocol == "http":
        conntype = httplib.HTTPConnection
    elif protocol == "https":
        conntype = httplib.HTTPSConnection
    else:
        raise ValueError("unsupported protocol: " + protocol)

    conn = conntype(host)
    conn.request("HEAD", path)
    resp = conn.getresponse()
    conn.close()

    if resp.status < 400:
        return true

    return false
3 голосов
/ 19 февраля 2009

Просто отправьте запросы HTTP HEAD, как показано в принятом ответе, на этот вопрос .

1 голос
/ 19 февраля 2009

Вместо отправки запроса HTTP GET для каждого URL вы можете попробовать отправить запрос HTTP HEAD. Они описаны в этом документе .

0 голосов
/ 26 февраля 2009

Программа Python, которая выполняет аналогичную работу (для списка URL-адресов, хранящегося в del.icio.us ), имеет значение катастрофический .

И, да, он использует HEAD, а не GET, но учтите, что некоторые (не стандартные HTTP) серверы отправляют разные результаты для HEAD и для GET: среда Python Zope является типичным виновником. (Также, в некоторых случаях, проблемы с сетью Например, туннели + сломанные межсетевые экраны, которые блокируют ICMP, препятствуют прохождению больших пакетов, поэтому HEAD работает, а не GET.)

0 голосов
/ 24 февраля 2009

Это может помочь вам начать. Файл sitelist.txt содержит список URI. Возможно, вам придется установить httplib2, очень рекомендуется. Я помещаю спящий режим между каждым запросом, поэтому, если у вас много URI на одном сайте, ваш клиент не будет внесен в черный список за злоупотребление ресурсами.

   import httplib2
   import time

   h = httplib2.Http(".cache")

   f = open("sitelist.txt", "r")
   urllist = f.readlines()
   f.close()

   for url in urllist:
      # wait 10 seconds before the next request - be nice with the site
      time.sleep(10)
      resp= {}
      urlrequest = url.strip()
      try:
         resp, content = h.request(urlrequest, "HEAD")
         if resp['status'] == "200":
            print url, "200 - Good"
         else:
            print url, resp['status'], " you might want to double check"
      except:
         pass
0 голосов
/ 19 февраля 2009

Это тривиальный случай для витой . Есть несколько инструментов параллелизма, которые вы можете использовать для замедления, в противном случае он сделает это практически сразу.

Twisted - определенно моя любимая вещь в Python. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...