Инструмент Python для проверки неработающих ссылок в большом списке URL - PullRequest
0 голосов
/ 25 октября 2018

У меня есть поисковая система, которая обслуживает около 700 000 URL.Сканирование выполняется с использованием Scrapy, и все пауки планируются с помощью DeltaFetch, чтобы ежедневно получать новые ссылки.

Сложность, с которой я сталкиваюсь, - обработка неработающих ссылок.

У меня трудное времянайти хороший способ периодически сканировать и удалять неработающие ссылки.Я думал о нескольких решениях:

  • Разработка скрипта на Python с использованием request.get, для проверки каждого URL-адреса и удаления всего, что возвращает статус 404.
  • Использованиесторонний инструмент, такой как https://github.com/linkchecker/linkchecker,, но я не уверен, что это лучшее решение, так как мне нужно проверить только список URL, а не веб-сайт.
  • Использование паука-скрапа для удаления этого списка URL,и вернуть любые URL, которые выдают ошибку.Я не совсем уверен в этом, так как знаю, что scrapy имеет тенденцию к превышению времени ожидания при сканировании большого количества URL-адресов в разных доменах, поэтому я так полагаюсь на deltafetch

Есть ли у вас какие-либо рекомендации /лучшая практика для решения этой проблемы?

Большое спасибо.

Редактировать: Я забыл дать одну точность: я пытаюсь "проверить" эти 700 тысяч URL, а не сканировать их.на самом деле эти 700 тысяч URL-адресов являются результатом сканирования около 2500 тысяч доменов.

Ответы [ 4 ]

0 голосов
/ 25 октября 2018
  1. Первая мысль, которая пришла мне в голову, - запросить URL-адреса с помощью HEAD вместо любого другого метода
  2. Создать нескольких пауков одновременно, назначая им партии, такие как LIMIT 0,10000 иLIMIT 10000,10000
  3. В вашем конвейере данных вместо выполнения запроса MySQL DELETE каждый раз, когда скребок находит состояние 404, запускайте DELETE FROM table WHERE link IN(link1,link2) массовый запрос
  4. Я уверен, что у вас естьУКАЗАТЬ на ссылку столбца, если не добавить его
0 голосов
/ 25 октября 2018

Я бы предложил использовать scrapy, так как вы уже просматриваете каждый URL с помощью этого инструмента и, таким образом, знаете, какие URL выдают ошибки.Это означает, что вам не нужно проверять URL-адреса во второй раз.

Я бы сделал это примерно так:

  • Сохраните каждый ошибочный URL-адрес в отдельном списке / картесо счетчиком (который хранится между запусками).
  • Каждый раз, когда происходит ошибка URL, увеличивайте счетчик.Если это не так, уменьшите счетчик.
  • После запуска сценария Scrapy проверьте этот список / карту на наличие URL-адресов с достаточно высоким счетчиком - скажем, более 10 сбоев и удалите их - илисохраните их в отдельном списке ссылок, чтобы проверить их позже (например, если вы случайно удалили рабочий URL-адрес, потому что сервер слишком долго не работал) .

Поскольку ваш третийПуля обеспокоена тем, что Scrapy не справляется с результатами URL, то же самое можно сказать и о сайтах в целом.Если на сайте произошла ошибка с 1 попытки, это может означать, что ссылка не работает.

0 голосов
/ 25 октября 2018

Если вы собираетесь создать собственный скрипт проверки , это решение
Кроме того, я предлагаю оптимизировать систему, чтобы сделать иерархию в вашем хранилище URL.Если вы получаете 404 с одного из родительских URL-адресов, вы можете не проверять все дочерние URL-адреса

0 голосов
/ 25 октября 2018

Вы могли бы написать небольшой скрипт, который просто проверял бы возвращаемый статус http следующим образом:

for url in urls:
    try:
        urllib2.urlopen(url)
    except urllib2.HTTPError, e:
        # Do something when request fails
        print e.code

Это будет то же самое, что и ваш первый пункт.Вы также можете запустить этот асинхронный режим, чтобы оптимизировать время, необходимое для прохождения по ссылкам 700 000.

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