Отримання даних із веб-сторінки стабільним та ефективним способом


11

Нещодавно я дізнався, що використання регулярного вираження для розбору HTML веб-сайту для отримання потрібних даних - не найкращий спосіб дії.

Отже, моє запитання просте: що тоді найкращий / найефективніший і загалом стабільний спосіб отримати ці дані?

Зазначу, що:

  • API не існує
  • Немає іншого джерела, з якого я можу отримати дані (немає баз даних, каналів тощо)
  • Немає доступу до вихідних файлів. (Дані з загальнодоступних веб-сайтів)
  • Скажімо, дані - це звичайний текст, відображений у таблиці на html-сторінці

Наразі я використовую python для свого проекту, але мовне незалежне рішення / поради було б непогано.

Як побічне запитання: як би ви це зробили, коли веб-сторінку створено за допомогою дзвінків Ajax?

Редагувати:

Що стосується розбору HTML, я знаю, що немає фактичного стабільного способу отримання даних. Як тільки сторінка змінюється, ваш аналізатор робиться для. Що я маю на увазі під стабільним в цьому випадку, це: ефективний спосіб розбору сторінки, який завжди дає мені однакові результати (для того ж набору даних очевидно) за умови, що сторінка не змінюється.


8
Не існує стабільного способу, незалежно від того, як ви реалізуєте свій скребок, він може легко зламатися простою зміною веб-сторінки. Стабільний спосіб отримати ваші дані - зв’язатися з авторами даних та укласти посередник, щоб отримати дані у здоровому форматі. Іноді це навіть не коштує грошей.
Йоахім Зауер

1
@JoachimSauer - на питання все ще можна відповісти «найкращим» методом.
Анонім

Оскільки більшість веб-сайтів динамічні і зберігають свої дані в базах даних, найкращим способом є отримання бази даних з веб-сайту. Якщо веб-сайт має API, ви можете ним скористатися. Якщо ви хочете скребти статичні сторінки, тоді вбудовані модулі urllib Python та HTMLParser добре працюють. Кілька пакунків для скребкування HTML також доступні в PyPi.
Ubermensch

Скребкування сайтів - шалений бізнес. Насправді немає стабільного способу зробити це, оскільки власники сайтів цього не хочуть, а галузь у цілому намагається зупинити людей від цього.
Стівен Еверс

1
Можливо, вбудуйте веб-браузер, такий як Webkit, а потім використовуйте сценарій DOM, щоб отримати інформацію зі сторінки, що надається? Майже кожна платформа може це зробити, але ось як би ви це зробили в Qt: doc.qt.nokia.com/4.7-snapshot/qtwebkit-bridge.html
user16764

Відповіді:


2

Ну ось мої 2 копійки:

Якщо AJAX не задіяний, або його можна легко очистити, "виправити" HTML до XHTML (використовуючи, наприклад, HTMLTidy), а потім використовуйте XPath замість регулярних виразів для отримання інформації.
На добре структурованій веб-сторінці логічно відокремлені сукупності інформації знаходяться в різних <div>s або будь-яких інших тегах, що означає, що ви зможете легко знайти потрібну інформацію за допомогою простого вираження XPath. Це чудово ще й тому, що ви можете протестувати його, скажімо, на консолі Chrome або на консолі розробника Firefox і перевірити, чи працює він, перш ніж записати навіть один рядок іншого коду.
Цей підхід також має дуже високе співвідношення сигнал / шум, оскільки зазвичай вирази для вибору відповідної інформації будуть однолінійними. Вони також легше читати, ніж звичайні вирази, і створені для цього.

Якщо на сторінці задіяні AJAX та серйозні JavaScript, вставте компонент браузера в додаток і використовуйте його DOM для запуску необхідних подій та XPath для отримання інформації. Тут є багато хороших компонентів для вбудовування браузера, більшість з яких використовують браузери в реальному часі під кришкою, що добре, оскільки веб-сторінка може бути неправильним (X) HTML, але все-таки добре підходить для всіх основних браузерів ( насправді більшість сторінок врешті-решт виходять таким чином).


Дякую, я обов'язково ще раз погляну на XPath. Я не звик працювати з цим, тому це буде приємно вчитися. +1 :)
Майк

5

На мій досвід, використовуючи середовище .NET, ви можете скористатися HTML Agility Pack .

Якщо сторінка відформатована як XHTML, ви також можете використовувати звичайний аналізатор XML. Тут є багато для будь-якого середовища, яке ви можете собі уявити.

Для побічного питання про AJAX ви можете використовувати звичайний мережевий код HTTP, щоб отримати дані та проаналізувати їх.

