Каков наилучший способ очистки данных с веб-сайта? [закрытый]


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

Я нашел полезный сторонний инструмент под названием Import.io это обеспечивает функциональность click and go для очистки веб-страниц и создания наборов данных, единственное, что я хочу сохранить свои данные локально, и я не хочу подписываться на какие-либо планы подписки.

какие техника эта компания использует для очистки веб-страниц и построения их наборов данных? Я нашел некоторые веб-скребок рамки pjscrape & Scrapy могли бы они предоставить такую функцию

2 101

2 ответа:

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

Примечание: я использую термины ползание и выскабливание в основном взаимозаменяемы здесь. Это копия моего ответа на ваш вопрос Quora, это довольно длинный.

инструменты

познакомьтесь с инструментами Firebug или Chrome dev в зависимости от вашего предпочтительного браузера. Это будет абсолютно необходимо, когда вы просматриваете сайт, с которого вы извлекаете данные, и отображаете, какие URL-адреса содержат данные, которые вы ищете, и какие форматы данных составляют ответы.

вам понадобится хорошее рабочее знание HTTP, а также HTML и, вероятно, захотите найти достойный кусок человека в среднем прокси программное обеспечение. Вам нужно будет иметь возможность проверять HTTP-запросы и ответы и понимать, как передаются файлы cookie и информация о сеансе и параметры запроса. Скрипач (http://www.telerik.com/fiddler) и Чарльз Прокси (http://www.charlesproxy.com/) являются популярными инструментами. Я использую mitmproxy (http://mitmproxy.org/) много, как я больше клавиатуры парень, чем мышь парень.

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

язык

PHP в основном отсутствует, он не очень хорошо подходит для этой задачи, и поддержка библиотеки/фреймворка плохая в этой области. Python (Scrapy-отличная отправная точка) и Clojure/Clojurescript (невероятно мощный и продуктивный, но большой процесс обучения кривая) - отличные языки для этой проблемы. Поскольку вы предпочли бы не изучать новый язык, и вы уже знаете Javascript, я бы определенно предложил придерживаться JS. Я не использовал pjscrape, но это выглядит довольно хорошо от быстрого чтения их документов. Он хорошо подходит и реализует отличное решение проблемы, которую я описываю ниже.

примечание по регулярным выражениям: НЕ ИСПОЛЬЗУЙТЕ РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ ДЛЯ АНАЛИЗА HTML. Многие новички делают это, потому что они уже знакомы с регулярные выражения. Это огромная ошибка, используйте селекторы xpath или css для навигации по html и используйте только регулярные выражения для извлечения данных из фактического текста внутри html-узла. Это может быть уже очевидно для вас, это становится очевидным быстро, если вы попробуете это, но многие люди тратят много времени, идя по этой дороге по какой-то причине. Не бойтесь XPath или CSS селекторов, они намного проще в освоении, чем регулярные выражения, и они были разработаны, чтобы решить эту точную проблему.

Javascript-тяжелый сайты

в старые времена вам просто нужно было сделать http-запрос и проанализировать HTML-ответ. Теперь вам почти наверняка придется иметь дело с сайтами, которые представляют собой смесь стандартных HTTP-запросов/ответов HTML и асинхронных HTTP-вызовов, выполняемых частью javascript целевого сайта. Это где ваш прокси-сервера и на вкладке "Сеть" в Firebug/инструменты разработчика поставляется в очень удобно. Ответы на них могут быть html или json, в редких случаях они будут xml или что-то еще еще.

есть два подхода к этой проблеме:

подход низкого уровня:

вы можете выяснить, какие URL-адреса ajax вызывает сайт 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, ваш собственный код и двустороннее взаимодействие с процессом встроенного браузера.

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

ограничение скорости / поведение бота

вы должны быть очень осведомлены об этом. Вы должны делать запросы к вашим целевым доменам с разумной скоростью. Вы должны написать хорошо себя ведет бот при обходе веб-сайтов, а это означает уважение роботов.txt и не забивает сервер запросами. Ошибки или небрежность здесь очень неэтичны, так как это можно считать атакой отказа в обслуживании. Приемлемая скорость зависит от того, кого вы спрашиваете, 1req/s-это максимум, на котором работает Google crawler, но вы не Google, и вы, вероятно, не так приветствуетесь, как Google. Держите его так медленно, как разумно. Я бы предложил 2-5 секунд между каждым запросом страницы.

определите свои запросы с помощью строки агента пользователя, которая идентифицирует вашего бота и имеет веб-страницу для вашего бота, объясняющую это цель. Этот url-адрес входит в строку агента.

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

тестирование

Не модуль / интеграционный тест человек? Очень плохо. Теперь вам придется стать одним из них. Сайты часто меняются, и вы будете часто менять свой код. Это большая часть проблемы.

есть много движущихся частей, участвующих в выскабливании современного веб-сайта, хороший тест практика очень поможет. Многие из ошибок, с которыми вы столкнетесь при написании этого типа кода, будут типом, который просто возвращает поврежденные данные молча. Без хороших тестов для проверки регрессий вы обнаружите, что вы некоторое время сохраняли бесполезные поврежденные данные в своей базе данных, не замечая этого. Этот проект позволит вам очень хорошо ознакомиться с проверкой данных (найти несколько хороших библиотек для использования) и тестирования. Есть не так много других проблем, которые объединяют требующие комплексных испытаний и это очень трудно проверить.

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

вы также Хотите знать, если сайт изменился. Если они переработали сайт, и ваш искатель сломан, ваши модульные тесты все равно пройдут, потому что они работают с кэшированной копией! Вам понадобится либо другой, меньший набор интеграционных тестов, которые выполняются нечасто на реальном сайте, либо хорошее ведение журнала и обнаружение ошибок в вашем коде обхода, который регистрирует точные проблемы, предупреждает вас о проблеме и останавливает обход. Теперь вы можете обновить свой кэш, запустите модульные тесты и посмотрите, что вам нужно изменить.

Правовые Вопросы

закон здесь может быть немного опасно, если вы делаете глупые вещи. Если закон вмешивается, вы имеете дело с людьми, которые регулярно ссылаются на wget и curl как "инструменты взлома". Ты этого не хочешь.

этическая реальность ситуации заключается в том, что нет никакой разницы между использованием программного обеспечения браузера для запроса url и просмотра некоторых данных и использованием ваших собственных программное обеспечение для запроса url-адреса и просмотра некоторых данных. Google является крупнейшей компанией по соскобу в мире, и их любят за это. Идентификация вашего имени ботов в Агенте пользователя и открытость о целях и намерениях вашего веб-искателя поможет здесь, поскольку закон понимает, что такое Google. Если вы делаете что-то теневое, например, создаете поддельные учетные записи пользователей или получаете доступ к областям сайта, которые вы не должны (либо "заблокированы" роботами.txt или из - за какого-то эксплойта авторизации) тогда будет помните, что вы делаете что-то неэтичное и незнание закона технологии будет чрезвычайно опасно. Это нелепая ситуация, но она реальна.

Это буквально можно попробовать и построить новую поисковую систему на вверх и вверх, как честный гражданин, сделать ошибку или иметь ошибку в вашем программном обеспечении и рассматриваться как хакер. Не то, что вы хотите, учитывая текущую политическую реальность.

кто я такой, чтобы писать эту гигантскую стену текста так или иначе?

Я написал много веб-поиска кода в моей жизни. Я занимаюсь разработкой программного обеспечения для веб-сайтов уже более десяти лет в качестве консультанта, сотрудника и основателя стартапа. Первые дни писали Perl crawlers / scrapers и php-сайты. Когда мы внедряли скрытые iframes, загружая данные csv на веб-страницы, чтобы сделать ajax, прежде чем Джесси Джеймс Гарретт назвал его ajax, прежде чем XMLHTTPRequest был идеей. До jQuery, до json. Мне уже за 30, вот и все. видимо считается древним для этого дела.

Я написал крупномасштабные системы обхода/очистки дважды, один раз для большой команды в медиа-компании (в Perl) и недавно для небольшой команды в качестве технического директора запуска поисковой системы (в Python/Javascript). В настоящее время я работаю консультантом, в основном кодируя в Clojure/Clojurescript (замечательный экспертный язык в целом и имеет библиотеки, которые делают проблемы crawler/scraper восхитительными)

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

Мне нравится писать искатели, скребки и Парсеры больше, чем любой другой тип программного обеспечения. Это сложно, весело и может быть использовано для создания удивительных вещей.

Да, вы можете сделать это самостоятельно. Это просто вопрос захвата источников страницы и разбора их так, как вы хотите.

существуют различные возможности. Хорошая комбинация использует 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)

Я бы посоветовал начать собственное решение. Вы поймете преимущества Скрэпи, делая это.

ps: взгляните на scrapely: https://github.com/scrapy/scrapely

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