Вам не хватает некоторых предметов.
Местная ссылка может начинаться с /
, но она также может начинаться с .
, ..
или даже без специального символа, то есть ссылка находится в текущем каталоге.
JavaScript также может использоваться как ссылка, поэтому вам нужно будет искать по всему документу и находить теги, используемые в качестве кнопок, а затем анализировать URL-адрес.
Это:
links = nf.xpath '//a' #find all links on current page
main_links = links.map{|l| l['href'] if l['href'] =~ /^\//}.compact.uniq
может быть лучше написано:
links.search('a[href^="/"]').map{ |a| a['href'] }.uniq
В общем, не делайте этого:
....map{|l| l['href'] if l['href'] =~ /^\//}.compact.uniq
, потому что это очень неудобно. Условное значение в map
приводит к nil
элементам в результирующем массиве, поэтому не делайте этого. Используйте select
или reject
, чтобы уменьшить набор ссылок, соответствующих вашим критериям, а затем используйте map
, чтобы преобразовать их. При использовании здесь предварительная фильтрация с использованием ^=
в CSS делает его еще проще.
Не храните ссылки в памяти. Вы потеряете весь прогресс, если вы нарушите или остановите свой код. Вместо этого, как минимум, используйте что-то вроде базы данных SQLite на диске в качестве хранилища данных. Создайте поле «href», которое уникально, чтобы избежать многократного попадания на ту же страницу.
Используйте встроенный URI-класс Ruby или Addressable gem для анализа и обработки URL-адресов. Они сохраняют вашу работу и будут делать все правильно, когда вы начнете кодирование/декодирование запросов и попытаетесь нормализовать параметры, чтобы проверить уникальность, извлечение и управление путями и т. Д.
Многие сайты используют идентификаторы сеанса в запросе URL для идентификации посетителя.Этот идентификатор может сделать каждую ссылку разной, если вы начнете, затем остановитесь, затем запустите снова или если вы не вернете файлы cookie, полученные с сайта, так что вам нужно вернуть файлы cookie и выяснить, какие параметры запроса значительны, и какие собираются сбросить ваш код. Сохраните первый и выбросьте второй, когда вы храните ссылки для последующего анализа.
Используйте HTTP-клиент, такой как Typhoeus with Hydra, для одновременного получения нескольких страниц и сохранения их в своей базе данных с помощью отдельного процесса, который анализирует их и передает URL-адреса для анализа в базу данных. Это может существенно повлиять на общее время обработки.
Почитайте файл robots.txt сайта и подавите ваши запросы, чтобы избежать избиения своего сервера. Никто не любит полосчатые свиньи и потребляет значительную часть пропускной способности сайта или времени процессора без разрешения - это хороший способ, чтобы его заметили, а затем запретили. В этот момент ваш сайт достигнет нулевой пропускной способности.
В чем вопрос? Как отслеживать посещаемые ссылки? – pguardiario
Не пишите свой собственный веб-искатель. Есть много хороших, на выбор. –