Проблема производительности сборщика ссылок Python - PullRequest
0 голосов
/ 16 ноября 2011

Поэтому я пишу сборщики ссылок, чтобы найти новые ссылки на определенных сайтах для данной группы «начальных ссылок».

В настоящее время я использую Python / Beautiful Soup, чтобы добиться этого с приличным успехом.

У меня есть входной файл [для каждого сайта], из которого я строю список «начальных ссылок».

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

После того, как он собирает все указанные типы ссылок из каждой «начальной ссылки», я затем сравниваю этот список с «ранее собранным» списком, который я загружаю из файла. Затем я возвращаю разницу в другой список, который представляет собой список «новых ссылок», а также добавляю их в «ранее собранный» список ссылок.

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

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

Имеет ли смысл помогать ускорить получение новых ссылок, которые я планирую запускать каждые несколько дней?

В «ранее собранном» списке могло быть несколько сотен тысяч ссылок, поэтому я не был уверен, как это повлияет на выполнение этого сравнения снова и снова по сравнению с сохранением программы в тупом состоянии и всегда вспоминает все доступные ссылки.

У вас есть лучшее решение для всех вместе? Любой вклад очень ценится.

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Вы можете использовать полки Python, если вам нужна простая на диске постоянная хеш-таблица http://docs.python.org/library/shelve.html

0 голосов
/ 16 ноября 2011

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

Или, если вы поддерживаете и сохраняете фактическую хеш-таблицу найденных ссылок, вам не придется выполнять поиск и сравнение по списку, но вы будете иметь постоянный поиск по времени, чтобы узнать, видели ли выссылка на сайт.Полная таблица хешей будет стоить много памяти, если ваш список большой.

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