Веб-парсинг состоит из трех простых шагов:

  • Шаг 1. Откройте веб-страницу
  • Шаг 2. Найдите и проанализируйте предметы, которые нужно очистить
  • Шаг 3. Сохраните извлеченные элементы в файл

Лучшие библиотеки Python для сканирования веб-страниц: запросы, селен, красивый суп, панды и scrapy . Сегодня , мы рассмотрим только первые четыре и сохраним пятый, scrapy, для другого сообщения (для этого требуется дополнительная документация и является относительно сложным). Наша цель здесь - быстро понять, как работают библиотеки, и попробовать их на себе.

В качестве практического проекта мы будем использовать эту вакансию за 20 долларов от Upwork:

Есть две ссылки, которые клиент хочет очистить, и мы сосредоточимся на второй. Это веб-страница публичных компаний, котирующихся на NASDAQ:

По словам клиента, он хочет очистить символы акций и названия акций, перечисленные на этой веб-странице. Затем он хочет сохранить оба данных в одном файле JSON. На Upwork есть сотни подобных вакансий, и это хороший пример того, как можно зарабатывать деньги с помощью Python.

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

Шаг 1. Доступ к веб-странице

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

Запросы

import requests
url = "https://eoddata.com/stocklist/NASDAQ/A.htm"
page = requests.get(url)

Запросы позволяет нам отправлять HTTP-запросы на сервер. Эта библиотека выполняет свою работу специально для статических веб-сайтов, которые немедленно отображают содержимое HTML. Однако большинство сайтов снабжено кодом javascript, который предотвращает рендеринг всего содержимого HTML. Например, иногда нам нужно установить флажок или прокрутить вниз до определенного раздела, чтобы полностью загрузить страницу, и это Javascript в действии. Иногда на веб-сайтах есть код защиты от парсера, который обнаруживает HTTP-запросы, отправленные через библиотеку requests. По этим причинам мы исследуем другие библиотеки.

Селен:

from selenium import webdriver
url = "https://eoddata.com/stocklist/NASDAQ/A.htm"
driver = webdriver.Chrome('/Downloads/chromedriver')
driver.get(url)

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

Вот пример того, как Selenium открывает для меня веб-страницу:

Но Selenium не может сделать все это самостоятельно без помощи браузера. Если вы изучите мой код выше, вы увидите, что я вызвал драйвер Chrome из папки Загрузки, чтобы Selenium мог открыть для меня url в Chrome.

Шаг 2. Найдите и проанализируйте элементы, которые нужно очистить.

Информация, которую мы хотим очистить, отображается на веб-странице через HTML. Это та часть, где мы их обнаруживаем и анализируем. Для этого мы все еще можем использовать селен или, если мы не хотим устанавливать драйвер Chrome, красивый суп:

Селен:

Согласно этой документации, есть много способов, которыми Selenium может найти для нас HTML-элементы. Я буду использовать команду find_elements_by_css_selector просто потому, что это удобно.

stock_symbol = driver.find_elements_by_css_selector('#ctl00_cph1_divSymbols > table > tbody > tr > td:nth-child(1) > a')

Как я узнал, какой селектор CSS передать? Легко. Я просто проверил образец символа акций (AACG) и скопировал его селектор. Затем я немного изменил код, чтобы анализировать все символы (а не только AACG).

Вот полный код:

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

symbol = []
for x in stock_symbol: 
  sym = x.text 
  symbol.append(sym)

Вот так! Теперь, когда у нас есть символы акций, нам просто нужно повторить процесс, чтобы получить названия акций:

Хорошо выглядеть!

Красивый суп:

Помимо Selenium, мы можем использовать красивый суп для поиска и анализа HTML-элементов . Его часто используют вместе с библиотекой request, чтобы избежать необходимости устанавливать драйвер Chrome, который является требованием для Selenium. Вспомните этот код из библиотеки запросов:

import requests
url = "https://eoddata.com/stocklist/NASDAQ/A.htm"
page = requests.get(url)

Отсюда все, что нам нужно сделать, это импортировать и вызвать HTML-парсер Beautiful soup:

from bs4 import BeautifulSoup
soup = BeautifulSoup(page.text, 'html.parser')

Это захватит все HTML-элементы страницы:

Из этой документации, вот как красивый суп разбирает элементы HTML:

Это не так просто, как использование селектора CSS, поэтому мы должны использовать некоторые циклы for для сопоставления и хранения элементов HTML:

Неплохо!

Шаг 3. Сохраните извлеченные элементы в файл

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

import pandas as pd
df = pd.DataFrame(index = None)
df['stock_symbol'] = symbol
df['stock_name'] = names

Идеально! Теперь нам нужно сделать еще одно. В сообщении о вакансии клиент упомянул, что хочет установить символ акции в качестве ключа и название акции в качестве значения. Этот код pandas должен это делать:

df.set_index('stock_symbol, inplace = True)

Наконец, давайте сохраним файл в формате JSON по запросу клиента:

df.to_json('NASDAQ Stock List')

Ца-цзин! Это были легкие 20 долларов!

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