Знову ж, якщо ваш стек AJAX поверне XML, ви отримаєте безліч варіантів. Якщо він повертає JSON, розгляньте бібліотеку, яка дозволяє відображати потік на набрані об'єкти. У .NET я пропоную вам Newtonsoft.Json .


І під «мережевим кодом HTTP» ви маєте на увазі фіксацію відповіді сервера під час запиту? Дякую за запропоновані пропозиції, я обов'язково звернусь до них. +1
Майк

Саме так. У .NET ви можете використовувати System.Net.WebClient або бібліотеку на зразок RestSharp | restsharp.org . Я використовував його також на Mono для Droid.
gsscoder

4

Розбір HTML - не зовсім тривіальне завдання, оскільки доводиться стикатися з можливо неправильною розміткою (суп з тегами). Протягом багатьох років браузери впроваджували більш-менш одну і ту ж стратегію боротьби з помилками, і цей алгоритм був закреслений у специфікації HTML5 (так, специфікація HTML5 визначає, що робити з речами, які не є HTML5).

Це бібліотеки для всіх основних мов для розбору HTML, наприклад, цієї .

У будь-якому випадку те, що ви отримаєте, не є стабільним в жодному сенсі. Щоразу, коли змінюється формат веб-сторінки, ви повинні адаптувати свій скребок.


Дякую, я використовував Beautiful Soup, щоб виконати роботу. Я знаю, що це не буде стабільним, я, мабуть, повинен уточнити це у своїх питаннях. +1 для вас :)
Майк

4

Як побічне запитання: як би ви це зробили, коли веб-сторінку створено за допомогою дзвінків Ajax?

Якщо здійснюються дзвінки ajax, то, швидше за все, це або якийсь POST, або GET URL з деякими змінними.

Я вивчив би JavaScript, щоб дізнатися, що таке кінцеві точки та параметри. Після цього дуже ймовірно, що або повернені дані є json / xml / звичайний текст, або, можливо, частковий html.

Як тільки ви дізнаєтесь вищевказану інформацію, ви просто зробите GET або POST-запит до цієї кінцевої точки та проаналізуєте повернені дані.


2
Варто відзначити , що багато послуг огляньте HTTP заголовки , щоб забезпечити HTTP_X_REQUESTED_WITHце XMLHttpRequest. Хороші також застосовуватимуть якийсь захист XSRF для POST-запитів, тому вам знадобиться і цей чарівний файл cookie. Клацання кінцевих точок AJAX, ненавмисно не підданих деяким громадським API, відчуває мене трохи прискіпливо, і ваш скрепер так само схильний до поломки, якщо вихід (або запит політики) зміниться.
Тім Пост

@TimPost ви на 100% правильні. Я погоджуюсь з її "вигадливим" дійсно :), але за відсутності будь-якого публічного API, потреби повинні ..
Darknight

Я міг би використати це у власному додатку на AJAX (і під "власною", я не маю на увазі, що я написав це, але налаштування моє), але це не буде правильним, щоб спробувати обійти систему іншого сервера, тому я повинен погодитися з @ Тимпост, він відчуває себе "придуркованим". Але це гарна ідея, дякую! +1!
Майк

1

Не існує стабільного або кращого способу зробити це, веб-сторінки HTML не були зроблені для маніпулювання комп'ютерами. Він призначений для користувачів, але якщо вам це потрібно зробити, я пропоную використовувати браузер і трохи javascript. У своїй роботі я брав участь у проекті, який потребує отримання деякої інформації з сторонніх сайтів. Додаток було розроблено як розширення для Chrome. Логіка програми пишеться за допомогою JavaScript, який вводиться на сайт після завершення завантаження сторінки. Витягнуті дані надсилаються в базу даних через http-сервер. Це не найкращий підхід, але він працює. Пс: Власник сайту уповноважив нас робити таке.


Я знаю, що HTML-сторінки не повинні були розбиратися комп'ютерами, але іноді просто немає іншого варіанту. Крім того, я використовую загальнодоступну інформацію для особистого проекту, який ні в якому разі не є комерційним, я не думаю, що мені потрібна чітка авторизація, чи не так? Дякуємо за ваш внесок! +1 теж для вас;)
Майк

@MikeHeremans Щоб дізнатися, чи маєте ви право отримувати інформацію з веб-сайту, прочитайте ToS та robots.txt. Якщо обидва не позбавляють вас права автоматично викреслювати інформацію, ви, мабуть, у більшості випадків повинні бути нормально законними. Звичайно, IANAL ...
К.Стефф

Якщо ви хочете побачити код згаданого проекту: code.google.com/p/acao-toolkit/source/browse/… . Перевірте content_script.js, це код, який вводиться на сторінку.
nohros
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.