Який найкращий спосіб скреблінгу даних з веб-сайту? [зачинено]


107

Мені потрібно витягнути вміст з веб-сайту, але програма не забезпечує жодного інтерфейсу програмування додатків чи іншого механізму для програмного доступу до цих даних.

Я знайшов корисний сторонній інструмент під назвою Import.io, який забезпечує функцію клацання та переходу для скребки веб-сторінок і створення наборів даних, єдине, що я хочу зберігати свої дані локально, і я не хочу підписуватися на будь-які плани підписки .

Яку техніку використовує ця компанія для скребтування веб-сторінок та створення своїх наборів даних? Я виявив, що деякі веб-схеми для скребки pjscrape & Scrapy можуть вони забезпечити таку особливість


4
PHP, безумовно, не підлягає сумніву, очевидно, неправильно, очевидно. gist.github.com/krakjoe/b1526fcc828621e840cb
Joe Watkins

@JoeWatkins, який виглядає дійсно круто, чи потрібна спеціальна конфігурація PHP для запуску? І як забезпечується виконання у порівнянні з інструментами / мовами, наведеними нижче?
0x1ad2

1
Для цього потрібна безпечна збірка PHP та pthreads, читайте github.com/krakjoe/pthreads/blob/master/README.md , ви можете знайти мене в чаті, якщо вам потрібна допомога, мені чи комусь іншому :)
Joe Watkins

@ 0x1ad2 Якщо ви хочете зберігати дані локально, тоді слід спробувати програмне забезпечення ( datascraping.co ) замість веб-API. Більшість інструментів використовують Xpath, CSS-селектор та REGEX для отримання даних із веб-сайтів та Data Scraping Studio, які підтримують усі ці 3 функції.
Вікаш Реті

Є два способи, один - розгорнути свою власну, використовуючи безкоштовні бібліотеки з відкритим кодом, що вимагає великих зусиль. Ви можете буквально генерувати веб-сканер ajax для будь-якого веб-сайту за допомогою scrape.it Це платний інструмент, але він працював, коли ні вільні інструменти, такі як import.io, ні кімоно, не могли надавати.
Я люблю Пітона

Відповіді:


271

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

Примітка. Тут я використовую терміни повзання та вискоблювання, які в основному є взаємозамінними. Це копія моєї відповіді на ваше питання 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 (чудова спеціальна мова загалом і має бібліотеки, які викликають захоплення проблем із сканером / скреперами)

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

Мені подобається писати сканери, скребки та аналізатори більше, ніж будь-який інший тип програмного забезпечення. Це складно, весело і може використовуватися для створення дивовижних речей.


4
Раніше я погоджувався з вами про те, що PHP є поганим вибором, але з правильними бібліотеками це не дуже погано. Регекс та масив / маніпулювання жалом незграбні, але з позитивного боку це швидко і скрізь.
pguardiario

3
У середовищі, де є декілька бібліотек, які роблять це задоволенням і багато, що робить його досить простим і досить простим ... чому б ти погодився з "не надто поганим". Я погоджуюсь, це можливо в PHP (і FORTRAN, C, VB тощо), але якщо ваша проблема справді не дуже проста, тоді було б набагато кращою ідеєю використовувати правильні інструменти для роботи. І знову, якщо у вас є неймовірно проста проблема вирішити ... що має значення, що регулярний вираз є скрізь? Встановити бібліотеки набагато простіше, ніж майже кожну проблему скреблінгу. Насправді, регулярно виражається ця проблема досить повільно.
Джессі Шерлок

5
Ви можете мати рацію, але я знаю, що я не можу зробити це так легко в PHP. До того, як я відійшов від PHP, у мене було близько десятиліття професійного досвіду PHP. Я витратив більше року на повний робочий день, будуючи скребкову систему в масштабі, в Python, і я не уявляю, як обійтися без деяких приємних бібліотек, які недоступні в PHP або обходиться без стислих методів метапрограмування, доступних в Python . Це також причина, що я переїхав до Clojure, щоб отримати ще більш потужні можливості метапрограмування.
Джессі Шерлок

4
Enlive, разом із потужністю самого Clojure для конкретного коду проекту, є найбільшими переможцями. Схема - це чудова бібліотека перевірки, яка є такою великою частиною коду вилучення інформації. На даний момент я дуже задоволений легким взаємодією зі світом Java для таких речей, як Mahout, а також Nashorn / Rhino для деяких видів виконання js. А люди Clojure - це типи, які пишуть лайки, як цей github.com/shriphani/subotai, так що вам не доведеться цього робити. ... продовжено в наступному коментарі ...
Джессі Шерлок

3
Я також виявив, що коли вам справді потрібен справжній браузер і вам потрібно перейти з phantomjs / casperjs, це дійсно чудово використовувати clojurescript (часто код, що ділиться між clj і cljs за допомогою cljx), щоб написати js, який ви вводите на сторінку замість clojurescript . Core.async чудово підходить для узгодження кодекційного сканування коду на сервері, а також для виходу з пекельного зворотного виклику всередині середовища js (координування автоматизації браузера з кодом core.async cljs всередині phantomjs є небесним порівняно з альтернативами).
Джессі Шерлок

21

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

Існують різні можливості. Хорошим комбо є використання python-запитів (побудований поверх urllib2, він знаходиться urllib.requestв Python3) та BeautifulSoup4 , який має методи вибору елементів, а також дозволяє CSS-селектори :

import requests
from BeautifulSoup4 import BeautifulSoup as bs
request = requests.get("http://foo.bar")
soup = bs(request.text) 
some_elements = soup.find_all("div", class_="myCssClass")

Деякі віддають перевагу xpath синтаксичному чи jquery-подібному pyquery, lxml чи іншому .

Коли потрібні дані створюються деяким JavaScript , вищезазначене не працюватиме. Вам або потрібен пітон-привид, або Селен. Я вважаю за краще останнє в поєднанні з PhantomJS , набагато легшим і простішим в монтажі, і простим у використанні:

from selenium import webdriver
client = webdriver.PhantomJS()
client.get("http://foo")
soup = bs(client.page_source)

Я б радив розпочати власне рішення. Ви зрозумієте переваги Scrap, роблячи це.

ps: погляньте на scrapely: https://github.com/scrapy/scrapely

pps: погляньте на Portia, щоб почати витягувати інформацію візуально, не знаючи програмування: https://github.com/scrapinghub/portia


Добре спасибі за негідника, єдина проблема полягає в тому, що Python не в моєму наборі навичок. Чи є інші хороші мови програмування, які можуть виконувати ті самі завдання? Я в основному працюю з PHP та Javascript.
0x1ad2

Вибачте за плутанину (я згадував рамку Python у своєму питанні), але якщо Python - це найкращий спосіб зробити це, я міг би це навчитися.
0x1ad2

Python робить скрапію дуже легкою. Це також легко навчитися. Найкращий скрепер, який на даний момент добре працює, - це скрап. Вони також мають дуже гарну документацію.
Абхішек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.