Во вторник я выступал на ленте Data Science London о футбольных данных и начал с того , что рассказал о некоторых уроках, которые я извлек из создания наборов данных для личного использования, когда открытые данные недоступны.
В этом случае вы часто в конечном итоге очищаете HTML-страницы для извлечения интересующих вас данных, а затем сохраняете их в файлах или в базе данных, если хотите быть более интересными.
В идеале мы хотим тратить время на то, чтобы поиграть с данными, а не собирать их, поэтому мы хотим свести этот этап к минимуму, что мы можем сделать, выполнив следующие правила:
Не строить гусеничный
Одна из самых заманчивых вещей — это создать сканер, который запускается на домашней странице и затем следует по некоторым или всем ссылкам, с которыми он сталкивается, загружая эти страницы по ходу работы.
Это невероятно отнимает много времени, и все же именно этот подход я выбрал, когда искал внутреннее кадровое приложение для моделирования консультантов / проектов ThoughtWorks в neo4j около 18 месяцев назад.
Ашок хотел получить те же данные через несколько месяцев, и вместо того, чтобы создать сканер, он потратил немного времени на понимание структуры URI нужных ему страниц, а затем составил список страниц для загрузки.
Ему потребовалось всего несколько минут, чтобы создать сценарий, который будет получать данные, тогда как я потратил много часов, используя подход на основе сканера.
Если нет заметной структуры URI или если вы хотите получить каждую страницу, подход к поиску может иметь смысл, но я стараюсь избегать его в качестве первого варианта.
Скачать файлы
Второе, что я узнал, это то, что использование Web Driver , nokogiri или live для живых веб-страниц с последующим сохранением только тех частей страницы, которые нас интересуют, является неоптимальным.
Мы оплачиваем стоимость сети каждый раз, когда запускаем скрипт, и в начале упражнения по сбору данных мы не будем точно знать, какие данные нам нужны, поэтому нам придется запускать их несколько раз, пока мы не получим их правильно ,
Гораздо быстрее загружать файлы на диск и работать с ними локально.
Используйте Wget
Потратив много времени на написание различных инструментов для загрузки набора данных ThoughtWorks, Ашок спросил меня, почему я вместо этого не использовал Wget.
Я не мог придумать вескую причину, поэтому теперь я предпочитаю составить список URI и позволить Wget позаботиться о том, чтобы загрузить их для нас. Например:
$ head -n 5 uris.txt https://www.some-made-up-place.com/page1.html https://www.some-made-up-place.com/page2.html https://www.some-made-up-place.com/page3.html https://www.some-made-up-place.com/page4.html https://www.some-made-up-place.com/page5.html $ cat uris.txt | time xargs wget ... Total wall clock time: 3.7s Downloaded: 60 files, 625K in 0.7s (870 KB/s) 3.73 real 0.03 user 0.09 sys
Если нам нужно ускорить процесс, мы всегда можем использовать флаг ‘-P’ для xargs:
cat uris.txt | time xargs -n1 -P10 wget 1.65 real 0.20 user 0.21 sys
При использовании таких инструментов стоит быть разумно разумным, и, конечно, прочитайте условия сайта, чтобы узнать, что они говорят о загрузке копий страниц для личного использования.
Учитывая, что вы в любом случае можете получить страницы с помощью веб-браузера, это нормально, но имеет смысл не бомбардировать сайт запросами для каждой отдельной страницы, а просто сосредоточиться на данных, которые вас интересуют.