Рубрики
Без рубрики

Web Scraping 101 в Python

В этом посте, который можно прочитать как продолжение нашего окончательного руководства по скрепингу, мы рассмотрим Almo … Tagged с Python, Scrapeing, Rucioterial, Beginters.

Python Web Scraping (4 серии деталей)

В этом посте, который можно прочитать как продолжение нашего Ultimate Web Scraping Guide , мы рассмотрим почти все инструменты Python, предлагая вам веб -скрас. Мы перейдем от более простого к самому продвинутому и покроем плюсы и минусы каждого. Конечно, мы не сможем охватить все аспекты каждого инструмента, который мы обсуждаем, но этого поста должно быть достаточно, чтобы иметь хорошее представление о том, какие инструменты делают, и когда использовать какие.

Примечание. Когда я говорю о Python в этом сообщении в блоге, вы должны предположить, что я говорю о Python3.

Таблица контента:

  • 0) Веб -основы
  • 1) Открытие гнезда вручную и отправка HTTP -запроса
  • 2) urllib3 & lxml
  • 3) Запросы и Beautifulsoup
  • 4) Скрара
  • 5) Selenium & Chrome – безголов
  • Вывод

Интернет Действительно сложный : Есть много основных технологий и концепций, связанных с просмотром простой веб -страницы в вашем браузере. У меня нет претензий, чтобы все объяснить, но я покажу вам самые важные вещи, которые вы должны понять, чтобы извлечь данные из Интернета.

Протокол передачи гипертекста

HTTP использует Клиент/сервер Модель, где клиент HTTP (браузер, ваша программа Python, Curl, запросы …) открывает соединение и отправляет сообщение («Я хочу увидеть эту страницу:/продукт») на HTTP -сервер (Nginx, Apache..).

Затем сервер отвечает ответом (например, код HTML) и закрывает соединение. HTTP называется протоколом без состояния, потому что каждая транзакция (запрос/ответ) является независимой. FTP, например, Statelupl.

По сути, когда вы вводите адрес веб -сайта в своем браузере, HTTP -запрос выглядит так:

В первой строке этого запроса вы можете увидеть множество вещей:

  • используется глагол или метод, что означает, что мы запрашиваем данные по конкретному пути: /продукт/ . Есть другие глаголы HTTP, вы можете увидеть полный список Здесь Анкет
  • Версия протокола HTTP, в этом уроке мы сосредоточимся на http 1.
  • Многочисленные полки заголовок

Вот самые важные поля заголовка:

  • Хост: Доменное имя сервера, если не указан номер порта, предполагается, что составляет 80* Анкет *
  • Пользовательский агент: Содержит информацию о клиенте, создавающем запрос, включая информацию о ОС. В этом случае это мой веб-браузер (Chrome), на OSX. Этот заголовок важен, потому что он либо используется для статистики (сколько пользователей посещают мой веб -сайт на рабочем столе Mobile vs), либо для предотвращения каких -либо нарушений ботов. Поскольку эти заголовки отправляются клиентами, его можно изменить (это называется «подделка заголовков»), и это именно то, что мы будем делать с нашими скребками, чтобы наши скребки выглядели как обычный веб -браузер.
  • Принять: Типы контента, которые приемлемы в качестве ответа. Есть много разных типов контента и подтипов: Text/plain, text/html, image/jpeg, application/json
  • Cookie : … Это поле заголовка содержит список пар именных значений. Он называется сеансом cookie, они используются для хранения данных. Файлы cookie – это то, что веб -сайты используют для аутентификации пользователей, и/или хранить данные в вашем браузере. Например, когда вы заполняете форму входа в систему, сервер проверит, правильно ли введенные вами учетные данные, если это так, он перенаправляет вас и введет файл cookie сеанса в ваш браузер. Ваш браузер отправит этот файл cookie с каждым последующим запросом на этот сервер.
  • Реферат : Заголовок реферала содержит URL -адрес, из которого был запрошен фактический URL. Этот заголовок важен, потому что веб -сайты используют этот заголовок, чтобы изменить свое поведение в зависимости от того, откуда пришел пользователь. Например, многие новостные сайты имеют платную подписку и позволяют вам просмотреть только 10% от поста, но если пользователь пришел от агрегатора новостей, такого как Reddit, он позволяет вам просматривать полный контент. Они используют реферера, чтобы проверить это. Иногда нам приходится подделать этот заголовок, чтобы добраться до контента, который мы хотим извлечь.

И список можно продолжить … Вы можете найти полный список заголовков Здесь Анкет

Сервер ответит чем -то вроде этого:

На первой строке у нас есть новая информация, HTTP -код 200 ОК Анкет Это означает, что запрос преуспел. Что касается заголовков запроса, то существует множество кодов HTTP, разделенных на четыре общих класса, 2xx для успешных запросов, 3xx для перенаправления, 4xx для плохих запросов (наиболее известный – 404 не найден) и 5xx для ошибок сервера.

Затем, если вы отправляете этот HTTP -запрос со своим веб -браузером, браузер проанализирует HTML -код, принесет все возможные активы (файлы JavaScript, файлы CSS, изображения …), и он приведет к результату в главном окне Анкет

В следующих частях мы увидим различные способы выполнения HTTP -запросов с помощью Python и извлечения данных, которые мы хотим из ответов.

Разъем

Самый простой способ выполнить HTTP -запрос в Python – это открыть сокет и вручную отправить HTTP -запрос.

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

Обычные выражения

Регулярное выражение (re или regex) является шаблоном поиска строк. С помощью Regex вы можете искать конкретного символа/слова внутри более крупного текса.

Например, вы можете определить все номера телефонов на веб -странице. Например, вы также можете заменить элементы, вы можете заменить все прописные теги в плохо отформатированном HTML на нижние регистра. Вы также можете проверить некоторые входы …

Установка, используемая режимом, применяется слева направо. Каждый символ источника используется только один раз. Вам может быть интересно, почему важно знать о регулярных выражениях при соскобке в Интернете?

В конце концов, существует все различные модуль Python для разбора HTML, с XPath, селекторами CSS.

В идеале Семантический мир, Данные легко читаемые, информация встроена в соответствующий элемент HTML, с значимыми атрибутами.

Но реальный мир грязный, вы часто найдете огромное количество текста внутри элемента P. Если вы хотите извлечь конкретные данные в этот огромный текст, например, цену, дату, имя … вам придется использовать регулярные выражения.

Примечание: Вот отличный веб -сайт, чтобы проверить вашу корпорацию: https://regex101.com/ и Один потрясающий блог Чтобы узнать больше о них, этот пост будет охватывать лишь небольшую часть того, что вы можете сделать с помощью Regexp.

Регулярные выражения могут быть полезны, когда у вас есть такие данные:

Price : 19.99$

Мы могли бы выбрать этот текстовый узел с выражением XPath, а затем использовать такую репутацию для извлечения цены:

^Price\s:\s(\d+\.\d{2})\$

Чтобы извлечь текст в тег HTML, это раздражает использование регуляции, но выполнимо:

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

Отказ от ответственности : Легко потеряться во вселенной Урллиб в Python. У вас есть Urllib и urllib2, которые являются частями стандартной LIB. Вы также можете найти urllib3. Urllib2 был разделен на несколько модулей в Python 3, и Urllib3 не должен быть частью стандартной LIB в ближайшее время. Вся эта запутанная вещь станет предметом блога само по себе. В этой части я сделал выбор, чтобы поговорить только о URLLIB3, поскольку он широко используется в мире Python, PIP и просьба назвать только их.

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

Гораздо более краткий, чем версия сокета. Мало того, но API прост, и вы можете легко сделать много вещей, например, добавление заголовков HTTP, использование прокси, публикация форм …

Например, если бы мы решили установить некоторые заголовки и использовать прокси, нам пришлось бы только сделать это.

Видеть? Точно так же количество линий, однако, есть некоторые вещи, с которыми Urllib3 не очень легко справляется, например, если мы хотим добавить файл cookie, мы должны вручную создать соответствующие заголовки и добавить его в запрос.

Есть также вещи, которые Urllib3 может сделать, что не могут, создание и управление пулом и прокси -пулом, например, контроль стратегии повторения.

Проще говоря, Urllib3 находится между запросами и сокетом с точки зрения абстракции, хотя намного ближе к запросам, чем сокет.

На этот раз, чтобы проанализировать ответ, мы собираемся использовать пакет LXML и выражения XPATH.

Xpath

XPath- это технология, которая использует выражения пути для выбора узлов или узлов в документе XML (или HTML документа). Как и в случае с объектной моделью документа, XPath является стандартом W3C с 1999 года. Даже если XPath сам по себе не является языком программирования, он позволяет писать выражение, которое может получить доступ непосредственно к определенному узлу или определенному набору узла, без необходимости проходить все дерево HTML (или дерево XML).

Думайте о xpath как о повторной экспозиции, но специально для XML/HTML.

Для извлечения данных из HTML -документа с XPath нам нужны 3 вещи:

  • HTML -документ
  • Некоторые выражения XPath
  • двигатель XPath, который будет запускать эти выражения

Для начала мы будем использовать HTML, который мы получили благодаря Urllib3, мы просто хотим извлечь все ссылки с домашней страницы Google, поэтому мы будем использовать одно простое выражение XPath: //а И мы будем использовать LXML для его запуска. LXML – это быстро и простая в использовании библиотеки обработки XML и HTML, которая поддерживает XPath.

Установка :

pip install lxml

Ниже приведен код, который появляется сразу после предыдущего фрагмента:

И выход должен выглядеть так:

Вы должны помнить, что этот пример действительно действительно прост и не показывает вам, насколько мощным может быть XPath (Примечание: это выражение XPath должно было быть изменено на //a/@href Чтобы избежать необходимости итерации на Ссылки получить их href )

Если вы хотите узнать больше о XPath, вы можете прочитать это хорошее введение Анкет Документация LXML также Хорошо написано и является хорошей отправной точкой .

Выражения XPath, такие как REGEXP, действительно являются мощными, и один из самых быстрых способов извлечения информации из HTML, и, как и REGEXP, XPath может быстро стать грязным, трудно читать и трудно поддерживать.

Запросы является пакетом King of Python, с более чем 11 000 000 загрузок, это самый широко используемый пакет для Python.

Установка:

pip install requests

Сделать запрос с запросами (без комментариев) действительно просто:

С помощью запросов легко выполнить запросы на почту, обрабатывать файлы cookie, параметры запроса …

Аутентификация Hacker News

Допустим, мы хотим создать инструмент для автоматического отправки нашего сообщения в блоге на Hacker News или любые другие форумы, такие как Buffer. Нам нужно будет аутентификация на эти веб -сайты, прежде чем публиковать нашу ссылку. Это то, что мы собираемся сделать с запросами и Beautifulsoup!

Вот форма входа в новостные новости и связанный с этим DOM:

Есть три ** Теги В этой форме у первого есть тип, спрятанный с именем «goto», и эти два других – имя пользователя и пароль.

Если вы отправите форму в своем Chrome Browser, вы увидите, что многое происходит: перенаправление и файл cookie. Этот cookie будет отправлен Chrome по каждому последующему запросу, чтобы сервер знал, что вы аутентифицированы.

Делать это с помощью запросов легко, он автоматически обрабатывает перенаправление для нас, и обработка файлов cookie может быть сделана с помощью Сессия объект.

Следующее, что нам понадобится, это BeautifulSoup, которая представляет собой библиотеку Python, которая поможет нам анализировать HTML, возвращаемый сервером, чтобы выяснить, вошли ли мы или нет.

Установка:

pip install beautifulsoup4

Поэтому все, что нам нужно сделать, это опубликовать эти три входных данных с нашими учетными данными в конечную точку/вход и проверить наличие элемента, который отображается только после входа в систему:

Чтобы узнать больше о BeautifulSoup, мы могли бы попытаться извлечь все ссылки на домашней странице.

Кстати, Hacker News предлагает Мощный API Итак, мы делаем это в качестве примера, но вы должны использовать API вместо того, чтобы соскрести его!

Первое, что нам нужно сделать, это проверить домашнюю страницу Hacker News, чтобы понять структуру и различные классы CSS, которые нам придется выбрать:

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

links = soup.findAll('tr', class_='athing')

Затем для каждой ссылки мы извлеките его идентификатор, заголовок, URL и ранги:

Как вы видели, запросы и BeautifulSoup – отличные библиотеки для извлечения данных и автоматизации различных вещей, размещая формы. Если вы хотите выполнять крупномасштабные проекты по цене веб-сети, вы все равно можете использовать запросы, но вам нужно будет справиться с множеством вещей самостоятельно.

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

  • Поиск способа параллелизации вашего кода, чтобы сделать его быстрее
  • Ошибка обработки
  • хранение результата
  • результат фильтрации
  • Дроить ваш запрос, чтобы не загружать сервер

К счастью для нас, существуют инструменты, которые могут справиться с этими вещами для нас.

Scrapy – это мощная рамка скребования Python. Он предоставляет много функций для загрузки веб -страниц асинхронно, обработки и сохранения. Он обрабатывает многопользовательский, ползание (процесс перехода от ссылок на ссылки, чтобы найти все URL -адреса на веб -сайте), ползание Sitemap и многое другое.

Scrapy также имеет интерактивный режим, называемый Scrapy Shell. С Scrapy Shell вы можете очень быстро проверить код скребки, например, выражение XPath или селекторы CSS.

Недостатком скраски является то, что кривая обучения крутая, есть чему поучиться.

Чтобы продолжить наш пример о Hacker News, мы собираемся написать паук скраски, который соскребает первые 15 страниц результатов, и сохраняет все в файле CSV.

Вы можете легко установить скрапу с PIP:

pip install Scrapy

Затем вы можете использовать CLI Scrapy для создания кода шаблона для нашего проекта:

scrapy startproject hacker_news_scraper

Внутри hacker_news_scraper/spider Мы создадим новый файл Python с кодом нашего паука:

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

Метод PARSE будет вызван на каждый URL в start_urls множество

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

# Enable and configure the AutoThrottle extension (disabled by default)
# See https://doc.scrapy.org/en/latest/topics/autothrottle.html
AUTOTHROTTLE_ENABLED = True
# The initial download delay
AUTOTHROTTLE_START_DELAY = 5

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

Вы можете запустить этот код с помощью CLI скраски и с различным форматом вывода (CSV, JSON, XML …):

scrapy crawl hacker-news -o links.json

И это все! Теперь у вас будут все ваши ссылки в хорошо отформатированном файле JSON.

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

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

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

Другим отличным вариантом использования было бы сделать снимок экрана страницы, и это то, что мы собираемся сделать с домашней страницей Hacker News (опять же!)

Вы можете установить пакет Selenium с PIP:

pip install selenium

Вам также понадобится Chromedriver :

brew install chromedriver

Затем нам просто нужно импортировать WebDriver из пакета Selenium, настроить Chrome и установить размер окна (в противном случае это действительно мало):

Вы должны получить хороший скриншот домашней страницы:

Вы можете сделать еще много с Selenium API и Chrome, например:

  • Выполнение JavaScript
  • Формы заполнения
  • Нажав на элементы
  • Извлечение элементов с помощью селекторов CSS/XPath

Selenium и Chrome в режиме без головы действительно являются окончательной комбинацией, чтобы очистить все, что вы хотите. Вы можете автоматизировать все, что вы можете сделать со своим обычным хромированным браузером.

Большой недостаток в том, что Chrome нуждается в большой мощности памяти/процессора. С некоторой тонкой настройкой вы можете уменьшить след памяти до 300-400 МБ на экземпляр Chrome, но вам все еще нужно 1 ядро процессора за экземпляр.

Если вы хотите одновременно запустить несколько экземпляров Chrome, вам понадобятся мощные серверы (стоимость быстро увеличивается) и постоянный мониторинг ресурсов.

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

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

Каждый инструмент, о которых я говорил в этом посте, станут предметом конкретного сообщения в блоге в будущем, где я буду глубоко в подробности.

Все, о чем я говорил в этом посте, это то, что я использовал для строительства Scrapingbee , самый простой веб -скребеток API там. Не стесняйтесь проверять наше решение, если вы не хотите терять слишком много времени на настройку, первые 1K API -звонки на нас 😊.

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

Счастливого царапины

Python Web Scraping (4 серии деталей)

Оригинал: “https://dev.to/scrapingbee/web-scraping-101-in-python-5aoj”