Какой лучший способ соскабливать данные с веб-сайта?

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

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

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

Ответ 1

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

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

Инструменты

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

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

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

Язык

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

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

Тяжелые сайты с поддержкой Javascript

В старые времена вам просто нужно было сделать HTTP-запрос и проанализировать ответ HTML. Теперь вам почти наверняка придется иметь дело с сайтами, которые представляют собой смесь стандартных HTTP-запросов/ответов HTTP и асинхронных HTTP-вызовов, выполненных частью javascript целевого сайта. Здесь очень удобно использовать прокси-программное обеспечение и вкладку сети firebug/devtools. Ответы на них могут быть 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, собственный код и двухстороннее взаимодействие со встроенным браузером.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Кто бы я написал эту гигантскую стену текста?

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

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

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

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

Ответ 2

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

Существуют различные возможности. Хорошее комбо использует python-requests (построено поверх вершины 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-like pyquery, lxml или что-то еще.

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

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

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

ps: посмотрите на scrapely: https://github.com/scrapy/scrapely

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