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

Начало работы с сосканием в Python

Полезное руководство по работе сбора Web Scraping с помощью Python.

Автор оригинала: Satwik Kansal.

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

Почему Scrape вместо использования API?

Во-первых, не каждый сайт имеет API. Во-вторых, даже если сайт имеет API, он может не дать вам нужную информацию (или вы не сможете себе это позволить).

Как вы соскредите?

Широко говоря, это трехступенчатый процесс:

  1. Получение контента (в большинстве случаев HTML страницы).
  2. Разбирая ответ.
  3. Оптимизация/улучшение процесса и сохранения данных.

Давайте понять с этим заявлением о проблеме:

Мы собираемся принести название, автор и УПЗО для всех предложений на Pycon India 2016 Отказ

Список предложений в настоящее время заказывается по датам предложения. Мы хотели бы видеть предложения, отсортированные по количеству УПЗО.

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

Получение содержания

Большую часть времени вы заинтересованы только в получении HTML-контента. В Python, если у вас есть ссылка, вы можете использовать Urllib2 для получения HTML-содержимого страницы.

Однако это оказывается большим количеством кода, который обычно является хрупким. Я бы посоветовал, что вы используете замечательную библиотеку, Запросы , который «HTTP для людей». Смотри на это Простой пример.

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

import requests
response = requests.get("https://in.pycon.org/cfp/2016/proposals/")
if response.status_code == 200 print "Fetched the page sucessfully" html_doc = response.text

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

Теперь, когда у нас есть ответ, нам нужен способ извлечения информации, которую нам нужен. Ответ. Text будет строкой. Мы можем найти все необходимое содержание от HTML, используя регулярные выражения и базовый Python, но это очень сложно.

Вместо этого мы будем использовать сторонние библиотеки. Некоторые популярные библиотеки – BeautifulSoup4, LXML и HTMLParser. Эти библиотеки используют разные методы разбора внизу, поэтому они варьируются в производительности и простоте использования. Мы будем использовать красивый суп здесь, потому что это самый популярный и удобный для пользователя среди трех.

Создание объекта супа:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser') print(soup.prettify())

Посмотрим, что происходит в этих трех линиях. Во-первых, мы импортируем красивый суп модуль в первой строке. Затем мы создаем прохождение объекта супа в ответ, который мы получили, а затем укажите, какой анализатор используется (HTML.Parser – это анализатор по умолчанию).

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

Еще одна полезная ссылка находится в документации для красивого супа. Мы распечатаем HTML в последней строке, а Суп.При () это способ отформатировать HTML в читаемой форме человека перед печатью.

Нахождение необходимого контента

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

  1. Указание элементов
  2. Соответствующие атрибуты элементов (класс, идентификатор и т. Д.)
  3. Используя XPath

Мы можем использовать CSS селекторы для первых двух способов. Другой способ – использовать XPath. Обратите внимание, что красивый суп не поддерживает XPath, поэтому нам придется придерживаться синтаксиса селектора CSS. Есть библиотеки, такие как Снапировка и Селен Это поддерживает XPath.

Давайте быстро верим через некоторые обычно используемые действия, которые мы можем выполнять на нашем объекте супа. Красивый суп уже имеет очень удивительный Документация Так что, пожалуйста, просто пройдите через Быстрый запуск раздел один раз, прежде чем двигаться вперед.

Наблюдая за структурой страницы

Теперь приходит важная часть. Вам необходимо понять структуру страницы HTML, чтобы получить желаемый контент. Мы заинтересованы в получении следующих ценностей для всех предложений на странице от сайта Pycon India 2016:

  1. Количество голосов.
  2. Количество комментариев.
  3. Заголовок.
  4. Ссылка на описание.
  5. Автор предложения.

Вот как мы продолжаем. Глядя на HTML-структуру, мы видим, что каждое предложение содержится в пределах Div класса Пользовательские предложения Отказ Во-первых, мы хотели бы получить все Div с классом Пользовательские предложения Отказ

{% highlight python linenos %}
proposal_divs = soup.find_all("a", class_="user-proposals") 
{% endhighlight %}
Scrape-1.

Теперь мы можем найти, где требуемые данные хранятся внутри этого Пользовательское предложение девочка Быстрый способ сделать это – просто перейти к элементу и нажмите на Проверять элемент Отказ Например, если я ищу элемент, содержащий «автор», я просто щелкнул правой кнопкой мыши по любому имени автора и выберите «Проверка элемента».

Скриншот с 2016-06-18 23-05-55-1

Тщательное наблюдение приводит нас к следующим полезным выводу:

  1. Количество голосов размещается в единственном HTML-теге div с классовой панелью.
  2. Количество комментариев помещается в единственном теге SPAN, сразу после того, как я тег с классом FA FA-Comments-o. Примечание : Это также могло бы быть единственным промежуточным тегом DIV с классовым пространством сверху, но я просто пытаюсь прикрыть различные возможные способы.
  3. Название предложений помещается в тег с классовым предложением – название.
  4. Ссылка К описанию предложений размещено внутри атрибута HREF тега с титулом класса-предложений. Теперь посмотрите на код, чтобы извлечь все это.
proposal_divs = soup.find_all("div", class_="user-proposals")
print 'No. of proposals',len(proposal_divs)
results = []
for proposal_div in proposal_divs:
  #Initialize an empty dictionary to store all the data
  proposal_dict = {}
  #Using CSS Selectors to get the Number of votes
  proposal_dict['votes'] = int(proposal_div.select('.panel-body > h4')[0].get_text())
  #Using chained find methods to get the number of comments
  proposal_dict['comments'] = proposal_div.find('div', class_='space-on-top').find('span').get_text()
  # We can also pass other attributes to the find method inside a dictionary
  proposal_dict['name'] = proposal_div.find('h3', {'class': 'proposal--title'}).find('a').get_text()

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

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