Статьи

Не создавайте гусеничный механизм (если вы можете его избежать!)

Во вторник я выступал на ленте 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

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

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