Задать вопрос
JRazor
@JRazor
Senior StarkOverFlow Programmer

Python: как проверить URL на правильность?

Здравствуйте. Возникла проблема следующего характера: Scrapy глохнет при скармливании ему неправильного URL. Парсинг останавливается и дальнейшие URL не проверяются (например, "adsabs.harvard.edu/full/2002JIMO...30..199R").

Поэтому было придумано получать код ответа от URL через httplib. Была украдена функция со stackoverflow.com:

def get_status_code(self, host, path="/"):
        """ This function retreives the status code of a website by requesting
            HEAD data from the host. This means that it only requests the headers.
            If the host cannot be reached or something else goes wrong, it returns
            None instead.
        """
        try:
            conn = httplib.HTTPConnection(host)
            conn.request("HEAD", path)
            return conn.getresponse().status
        except StandardError:
            return None


Если код возвращает 200 - URL проходит, в остальных случаях - игнорируется. Но дело в том, что такая проверка очень долгая. Отправить запрос на каждый URL (а их порядка 30к) - это значительно замедляет парсер.

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

Может ли кто-нибудь порекомендовать альтернативный метод решения проблемы?
  • Вопрос задан
  • 9644 просмотра
Подписаться 4 Сложный Комментировать
Решения вопроса 1
JRazor
@JRazor Автор вопроса
Senior StarkOverFlow Programmer
Проблему решил. Познакомился с функцией errback (альтернатива callback в Request запросах Scrapy).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@throughtheether
human after all
Scrapy глохнет при скармливании ему неправильного URL.
А вы пробовали к ресурсу, адресуемому этим URL, обратиться браузером? У меня открывается статья, с библиографическим номером 2002JIMO...30..199R. Более того, при помощи requests я получаю HTTP 200 в ответ на HEAD:
>>> import requests
>>> response = requests.head('http://adsabs.harvard.edu/full/2002JIMO...30..199R')
>>> response
<Response [200]>

Есть мнение, что вы не до конца понимаете проблему, которую хотите решить. Предлагаю разобраться, почему
Scrapy глохнет при скармливании ему неправильного URL
(и так ли это вообще, может быть, эти явления не связаны). Может быть, сайт временно не работоспособен? Может быть, сервер вас (или ваш прокси) блокирует? Может быть, это ошибка Scrapy?
Зафиксируйте URL и проверьте, всегда ли (при каких условиях) Scrapy его [не]корректно обрабатывает.
Ответ написан
yttrium
@yttrium
стучаться по урлам это не есть гуд
надо парсить урл вот чем https://docs.python.org/2/library/urlparse.html
или re
Ответ написан
hrls
@hrls
adsabs.harvard.edu/full/2002JIMO...30..199R – это не URL.
Почитать и понять можно тут и тут (стоит сразу искать вхождение 'Parsing a URI Reference with a Regular Expression').
Наверное тут уже были stackoverflow.com/questions/7160737/python-how-to-...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы