Ви, безумовно, захочете почати з хорошої веб-рамки для скребки. Згодом ви можете вирішити, що вони занадто обмежуючі, і ви можете зібрати власний стек бібліотек, але без великого досвіду вискоблювання ваш дизайн буде набагато гіршим, ніж піскрап або скрап.
Примітка. Тут я використовую терміни повзання та вискоблювання, які в основному є взаємозамінними. Це копія моєї відповіді на ваше питання Quora, вона досить довга.
Інструменти
Ознайомтеся з інструментами для розробки Firebug чи Chrome, залежно від бажаного веб-переглядача. Це буде абсолютно необхідним, коли ви переглядаєте веб-сайт, з якого витягуєте дані, і намічаєте, які URL-адреси містять шукані вами дані та які формати даних складають відповіді.
Вам знадобляться хороші знання про HTTP, а також HTML, і, ймовірно, захочеться знайти гідну частину людини в середньому програмному забезпеченні проксі. Вам потрібно буде мати можливість перевірити HTTP-запити та відповіді та зрозуміти, як передаються файли cookie та інформація про сеанси та параметри запитів. Фіддлер ( http://www.telerik.com/fiddler ) і Чарльз Проксі ( http://www.charlesproxy.com/ ) - популярні інструменти. Я багато використовую mitmproxy ( http://mitmproxy.org/ ), оскільки я більше клавіатура, ніж хлопець миші.
Якесь середовище консолі / оболонки / типу REPL, де ви можете спробувати різні фрагменти коду з миттєвим зворотним зв'язком, буде неоціненним. Зворотні інженерні завдання, такі, як це багато проб і помилок, тому вам потрібен робочий процес, що робить це просто.
Мова
PHP, як правило, не підходить для цього завдання, і підтримка бібліотеки / фреймворку в цій галузі погана. Python (Scrap - чудова відправна точка) та Clojure / Clojurescript (неймовірно потужний та продуктивний, але велика крива навчання) - чудові мови для цієї проблеми. Оскільки ви не хочете вивчати нову мову і вже знаєте Javascript, я б точно запропонував дотримуватися JS. Я не використовував pjscrape, але це дуже добре виглядає з швидкого читання їхніх документів. Він добре підходить і реалізує чудове рішення проблеми, яку я описую нижче.
Примітка щодо регулярних виразів: НЕ ВИКОРИСТОВУЙТЕ РЕГУЛЯРНІ ВИРАЗИ ДЛЯ РОЗРОБКИ HTML. Дуже багато початківців роблять це, тому що вони вже знайомі з регулярними виразами. Це величезна помилка, використовуйте селектори xpath або css для навігації по HTML і використовуйте лише регулярні вирази для отримання даних із фактичного тексту у вузлі html. Це може бути для вас вже очевидним, це стає очевидним швидко, якщо ви спробуєте це, але багато людей витрачають багато часу, йдучи по цій дорозі чомусь. Не лякайтесь селекторів xpath чи css, їх НАВЧАЛЬШЕ вивчити, ніж регулярні вирази, і вони були розроблені для вирішення цієї точної проблеми.
Сайти Javascript-важкі
За старих часів вам просто потрібно було зробити http-запит та проаналізувати відповідь HTML. Тепер вам майже напевно доведеться мати справу з сайтами, що представляють собою поєднання стандартних HTML-запитів HTTP-запитів / відповідей та асинхронних HTTP-дзвінків, зроблених частиною javascript цільового сайту. Ось тут дуже зручним є ваше проксі-програмне забезпечення та мережева вкладка firebug / devtools. Відповіді на них можуть бути html або вони можуть бути json, у рідкісних випадках вони будуть xml або щось інше.
Існує два підходи до цієї проблеми:
Підхід низького рівня:
Ви можете розібратися, як ajax URL-адреси викликає javascript на веб-сайті, і як виглядають ці відповіді, і зробити ці самі запити самостійно. Таким чином, ви можете витягнути html з http://example.com/foobar і витягти один фрагмент даних, а потім доведеться витягнути відповідь json з http://example.com/api/baz?foo=b ... отримати інший фрагмент даних. Вам потрібно буде знати про передачу правильних файлів cookie або параметрів сеансу. Це дуже рідко, але іноді деякі необхідні параметри для виклику ajax будуть результатом якогось шаленого розрахунку, зробленого в javascript сайту, зворотне проектування це може дратувати.
Підхід вбудованого браузера:
Чому вам потрібно розробити, які дані є в html та які дані надходять із дзвінка ajax? Управління всіма даними сеансу та файлів cookie? Вам не потрібно, коли ви переглядаєте сайт, це роблять браузер і javascript на сайті. У цьому вся суть.
Якщо ви просто завантажите сторінку в механізм безголового браузера, як Phantomjs, він завантажить сторінку, запустіть javascript і повідомить, коли всі виклики Ajax завершені. Ви можете ввести свій власний JavaScript, якщо необхідно, щоб викликати відповідні кліки або все, що необхідно для запуску javascript сайту для завантаження відповідних даних.
Тепер у вас є два варіанти: змусити його виплюнути готовий html та проаналізувати його або вставити якийсь javascript на сторінку, яка робить ваш розбір та форматування даних та виплює дані (можливо, у форматі json). Ви також можете вільно змішувати ці два варіанти.
Який підхід найкращий?
Це залежить, вам потрібно буде бути напевно знайомим та комфортним із підходом низького рівня. Підхід із вбудованим браузером працює на будь-що, це буде набагато простіше втілити, і зникнуть деякі найскладніші проблеми при вискоблюванні. Це також досить складна частина техніки, яку вам потрібно буде зрозуміти. Це не лише запити та відповіді HTTP, це запити, вбудована візуалізація браузера, javascript на сайті, введений javascript, власний код та двостороння взаємодія із вбудованим браузерним процесом.
Вбудований веб-переглядач також набагато повільніше за масштабами через рендеринг, але це майже точно не має значення, якщо ви не будете робити скрап багато різних доменів. Вам потрібно обмежити обмеження ваших запитів, зробить час візуалізації абсолютно незначним у випадку з одним доменом.
Обмеження швидкості / поведінка бота
Вам потрібно бути дуже в курсі цього. Потрібно робити запити до своїх цільових доменів за розумною швидкістю. Під час сканування веб-сайтів потрібно написати бота, який добре поводиться, а це означає поважати robots.txt і не забивати сервер запитами. Помилки або недбалість тут дуже неетичні, оскільки це можна вважати відмовою в нападі на службу. Прийнятна швидкість варіюється в залежності від того, кого ви запитуєте, 1req / s - це максимум, на якому працює гусеничний веб-сайт Google, але ви не Google, і ви, ймовірно, не так бажані, як Google. Тримайте це так само повільно, наскільки розумно. Я б запропонував 2-5 секунд між кожним запитом сторінки.
Визначте ваші запити за допомогою рядка агента користувача, який ідентифікує вашого бота та має веб-сторінку для вашого бота, пояснюючи його мету. Ця URL-адреса входить у рядок агента.
Вам буде легко заблокувати, якщо сайт захоче вас заблокувати. Розумний інженер з їхнього боку може легко визначити ботів, і кілька хвилин роботи над їхнім кінцем можуть призвести до того, що тижні роботи змінюють ваш код скребки на кінці або просто унеможливлюють його. Якщо відносини є антагоністичними, то розумний інженер на цільовій ділянці може повністю стиміювати геніального інженера, який пише гусеничному шасі. Код для вискоблювання за своєю суттю неміцний, і це легко експлуатується. Що-небудь, що спровокувало б цю відповідь, майже все одно неетично, тому пишіть добре поведеного бота і не хвилюйтеся з цього приводу.
Тестування
Не підрозділ / особа, що перевіряє інтеграцію? Дуже погано. Тепер вам доведеться стати таким. Сайти змінюються часто, і ви часто змінюватимете свій код. Це велика частина виклику.
У розробці сучасного веб-сайту є багато рухомих деталей, хороші методи тестування допоможуть дуже багато. Багато помилок, з якими ви будете стикатися під час написання цього типу коду, буде типом, який просто мовчки повертає пошкоджені дані. Без хороших тестів для перевірки регресії ви дізнаєтесь, що ви певний час зберігаєте марні пошкоджені дані у вашій базі даних, не помічаючи. Цей проект дозволить вам дуже добре ознайомитись з валідацією даних (знайти кілька хороших бібліотек для використання) та тестуванням. Існує не так багато інших проблем, які поєднують потребу в комплексних тестах і їх дуже важко перевірити.
Друга частина ваших тестів передбачає кешування та виявлення змін. Під час написання коду ви не хочете без жодного приводу забивати сервер для однієї і тієї ж сторінки. Під час виконання ваших тестів на одиниці ви хочете дізнатися, чи не вдалося провести тести через те, що ви зламали код або через те, що веб-сайт перероблений Запустіть тести свого приладу на кешованій копії відповідних URL-адрес. Тут є дуже корисним кешуючий проксі, але складний у налаштуванні та правильному використанні.
Ви також хочете дізнатися, чи змінився сайт. Якщо вони переробили веб-сайт, і ваш сканер порушений, ваші тестові блоки все одно пройдуть, оскільки вони працюють проти кешованої копії! Вам знадобиться або інший, менший набір тестів на інтеграцію, які нечасто виконуються на веб-сайті, що перебуває в реальному часі, або хороший журнал та виявлення помилок у коді сканування, який реєструє точні проблеми, попереджає про проблему та припиняє сканувати. Тепер ви можете оновити кеш, запустити свої тести на одиницю і побачити, що вам потрібно змінити.
Юридичні питання
Закон тут може бути трохи небезпечним, якщо ви робите дурні речі. Якщо закон втягується, ви маєте справу з людьми, які регулярно називають wget і curl "інструментами для злому". Ви цього не хочете.
Етична реальність ситуації полягає в тому, що немає різниці між використанням програмного забезпечення браузера для запиту URL-адреси та перегляду деяких даних та використанням власного програмного забезпечення для запиту URL-адреси та перегляду деяких даних. Google є найбільшою компанією зі скрабів у світі, і її люблять за це. Визначення імені ваших ботів у агенті користувача та відкритість щодо цілей та намірів веб-сканера допоможе тут, оскільки закон розуміє, що таке Google. Якщо ви робите що-небудь тінисте, наприклад створення підроблених облікових записів користувачів або доступ до ділянок сайту, які ви не повинні (або "заблоковані" роботом robots.txt, або через якесь використання авторизації), то майте на увазі, що ви робите щось неетичне і незнання закону технологій буде тут надзвичайно небезпечним. Це смішна ситуація, але реальна.
Буквально можна спробувати створити нову пошукову систему на постійній основі як громадянина, зробити помилку або помилку у вашому програмному забезпеченні та вважати хакером. Не те, що ви хочете, враховуючи поточну політичну реальність.
Хто я взагалі, щоб написати цю гігантську стінку тексту?
Я написав багато пов’язаних із веб-сканером кодів у своєму житті. Я вже більше десяти років займаюся розробкою програмного забезпечення, пов'язаного з Інтернетом, як консультант, працівник та засновник стартапу. Перші дні писали гусеничні сканери / скрепери та веб-сайти на php. Коли ми вставляли приховані iframes, завантажуючи дані CSV на веб-сторінки, щоб зробити ajax, перш ніж Джессі Джеймс Гарретт назвав його ajax, перш ніж XMLHTTPRequest був ідеєю. Перед jQuery, перед json. Я в середині 30-х, це, мабуть, вважається давнім для цієї справи.
Я два рази писав широкомасштабні системи сканування / скреблінгу, один раз для великої команди в медіа-компанії (в Перлі), а нещодавно для невеликої команди як керівник технічного обслуговування запуску пошукової системи (в Python / Javascript). Зараз я працюю консультантом, в основному кодую Clojure / Clojurescript (чудова спеціальна мова загалом і має бібліотеки, які викликають захоплення проблем із сканером / скреперами)
Я також написав успішні програмні системи проти сканування. Написати надзвичайно прості сайти, які не можна скасувати, надзвичайно просто, якщо ви хочете або ідентифікуєте та диверсійні боти, які вам не подобаються.
Мені подобається писати сканери, скребки та аналізатори більше, ніж будь-який інший тип програмного забезпечення. Це складно, весело і може використовуватися для створення дивовижних речей.