Учебники

Python Web Scraping — Краткое руководство

Python Web Scraping — Введение

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

Что такое Web Scraping?

Словарь значения слова «Scrapping» подразумевает получение чего-либо из Интернета. Здесь возникают два вопроса: что мы можем получить из Интернета и как это получить.

Ответ на первый вопрос — «данные» . Данные незаменимы для любого программиста, и основным требованием каждого проекта программирования является большой объем полезных данных.

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

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

Происхождение веб-соскабливания

Источником очистки веб-страниц является очистка экрана, которая использовалась для интеграции не веб-приложений или собственных приложений Windows. Первоначально очистка экрана использовалась до широкого использования Всемирной паутины (WWW), но она не могла расширяться. Это сделало необходимым автоматизировать подход к очистке экрана, и появилась технология, называемая «Web Scraping» .

Web Crawling v / s Web Scraping

Термины Web Crawling и Scraping часто используются взаимозаменяемо, поскольку их основная концепция заключается в извлечении данных. Однако они отличаются друг от друга. Мы можем понять принципиальное отличие от их определений.

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

Чтобы понять разницу между этими двумя терминами, давайте посмотрим на таблицу сравнения, приведенную ниже —

Веб-сканирование Web Scraping
Относится к загрузке и хранению содержимого большого количества веб-сайтов. Относится к извлечению отдельных элементов данных с веб-сайта с использованием структуры сайта.
В основном сделано в больших масштабах. Может быть реализовано в любом масштабе.
Дает общую информацию. Выдает конкретную информацию.
Используется основными поисковыми системами, такими как Google, Bing, Yahoo. Googlebot является примером веб-сканера. Информация, извлеченная с помощью веб-скрепинга, может быть использована для репликации на каком-либо другом веб-сайте или для анализа данных. Например, элементами данных могут быть имена, адрес, цена и т. Д.

Использование Web Scraping

Использование и причины использования веб-скребков так же бесконечны, как и использование World Wide Web. Веб-скребки могут делать все, что угодно, например, заказывать еду в Интернете, сканировать веб-сайт онлайн-покупок и покупать билет на матч в тот момент, когда они доступны, и так же, как это может сделать человек. Некоторые из важных применений веб-скребинга обсуждаются здесь —

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

  • Агрегаторы контента — веб-сборщики широко используются агрегаторами контента, такими как агрегаторы новостей и агрегаторы заданий, для предоставления обновленных данных своим пользователям.

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

  • Поисковая оптимизация (SEO) — Скрабинг в Интернете широко используется инструментами SEO, такими как SEMRush, Majestic и т. Д., Чтобы сообщить бизнесу, как они ранжируются по ключевым словам поиска, которые им важны.

  • Данные для проектов машинного обучения. Извлечение данных для проектов машинного обучения зависит от использования веб-страниц.

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

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

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

Поисковая оптимизация (SEO) — Скрабинг в Интернете широко используется инструментами SEO, такими как SEMRush, Majestic и т. Д., Чтобы сообщить бизнесу, как они ранжируются по ключевым словам поиска, которые им важны.

Данные для проектов машинного обучения. Извлечение данных для проектов машинного обучения зависит от использования веб-страниц.

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

Компоненты веб-скребка

Веб-скребок состоит из следующих компонентов —

Модуль веб-сканера

Очень необходимый компонент веб-скребка, модуль веб-сканера, используется для навигации по целевому веб-сайту путем отправки HTTP или HTTPS-запроса к URL-адресам. Сканер загружает неструктурированные данные (содержимое HTML) и передает их в экстрактор, следующий модуль.

экстрактор

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

Модуль преобразования и очистки данных

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

Модуль хранения

После извлечения данных нам нужно сохранить их в соответствии с нашим требованием. Модуль хранения выведет данные в стандартном формате, который можно сохранить в базе данных или в формате JSON или CSV.

Работа веб-скребка

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

Веб скребок

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

Шаг 1: Загрузка содержимого с веб-страниц

На этом этапе веб-скребок загрузит запрошенное содержимое с нескольких веб-страниц.

Шаг 2: Извлечение данных

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

Шаг 3: Хранение данных

Здесь веб-скребок будет хранить и сохранять извлеченные данные в любом из форматов, таких как CSV, JSON или в базе данных.

Шаг 4: Анализ данных

После успешного выполнения всех этих шагов веб-скребок проанализирует полученные данные.

Начало работы с Python

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

Почему Python для веб-скребинга?

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

Язык программирования Python набирает огромную популярность, и причины, которые делают Python подходящим для веб-проектов, приведены ниже:

Синтаксис Простота

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

Встроенные модули

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

Язык программирования с открытым исходным кодом

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

Широкий спектр применения

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

Установка Python

Дистрибутив Python доступен для таких платформ, как Windows, MAC и Unix / Linux. Нам нужно загрузить только двоичный код, применимый к нашей платформе для установки Python. Но в случае, если двоичный код для нашей платформы недоступен, у нас должен быть компилятор C, чтобы исходный код мог быть скомпилирован вручную.

Мы можем установить Python на различные платформы следующим образом:

Установка Python в Unix и Linux

Чтобы установить Python на компьютерах с Unix / Linux, вам необходимо выполнить следующие шаги:

Шаг 1 — перейдите по ссылке https://www.python.org/downloads/

Шаг 2 — Загрузите сжатый исходный код, доступный для Unix / Linux по ссылке выше.

Шаг 3 — Извлеките файлы на свой компьютер.

Шаг 4 — Используйте следующие команды для завершения установки —

run ./configure script
make
make install

Вы можете найти установленный Python в стандартном каталоге / usr / local / bin и его библиотеках в / usr / local / lib / pythonXX , где XX — версия Python.

Установка Python в Windows

Чтобы установить Python на компьютерах с Windows, необходимо выполнить следующие шаги:

Шаг 1 — перейдите по ссылке https://www.python.org/downloads/

Шаг 2. Загрузите файл установщика Windows python-XYZ.msi , где XYZ — это версия, которую нам нужно установить.

Шаг 3. Теперь сохраните файл установщика на локальном компьютере и запустите файл MSI.

Шаг 4 — Наконец, запустите загруженный файл, чтобы вызвать мастер установки Python.

Установка Python на Macintosh

Мы должны использовать Homebrew для установки Python 3 на Mac OS X. Homebrew прост в установке и является отличным установщиком пакетов.

Homebrew также можно установить с помощью следующей команды —

$ ruby -e "$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install)"

Для обновления менеджера пакетов мы можем использовать следующую команду —

$ brew update

С помощью следующей команды мы можем установить Python3 на наш компьютер MAC —

$ brew install python3

Настройка пути

Вы можете использовать следующие инструкции для настройки пути в различных средах:

Настройка пути в Unix / Linux

Используйте следующие команды для настройки путей, используя различные командные оболочки —

Для оболочки csh

setenv PATH "$PATH:/usr/local/bin/python".

Для оболочки bash (Linux)

ATH="$PATH:/usr/local/bin/python".

Для оболочки sh или ksh

PATH="$PATH:/usr/local/bin/python".

Настройка пути в Windows

Для установки пути в Windows мы можем использовать путь % path%; C: \ Python в командной строке и затем нажать Enter.

Запуск Python

Мы можем запустить Python любым из следующих трех способов:

Интерактивный переводчик

Операционная система, такая как UNIX и DOS, которая предоставляет интерпретатор командной строки или оболочку, может использоваться для запуска Python.

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

Шаг 1 — Введите python в командной строке.

Шаг 2 — Затем мы можем начать кодирование прямо в интерактивном интерпретаторе.

$python # Unix/Linux
or
python% # Unix/Linux
or
C:> python # Windows/DOS

Скрипт из командной строки

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

$python script.py # Unix/Linux
or
python% script.py # Unix/Linux
or
C: >python script.py # Windows/DOS

Интегрированная среда развития

Мы также можем запустить Python из среды GUI, если в системе есть приложение с графическим интерфейсом, которое поддерживает Python. Некоторые IDE, которые поддерживают Python на различных платформах, приведены ниже —

IDE для UNIX — UNIX для Python имеет IDLE IDE.

IDE для Windows — Windows имеет PythonWin IDE, которая также имеет графический интерфейс.

IDE для Macintosh — в Macintosh есть IDLE IDE, которую можно загрузить в виде файлов MacBinary или BinHex с основного веб-сайта.

Модули Python для веб-очистки

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

Среды разработки Python, использующие virtualenv

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

Вы можете использовать следующую команду для установки virtualenv

(base) D:\ProgramData>pip install virtualenv
Collecting virtualenv
   Downloading
https://files.pythonhosted.org/packages/b6/30/96a02b2287098b23b875bc8c2f58071c3
5d2efe84f747b64d523721dc2b5/virtualenv-16.0.0-py2.py3-none-any.whl
(1.9MB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 1.9MB 86kB/s
Installing collected packages: virtualenv
Successfully installed virtualenv-16.0.0

Теперь нам нужно создать каталог, который будет представлять проект с помощью следующей команды —

(base) D:\ProgramData>mkdir webscrap

Теперь войдите в этот каталог с помощью следующей команды —

(base) D:\ProgramData>cd webscrap

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

(base) D:\ProgramData\webscrap>virtualenv websc
Using base prefix 'd:\\programdata'
New python executable in D:\ProgramData\webscrap\websc\Scripts\python.exe
Installing setuptools, pip, wheel...done.

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

(base) D:\ProgramData\webscrap>websc\scripts\activate

Мы можем установить любой модуль в этой среде следующим образом —

(websc) (base) D:\ProgramData\webscrap>pip install requests
Collecting requests
   Downloading
https://files.pythonhosted.org/packages/65/47/7e02164a2a3db50ed6d8a6ab1d6d60b69
c4c3fdf57a284257925dfc12bda/requests-2.19.1-py2.py3-none-any.whl (9
1kB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 92kB 148kB/s
Collecting chardet<3.1.0,>=3.0.2 (from requests)
   Downloading
https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca
55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133
kB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 143kB 369kB/s
Collecting certifi>=2017.4.17 (from requests)
   Downloading
https://files.pythonhosted.org/packages/df/f7/04fee6ac349e915b82171f8e23cee6364
4d83663b34c539f7a09aed18f9e/certifi-2018.8.24-py2.py3-none-any.whl
(147kB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 153kB 527kB/s
Collecting urllib3<1.24,>=1.21.1 (from requests)
   Downloading
https://files.pythonhosted.org/packages/bd/c9/6fdd990019071a4a32a5e7cb78a1d92c5
3851ef4f56f62a3486e6a7d8ffb/urllib3-1.23-py2.py3-none-any.whl (133k
B)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 143kB 517kB/s
Collecting idna<2.8,>=2.5 (from requests)
   Downloading
https://files.pythonhosted.org/packages/4b/2a/0276479a4b3caeb8a8c1af2f8e4355746
a97fab05a372e4a2c6a6b876165/idna-2.7-py2.py3-none-any.whl (58kB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 61kB 339kB/s
Installing collected packages: chardet, certifi, urllib3, idna, requests
Successfully installed certifi-2018.8.24 chardet-3.0.4 idna-2.7 requests-2.19.1
urllib3-1.23

Для деактивации виртуальной среды мы можем использовать следующую команду:

(websc) (base) D:\ProgramData\webscrap>deactivate
(base) D:\ProgramData\webscrap>

Вы можете видеть, что (websc) был деактивирован.

Модули Python для веб-очистки

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

В этом разделе мы собираемся обсудить полезные библиотеки Python для очистки веб-страниц.

Запросы

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

Установка запросов

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

(base) D:\ProgramData> pip install requests
Collecting requests
Using cached
https://files.pythonhosted.org/packages/65/47/7e02164a2a3db50ed6d8a6ab1d6d60b69
c4c3fdf57a284257925dfc12bda/requests-2.19.1-py2.py3-none-any.whl
Requirement already satisfied: idna<2.8,>=2.5 in d:\programdata\lib\sitepackages
(from requests) (2.6)
Requirement already satisfied: urllib3<1.24,>=1.21.1 in
d:\programdata\lib\site-packages (from requests) (1.22)
Requirement already satisfied: certifi>=2017.4.17 in d:\programdata\lib\sitepackages
(from requests) (2018.1.18)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in
d:\programdata\lib\site-packages (from requests) (3.0.4)
Installing collected packages: requests
Successfully installed requests-2.19.1

пример

В этом примере мы делаем запрос GET HTTP для веб-страницы. Для этого нам нужно сначала импортировать библиотеку запросов следующим образом:

In [1]: import requests

В этой следующей строке кода мы используем запросы для выполнения HTTP-запросов GET для URL: https://authoraditiagarwal.com/ , отправляя запрос GET.

In [2]: r = requests.get('https://authoraditiagarwal.com/')

Теперь мы можем получить содержимое с помощью свойства .text следующим образом:

In [5]: r.text[:200]

Обратите внимание, что в следующем выводе мы получили первые 200 символов.

Out[5]: '<!DOCTYPE html>\n<html lang="en-US"\n\titemscope
\n\titemtype="http://schema.org/WebSite" \n\tprefix="og: http://ogp.me/ns#"
>\n<head>\n\t<meta charset
="UTF-8" />\n\t<meta http-equiv="X-UA-Compatible" content="IE'

Urllib3

Это еще одна библиотека Python, которую можно использовать для извлечения данных из URL-адресов, аналогичных библиотеке запросов . Вы можете прочитать больше об этом в его технической документации по адресу https://urllib3.readthedocs.io/en/latest/ .

Установка Urllib3

Используя команду pip , мы можем установить urllib3 либо в нашей виртуальной среде, либо в глобальной установке.

(base) D:\ProgramData>pip install urllib3
Collecting urllib3
Using cached
https://files.pythonhosted.org/packages/bd/c9/6fdd990019071a4a32a5e7cb78a1d92c5
3851ef4f56f62a3486e6a7d8ffb/urllib3-1.23-py2.py3-none-any.whl
Installing collected packages: urllib3
Successfully installed urllib3-1.23

Пример: выскабливание с использованием Urllib3 и BeautifulSoup

В следующем примере мы очищаем веб-страницу с помощью Urllib3 и BeautifulSoup . Мы используем Urllib3 вместо библиотеки запросов для получения необработанных данных (HTML) с веб-страницы. Затем мы используем BeautifulSoup для анализа этих HTML-данных.

import urllib3
from bs4 import BeautifulSoup
http = urllib3.PoolManager()
r = http.request('GET', 'https://authoraditiagarwal.com')
soup = BeautifulSoup(r.data, 'lxml')
print (soup.title)
print (soup.title.text)

Это вывод, который вы увидите при запуске этого кода —

<title>Learn and Grow with Aditi Agarwal</title>
Learn and Grow with Aditi Agarwal

Селен

Это пакет автоматизированного тестирования с открытым исходным кодом для веб-приложений в разных браузерах и на разных платформах. Это не единственный инструмент, а набор программного обеспечения. У нас есть привязки селена для Python, Java, C #, Ruby и JavaScript. Здесь мы собираемся выполнить очистку веб-страниц, используя селен и его привязки Python. Вы можете узнать больше о Selenium с Java по ссылке Selenium .

Привязки Selenium Python предоставляют удобный API для доступа к Selenium WebDrivers, таким как Firefox, IE, Chrome, Remote и т. Д. В настоящее время поддерживаются версии Python 2.7, 3.5 и выше.

Установка Selenium

Используя команду pip , мы можем установить urllib3 либо в нашей виртуальной среде, либо в глобальной установке.

pip install selenium

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

Хром

https://sites.google.com/a/chromium.org/

край

https://developer.microsoft.com/

Fire Fox

https://github.com/

Сафари

https://webkit.org/

Хром

https://sites.google.com/a/chromium.org/

край

https://developer.microsoft.com/

Fire Fox

https://github.com/

Сафари

https://webkit.org/

пример

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

После загрузки конкретного драйвера для указанной версии браузера нам нужно заняться программированием на Python.

Во-первых, необходимо импортировать веб-драйвер из селена следующим образом —

from selenium import webdriver

Теперь укажите путь к веб-драйверу, который мы скачали в соответствии с нашим требованием —

path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
browser = webdriver.Chrome(executable_path = path)

Теперь укажите URL, который мы хотим открыть в этом веб-браузере, который теперь контролируется нашим скриптом Python.

browser.get(' https://authoraditiagarwal.com/leadershipmanagement ')

Мы также можем очистить определенный элемент, указав xpath, как указано в lxml.

browser.find_element_by_xpath('/html/body').click()

Вы можете проверить браузер, управляемый скриптом Python, для вывода.

Scrapy

Scrapy — это быстрый веб-фреймворк с открытым исходным кодом, написанный на Python, который используется для извлечения данных с веб-страницы с помощью селекторов на основе XPath. Scrapy был впервые выпущен 26 июня 2008 года по лицензии BSD, а Milestone 1.0 был выпущен в июне 2015 года. Он предоставляет нам все инструменты, необходимые для извлечения, обработки и структурирования данных с веб-сайтов.

Установка Scrapy

Используя команду pip , мы можем установить urllib3 либо в нашей виртуальной среде, либо в глобальной установке.

pip install scrapy

Для более детального изучения Scrapy вы можете перейти по ссылке Scrapy

Законность веб-соскабливания

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

Вступление

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

Требуется исследование до выскабливания

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

Анализ robots.txt

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

robots.txt — это читаемый человеком файл, используемый для идентификации частей сайта, которые сканерам разрешено, а также не разрешено просматривать. Стандартного формата файла robots.txt не существует, и издатели веб-сайта могут вносить изменения в соответствии со своими потребностями. Мы можем проверить файл robots.txt для определенного веб-сайта, указав косую черту и robots.txt после URL этого веб-сайта. Например, если мы хотим проверить его на Google.com, нам нужно ввести https://www.google.com/robots.txt, и мы получим что-то следующее:

User-agent: *
Disallow: /search
Allow: /search/about
Allow: /search/static
Allow: /search/howsearchworks
Disallow: /sdch
Disallow: /groups
Disallow: /index.html?
Disallow: /?
Allow: /?hl=
Disallow: /?hl=*&
Allow: /?hl=*&gws_rd=ssl$
and so on……..

Вот некоторые из наиболее распространенных правил, которые определены в файле robots.txt веб-сайта:

   User-agent: BadCrawler
Disallow: /

Приведенное выше правило означает, что файл robots.txt просит сканер с пользовательским агентом BadCrawler не сканировать их веб-сайт.

User-agent: *
Crawl-delay: 5
Disallow: /trap

Приведенное выше правило означает, что файл robots.txt задерживает сканер на 5 секунд между запросами на загрузку для всех пользовательских агентов во избежание перегрузки сервера. Ссылка / trap попытается заблокировать вредоносные сканеры, которые переходят по запрещенным ссылкам. Существует еще много правил, которые могут быть определены издателем сайта в соответствии с их требованиями. Некоторые из них обсуждаются здесь —

Анализ файлов Sitemap

Что вы должны делать, если хотите сканировать веб-сайт для получения обновленной информации? Вы будете сканировать каждую веб-страницу для получения этой обновленной информации, но это увеличит трафик сервера этого конкретного веб-сайта. Вот почему веб-сайты предоставляют файлы карты сайта, которые помогают сканерам находить обновляемый контент без необходимости сканировать каждую веб-страницу. Стандарт Sitemap определен по адресу http://www.sitemaps.org/protocol.html .

Содержимое файла Sitemap

Ниже приведено содержимое файла карты сайта https://www.microsoft.com/robots.txt , обнаруженного в файле robot.txt.

Sitemap: https://www.microsoft.com/en-us/explore/msft_sitemap_index.xml
Sitemap: https://www.microsoft.com/learning/sitemap.xml
Sitemap: https://www.microsoft.com/en-us/licensing/sitemap.xml
Sitemap: https://www.microsoft.com/en-us/legal/sitemap.xml
Sitemap: https://www.microsoft.com/filedata/sitemaps/RW5xN8
Sitemap: https://www.microsoft.com/store/collections.xml
Sitemap: https://www.microsoft.com/store/productdetailpages.index.xml
Sitemap: https://www.microsoft.com/en-us/store/locations/store-locationssitemap.xml

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

Какой размер сайта?

Влияет ли размер веб-сайта, то есть количество веб-страниц веб-сайта, на способ сканирования? Конечно да. Потому что, если у нас будет меньше веб-страниц для сканирования, эффективность не будет серьезной проблемой, но предположим, что если на нашем веб-сайте есть миллионы веб-страниц, например, Microsoft.com, то последовательная загрузка каждой веб-страницы займет несколько месяцев и тогда эффективность будет серьезной проблемой.

Проверка размера сайта

Проверяя размер результатов поискового робота Google, мы можем оценить размер веб-сайта. Наш результат может быть отфильтрован по ключевому слову site во время поиска в Google. Например, оценка размера https://authoraditiagarwal.com/ приведена ниже —

Проверка размера

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

Какая технология используется сайтом?

Еще один важный вопрос: влияет ли технология, используемая веб-сайтом, на то, как мы сканируем? Да, это влияет. Но как мы можем проверить технологии, используемые веб-сайтом? Существует библиотека Python с именем buildwith, с помощью которой мы можем узнать о технологии, используемой веб-сайтом.

пример

В этом примере мы собираемся проверить технологию, используемую веб-сайтом https://authoraditiagarwal.com с помощью встроенной библиотеки Python . Но перед использованием этой библиотеки нам нужно установить ее следующим образом:

(base) D:\ProgramData>pip install builtwith
Collecting builtwith
   Downloading
https://files.pythonhosted.org/packages/9b/b8/4a320be83bb3c9c1b3ac3f9469a5d66e0
2918e20d226aa97a3e86bddd130/builtwith-1.3.3.tar.gz
Requirement already satisfied: six in d:\programdata\lib\site-packages (from
builtwith) (1.10.0)
Building wheels for collected packages: builtwith
   Running setup.py bdist_wheel for builtwith ... done
   Stored in directory:
C:\Users\gaurav\AppData\Local\pip\Cache\wheels\2b\00\c2\a96241e7fe520e75093898b
f926764a924873e0304f10b2524
Successfully built builtwith
Installing collected packages: builtwith
Successfully installed builtwith-1.3.3

Теперь, с помощью следующей простой строки кодов, мы можем проверить технологию, используемую конкретным сайтом —

In [1]: import builtwith
In [2]: builtwith.parse('http://authoraditiagarwal.com')
Out[2]:
{'blogs': ['PHP', 'WordPress'],
   'cms': ['WordPress'],
   'ecommerce': ['WooCommerce'],
   'font-scripts': ['Font Awesome'],
   'javascript-frameworks': ['jQuery'],
   'programming-languages': ['PHP'],
   'web-servers': ['Apache']}

Кто является владельцем сайта?

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

пример

В этом примере мы собираемся проверить владельца сайта скажем microsoft.com с помощью Whois. Но перед использованием этой библиотеки нам нужно установить ее следующим образом:

(base) D:\ProgramData>pip install python-whois
Collecting python-whois
   Downloading
https://files.pythonhosted.org/packages/63/8a/8ed58b8b28b6200ce1cdfe4e4f3bbc8b8
5a79eef2aa615ec2fef511b3d68/python-whois-0.7.0.tar.gz (82kB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 92kB 164kB/s
Requirement already satisfied: future in d:\programdata\lib\site-packages (from
python-whois) (0.16.0)
Building wheels for collected packages: python-whois
   Running setup.py bdist_wheel for python-whois ... done
   Stored in directory:
C:\Users\gaurav\AppData\Local\pip\Cache\wheels\06\cb\7d\33704632b0e1bb64460dc2b
4dcc81ab212a3d5e52ab32dc531
Successfully built python-whois
Installing collected packages: python-whois
Successfully installed python-whois-0.7.0

Теперь, с помощью следующей простой строки кодов, мы можем проверить технологию, используемую конкретным сайтом —

In [1]: import whois
In [2]: print (whois.whois('microsoft.com'))
{
   "domain_name": [
      "MICROSOFT.COM",
      "microsoft.com"
   ],
   -------
   "name_servers": [
      "NS1.MSFT.NET",
      "NS2.MSFT.NET",
      "NS3.MSFT.NET",
      "NS4.MSFT.NET",
      "ns3.msft.net",
      "ns1.msft.net",
      "ns4.msft.net",
      "ns2.msft.net"
   ],
   "emails": [
      "[email protected]",
      "[email protected]",
      "[email protected]",
      "[email protected]"
   ],
}

Python Web Scraping — извлечение данных

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

Анализ веб-страницы

Анализ веб-страниц важен, потому что без анализа мы не можем знать, в какой форме мы собираемся получать данные (структурированные или неструктурированные) с этой веб-страницы после извлечения. Мы можем сделать анализ веб-страницы следующими способами —

Просмотр страницы источника

Это способ понять, как структурирована веб-страница, путем изучения ее исходного кода. Чтобы реализовать это, нам нужно щелкнуть правой кнопкой мыши страницу и затем выбрать опцию View page source . Затем мы получим интересующие нас данные с этой веб-страницы в форме HTML. Но основная проблема связана с пробелами и форматированием, которые нам сложно отформатировать.

Проверка источника страницы, нажав кнопку «Проверить элемент»

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

Различные способы извлечения данных из веб-страницы

Следующие методы в основном используются для извлечения данных с веб-страницы —

Регулярное выражение

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

Если вы хотите узнать больше о регулярных выражениях в целом, перейдите по ссылке https://www.tutorialspoint.com/automata_theory/regular_expressions.htm и если вы хотите узнать больше о модуле re или регулярном выражении в Python, вы можете следовать ссылка https://www.tutorialspoint.com/python/python_reg_expressions.htm .

пример

В следующем примере мы собираем данные об Индии с http://example.webscraping.com после сопоставления содержимого <td> с помощью регулярного выражения.

import re
import urllib.request
response =
   urllib.request.urlopen('http://example.webscraping.com/places/default/view/India-102')
html = response.read()
text = html.decode()
re.findall('<td class="w2p_fw">(.*?)</td>',text)

Выход

Соответствующий вывод будет таким, как показано здесь —

[
   '<img src="/places/static/images/flags/in.png" />',
   '3,287,590 square kilometres',
   '1,173,108,018',
   'IN',
   'India',
   'New Delhi',
   '<a href="/places/default/continent/AS">AS</a>',
   '.in',
   'INR',
   'Rupee',
   '91',
   '######',
   '^(\\d{6})$',
   'enIN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc',
   '<div>
      <a href="/places/default/iso/CN">CN </a>
      <a href="/places/default/iso/NP">NP </a>
      <a href="/places/default/iso/MM">MM </a>
      <a href="/places/default/iso/BT">BT </a>
      <a href="/places/default/iso/PK">PK </a>
      <a href="/places/default/iso/BD">BD </a>
   </div>'
]

Заметьте, что в приведенном выше выводе вы можете увидеть подробности о стране Индия с помощью регулярного выражения.

Красивый суп

Предположим, что мы хотим собрать все гиперссылки с веб-страницы, затем мы можем использовать синтаксический анализатор BeautifulSoup, который можно узнать более подробно по адресу https://www.crummy.com/software/BeautifulSoup/bs4/doc/. Проще говоря, BeautifulSoup — это библиотека Python для извлечения данных из файлов HTML и XML. Его можно использовать с запросами, потому что для создания объекта-супруга нужен вход (документ или URL), так как он не может самостоятельно получить веб-страницу. Вы можете использовать следующий скрипт Python, чтобы собрать заголовок веб-страницы и гиперссылки.

Установка красивого супа

Используя команду pip , мы можем установить beautifulsoup либо в нашей виртуальной среде, либо в глобальной установке.

(base) D:\ProgramData>pip install bs4
Collecting bs4
   Downloading
https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89
a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz
Requirement already satisfied: beautifulsoup4 in d:\programdata\lib\sitepackages
(from bs4) (4.6.0)
Building wheels for collected packages: bs4
   Running setup.py bdist_wheel for bs4 ... done
   Stored in directory:
C:\Users\gaurav\AppData\Local\pip\Cache\wheels\a0\b0\b2\4f80b9456b87abedbc0bf2d
52235414c3467d8889be38dd472
Successfully built bs4
Installing collected packages: bs4
Successfully installed bs4-0.0.1

пример

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

Во-первых, нам нужно импортировать необходимые модули Python —

import requests
from bs4 import BeautifulSoup

В этой следующей строке кода мы используем запросы, чтобы сделать HTTP-запросы GET для URL: https://authoraditiagarwal.com/ , сделав запрос GET.

r = requests.get(' https://authoraditiagarwal.com/ ')

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

soup = BeautifulSoup(r.text, 'lxml')
print (soup.title)
print (soup.title.text)

Выход

Соответствующий вывод будет таким, как показано здесь —

<title>Learn and Grow with Aditi Agarwal</title>
Learn and Grow with Aditi Agarwal

LXML

Еще одна библиотека Python, которую мы собираемся обсудить для поиска в сети, — это lxml. Это высокопроизводительная библиотека для разбора HTML и XML. Это сравнительно быстро и просто. Вы можете прочитать об этом подробнее на https://lxml.de/.

Установка lxml

Используя команду pip, мы можем установить lxml либо в нашей виртуальной среде, либо в глобальной установке.

(base) D:\ProgramData>pip install lxml
Collecting lxml
   Downloading
https://files.pythonhosted.org/packages/b9/55/bcc78c70e8ba30f51b5495eb0e
3e949aa06e4a2de55b3de53dc9fa9653fa/lxml-4.2.5-cp36-cp36m-win_amd64.whl
(3.
6MB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 3.6MB 64kB/s
Installing collected packages: lxml
Successfully installed lxml-4.2.5

Пример: извлечение данных с использованием lxml и запросов

В следующем примере мы очищаем определенный элемент веб-страницы от authoraditiagarwal.com с помощью lxml и запросов —

Во-первых, нам нужно импортировать запросы и HTML из библиотеки lxml следующим образом:

import requests
from lxml import html 

Теперь нам нужно предоставить URL веб-страницы для удаления

url = 'https://authoraditiagarwal.com/leadershipmanagement/'

Теперь нам нужно указать путь (Xpath) к конкретному элементу этой веб-страницы —

path = '//*[@id="panel-836-0-0-1"]/div/div/p[1]'
response = requests.get(url)
byte_string = response.content
source_code = html.fromstring(byte_string)
tree = source_code.xpath(path)
print(tree[0].text_content()) 

Выход

Соответствующий вывод будет таким, как показано здесь —

The Sprint Burndown or the Iteration Burndown chart is a powerful tool to communicate
daily progress to the stakeholders. It tracks the completion of work for a given sprint
or an iteration. The horizontal axis represents the days within a Sprint. The vertical 
axis represents the hours remaining to complete the committed work.

Python Web Scraping — Обработка данных

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

Вступление

Для обработки данных, которые были очищены, мы должны хранить данные на нашем локальном компьютере в определенном формате, таком как электронная таблица (CSV), JSON или иногда в базах данных, таких как MySQL.

CSV и JSON Обработка данных

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

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

import requests
from bs4 import BeautifulSoup
import csv

В этой следующей строке кода мы используем запросы для выполнения HTTP-запросов GET для URL: https://authoraditiagarwal.com/ , отправляя запрос GET.

r = requests.get(' https://authoraditiagarwal.com/ ')

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

soup = BeautifulSoup(r.text, 'lxml')

Теперь с помощью следующих строк кода мы запишем захваченные данные в файл CSV с именем dataprocessing.csv.

f = csv.writer(open(' dataprocessing.csv ','w'))
f.writerow(['Title'])
f.writerow([soup.title.text])

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

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

import requests
from bs4 import BeautifulSoup
import csv
import json
r = requests.get('https://authoraditiagarwal.com/')
soup = BeautifulSoup(r.text, 'lxml')
y = json.dumps(soup.title.text)
with open('JSONFile.txt', 'wt') as outfile:
   json.dump(y, outfile)

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

Обработка данных с использованием AWS S3

Иногда мы можем захотеть сохранить очищенные данные в нашем локальном хранилище для архивирования. Но что, если нам нужно хранить и анализировать эти данные в большом масштабе? Ответ — сервис облачного хранения с именем Amazon S3 или AWS S3 (Simple Storage Service). По сути, AWS S3 — это хранилище объектов, созданное для хранения и извлечения любого количества данных из любого места.

Для хранения данных в AWS S3 мы можем выполнить следующие шаги:

Шаг 1. Сначала нам нужна учетная запись AWS, которая предоставит нам секретные ключи для использования в нашем скрипте Python при хранении данных. Это создаст корзину S3, в которой мы можем хранить наши данные.

Шаг 2 — Далее нам нужно установить библиотеку boto3 Python для доступа к корзине S3. Его можно установить с помощью следующей команды —

pip install boto3

Шаг 3. Далее мы можем использовать следующий скрипт Python для удаления данных с веб-страницы и сохранения их в корзину AWS S3.

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

import requests
import boto3

Теперь мы можем соскрести данные с нашего URL.

data = requests.get("Enter the URL").text

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

s3 = boto3.client('s3')
bucket_name = "our-content"

Следующая строка кода создаст сегмент S3 следующим образом:

s3.create_bucket(Bucket = bucket_name, ACL = 'public-read')
s3.put_object(Bucket = bucket_name, Key = '', Body = data, ACL = "public-read")

Теперь вы можете проверить список с названием our-content в вашей учетной записи AWS.

Обработка данных с использованием MySQL

Давайте узнаем, как обрабатывать данные с использованием MySQL. Если вы хотите узнать о MySQL, вы можете перейти по ссылке https://www.tutorialspoint.com/mysql/.

С помощью следующих шагов мы можем очистить и обработать данные в таблицу MySQL:

Шаг 1 — Во-первых, используя MySQL, нам нужно создать базу данных и таблицу, в которой мы хотим сохранить очищенные данные. Например, мы создаем таблицу со следующим запросом —

CREATE TABLE Scrap_pages (id BIGINT(7) NOT NULL AUTO_INCREMENT,
title VARCHAR(200), content VARCHAR(10000),PRIMARY KEY(id));

Шаг 2 — Далее нам нужно разобраться с Юникодом. Обратите внимание, что MySQL не обрабатывает Unicode по умолчанию. Нам нужно включить эту функцию с помощью следующих команд, которые изменят набор символов по умолчанию для базы данных, для таблицы и для обоих столбцов —

ALTER DATABASE scrap CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE Scrap_pages CONVERT TO CHARACTER SET utf8mb4 COLLATE
utf8mb4_unicode_ci;
ALTER TABLE Scrap_pages CHANGE title title VARCHAR(200) CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE pages CHANGE content content VARCHAR(10000) CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

Шаг 3 — Теперь интегрируйте MySQL с Python. Для этого нам понадобится PyMySQL, который можно установить с помощью следующей команды

pip install PyMySQL 

Шаг 4 — Теперь наша база данных с именем Scrap, созданная ранее, готова сохранить данные после извлечения из сети в таблицу с именем Scrap_pages. Здесь, в нашем примере, мы собираемся очистить данные из Википедии, и они будут сохранены в нашей базе данных.

Во-первых, нам нужно импортировать необходимые модули Python.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime
import random
import pymysql
import re

Теперь создайте соединение, то есть интегрируйте его с Python.

conn = pymysql.connect(host='127.0.0.1',user='root', passwd = None, db = 'mysql',
charset = 'utf8')
cur = conn.cursor()
cur.execute("USE scrap")
random.seed(datetime.datetime.now())
def store(title, content):
   cur.execute('INSERT INTO scrap_pages (title, content) VALUES ''("%s","%s")', (title, content))
   cur.connection.commit()

Теперь соединитесь с Википедией и получите данные из нее.

def getLinks(articleUrl):
   html = urlopen('http://en.wikipedia.org'+articleUrl)
   bs = BeautifulSoup(html, 'html.parser')
   title = bs.find('h1').get_text()
   content = bs.find('div', {'id':'mw-content-text'}).find('p').get_text()
   store(title, content)
   return bs.find('div', {'id':'bodyContent'}).findAll('a',href=re.compile('^(/wiki/)((?!:).)*$'))
links = getLinks('/wiki/Kevin_Bacon')
try:
   while len(links) > 0:
      newArticle = links[random.randint(0, len(links)-1)].attrs['href']
      print(newArticle)
      links = getLinks(newArticle)

Наконец, нам нужно закрыть как курсор, так и соединение.

finally:
   cur.close()
   conn.close()

Это сохранит собранные данные из Википедии в таблицу с именем scrap_pages. Если вы знакомы с MySQL и веб-очисткой, то приведенный выше код не будет сложным для понимания.

Обработка данных с использованием PostgreSQL

PostgreSQL, разработанный всемирной командой добровольцев, представляет собой систему управления реляционными базами данных с открытым исходным кодом (RDMS). Процесс обработки очищенных данных с использованием PostgreSQL аналогичен процессу MySQL. Будет два изменения: во-первых, команды будут отличаться от MySQL, а во-вторых, здесь мы будем использовать библиотеку Python psycopg2 для ее интеграции с Python.

Если вы не знакомы с PostgreSQL, вы можете узнать его по адресу https://www.tutorialspoint.com/postgresql/. И с помощью следующей команды мы можем установить библиотеку Python psycopg2 —

pip install psycopg2 

Обработка изображений и видео

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

Вступление

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

Получение медиа-контента с веб-страницы

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

Во-первых, нам нужно импортировать необходимые модули Python следующим образом:

import requests

Теперь укажите URL медиа-контента, который мы хотим загрузить и сохранить локально.

url = "https://authoraditiagarwal.com/wpcontent/uploads/2018/05/MetaSlider_ThinkBig-1080x180.jpg"

Используйте следующий код для создания объекта ответа HTTP.

r = requests.get(url) 

С помощью следующей строки кода мы можем сохранить полученный контент в виде файла .png.

with open("ThinkBig.png",'wb') as f:
   f.write(r.content) 

После запуска вышеуказанного скрипта Python мы получим файл с именем ThinkBig.png, в котором будет загруженный образ.

Извлечение имени файла из URL

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

С помощью следующего скрипта Python, используя urlparse , мы можем извлечь имя файла из URL —

import urllib3
import os
url = "https://authoraditiagarwal.com/wpcontent/uploads/2018/05/MetaSlider_ThinkBig-1080x180.jpg"
a = urlparse(url)
a.path

Вы можете наблюдать результат, как показано ниже —

'/wp-content/uploads/2018/05/MetaSlider_ThinkBig-1080x180.jpg'
os.path.basename(a.path)

Вы можете наблюдать результат, как показано ниже —

'MetaSlider_ThinkBig-1080x180.jpg'

Как только вы запустите приведенный выше скрипт, мы получим имя файла из URL.

Информация о типе контента из URL

При извлечении содержимого с веб-сервера по запросу GET мы также можем проверить его информацию, предоставленную веб-сервером. С помощью следующего скрипта Python мы можем определить, что означает веб-сервер с типом контента —

Во-первых, нам нужно импортировать необходимые модули Python следующим образом:

import requests

Теперь нам нужно предоставить URL медиа-контента, который мы хотим загрузить и сохранить локально.

url = "https://authoraditiagarwal.com/wpcontent/uploads/2018/05/MetaSlider_ThinkBig-1080x180.jpg"

Следующая строка кода создаст объект ответа HTTP.

r = requests.get(url, allow_redirects=True)

Теперь мы можем узнать, какую информацию о контенте может предоставить веб-сервер.

for headers in r.headers: print(headers)

Вы можете наблюдать результат, как показано ниже —

Date
Server
Upgrade
Connection
Last-Modified
Accept-Ranges
Content-Length
Keep-Alive
Content-Type

С помощью следующей строки кода мы можем получить конкретную информацию о типе контента, скажем, тип контента —

print (r.headers.get('content-type'))

Вы можете наблюдать результат, как показано ниже —

image/jpeg

С помощью следующей строки кода мы можем получить конкретную информацию о типе контента, скажем, EType —

print (r.headers.get('ETag'))

Вы можете наблюдать результат, как показано ниже —

None

Соблюдайте следующую команду —

print (r.headers.get('content-length'))

Вы можете наблюдать результат, как показано ниже —

12636

С помощью следующей строки кода мы можем получить конкретную информацию о типе контента, скажем, Server —

print (r.headers.get('Server'))

Вы можете наблюдать результат, как показано ниже —

Apache

Создание миниатюры для изображений

Миниатюра — это очень маленькое описание или представление. Пользователь может захотеть сохранить только миниатюру большого изображения или сохранить как изображение, так и миниатюру. В этом разделе мы собираемся создать эскиз изображения под названием ThinkBig.png, загруженного в предыдущем разделе «Получение медиа-контента с веб-страницы».

Для этого скрипта Python нам нужно установить библиотеку Python с именем Pillow, вилку библиотеки изображений Python, имеющую полезные функции для работы с изображениями. Это может быть установлено с помощью следующей команды —

pip install pillow

Следующий скрипт Python создаст миниатюру изображения и сохранит его в текущем каталоге, добавив префикс Th_ в файл миниатюр.

import glob
from PIL import Image
for infile in glob.glob("ThinkBig.png"):
   img = Image.open(infile)
   img.thumbnail((128, 128), Image.ANTIALIAS)
   if infile[0:2] != "Th_":
      img.save("Th_" + infile, "png")

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

Скриншот с сайта

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

From selenium import webdriver
path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
browser = webdriver.Chrome(executable_path = path)
browser.get('https://tutorialspoint.com/')
screenshot = browser.save_screenshot('screenshot.png')
browser.quit

Вы можете наблюдать результат, как показано ниже —

DevTools listening on ws://127.0.0.1:1456/devtools/browser/488ed704-9f1b-44f0-
a571-892dc4c90eb7
<bound method WebDriver.quit of <selenium.webdriver.chrome.webdriver.WebDriver
(session="37e8e440e2f7807ef41ca7aa20ce7c97")>>

После запуска скрипта вы можете проверить текущий каталог на файл screenshot.png .

Скриншот

Генерация миниатюр для видео

Предположим, мы загрузили видео с веб-сайта и хотели создать для них миниатюры, чтобы можно было щелкнуть конкретное видео на основе его миниатюры. Для создания миниатюры для видео нам нужен простой инструмент под названием ffmpeg, который можно скачать с www.ffmpeg.org . После загрузки нам необходимо установить его в соответствии со спецификациями нашей ОС.

Следующий скрипт Python сгенерирует миниатюру видео и сохранит его в нашем локальном каталоге —

import subprocess
video_MP4_file = “C:\Users\gaurav\desktop\solar.mp4
thumbnail_image_file = 'thumbnail_solar_video.jpg'
subprocess.call(['ffmpeg', '-i', video_MP4_file, '-ss', '00:00:20.000', '-
   vframes', '1', thumbnail_image_file, "-y"]) 

После запуска вышеуказанного скрипта мы получим миниатюру с именем thumbnail_solar_video.jpg, сохраненную в нашем локальном каталоге.

Копирование видео MP4 в MP3

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

pip install moviepy

Теперь, после успешной установки moviepy с помощью следующего скрипта, мы можем конвертировать MP4 в MP3.

import moviepy.editor as mp
clip = mp.VideoFileClip(r"C:\Users\gaurav\Desktop\1234.mp4")
clip.audio.write_audiofile("movie_audio.mp3")

Вы можете наблюдать результат, как показано ниже —

[MoviePy] Writing audio in movie_audio.mp3
100%|¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 674/674 [00:01<00:00,
476.30it/s]
[MoviePy] Done.

Приведенный выше скрипт сохранит аудиофайл MP3 в локальном каталоге.

Python Web Scraping — Работа с текстом

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

Вступление

Вы можете выполнить анализ текста с помощью библиотеки Python, которая называется Natural Language Tool Kit (NLTK). Прежде чем перейти к концепции NLTK, давайте разберемся в связи между анализом текста и анализом веб-страниц.

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

Начало работы с NLTK

Инструментарий естественного языка (NLTK) — это коллекция библиотек Python, которая разработана специально для идентификации и маркировки частей речи, встречающихся в тексте на естественном языке, таком как английский.

Установка НЛТК

Вы можете использовать следующую команду для установки NLTK в Python —

pip install nltk

Если вы используете Anaconda, тогда пакет conda для NLTK может быть собран с помощью следующей команды —

conda install -c anaconda nltk

Загрузка данных НЛТК

После установки NLTK мы должны загрузить предустановленные текстовые репозитории. Но перед загрузкой текстовых предустановленных репозиториев нам необходимо импортировать NLTK с помощью команды import следующим образом:

mport nltk

Теперь с помощью следующей команды NLTK можно загрузить данные —

nltk.download()

Установка всех доступных пакетов NLTK займет некоторое время, но всегда рекомендуется устанавливать все пакеты.

Установка других необходимых пакетов

Нам также нужны некоторые другие пакеты Python, такие как gensim и pattern, для анализа текста, а также для создания приложений обработки естественного языка с использованием NLTK.

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

pip install gensim

pattern — Используется для правильной работы пакета gensim . Это может быть установлено следующей командой —

pip install pattern

лексемизацию

Процесс разбиения данного текста на более мелкие единицы, называемые токенами, называется токенизацией. Этими токенами могут быть слова, цифры или знаки препинания. Это также называется сегментация слова .

пример

лексемизацию

Модуль NLTK предоставляет различные пакеты для токенизации. Мы можем использовать эти пакеты согласно нашему требованию. Некоторые из пакетов описаны здесь —

Пакет sent_tokenize — этот пакет разделит введенный текст на предложения. Вы можете использовать следующую команду для импорта этого пакета —

from nltk.tokenize import sent_tokenize

Пакет word_tokenize — этот пакет разделит введенный текст на слова. Вы можете использовать следующую команду для импорта этого пакета —

from nltk.tokenize import word_tokenize

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

from nltk.tokenize import WordPuncttokenizer

Морфологический

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

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

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

Пакет PorterStemmer . Алгоритм Портера используется этим пакетом stemming для извлечения базовой формы. Вы можете использовать следующую команду для импорта этого пакета —

from nltk.stem.porter import PorterStemmer

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

Пакет LancasterStemmer. Алгоритм Lancaster используется этим пакетом stemming для извлечения базовой формы. Вы можете использовать следующую команду для импорта этого пакета —

from nltk.stem.lancaster import LancasterStemmer

Например, после того, как в качестве входных данных для этого стеммера задано слово «Writing», после стемминга на выходе будет слово «writ» .

Пакет SnowballStemmer. Алгоритм Snowball используется этим пакетом stemming для извлечения базовой формы. Вы можете использовать следующую команду для импорта этого пакета —

from nltk.stem.snowball import SnowballStemmer

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

лемматизации

Другой способ извлечь базовую форму слов — лемматизация, обычно целью которой является удаление флективных окончаний с помощью словарного и морфологического анализа. Базовая форма любого слова после лемматизации называется леммой.

Модуль NLTK предоставляет следующие пакеты для лемматизации —

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

from nltk.stem import WordNetLemmatizer

лязг

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

пример

В этом примере мы собираемся реализовать разбиение Noun-Phrase с помощью модуля NLTK Python. NP chunking — это категория фрагментирования, которая найдет в предложении фрагменты имен существительных.

Шаги по реализации разбиения имен существительных

Нам нужно следовать приведенным ниже шагам для реализации разбиения на именные фразы —

Шаг 1 — Определение грамматики чанка

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

Шаг 2 — Создание парсера чанка

Теперь мы создадим парсер чанков. Было бы разобрать грамматику и дать вывод.

Шаг 3 — Выход

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

Во-первых, нам нужно импортировать пакет NLTK следующим образом:

import nltk

Далее нам нужно определить предложение. Здесь DT: определитель, VBP: глагол, JJ: прилагательное, IN: предлог и NN: существительное.

sentence = [("a", "DT"),("clever","JJ"),("fox","NN"),("was","VBP"),("jumping","VBP"),("over","IN"),("the","DT"),("wall","NN")]

Далее мы даем грамматику в форме регулярного выражения.

grammar = "NP:{<DT>?<JJ>*<NN>}"

Теперь следующая строка кода определит парсер для разбора грамматики.

parser_chunking = nltk.RegexpParser(grammar)

Теперь парсер проанализирует предложение.

parser_chunking.parse(sentence)

Далее мы даем наш вывод в переменной.

Output = parser_chunking.parse(sentence)

С помощью следующего кода мы можем нарисовать наш вывод в виде дерева, как показано ниже.

output.draw()

Фраза Чанкинг

Модель Bag of Word (BoW) Извлечение и преобразование текста в цифровую форму

Bag of Word (BoW), полезная модель в обработке естественного языка, в основном используется для извлечения функций из текста. После извлечения функций из текста его можно использовать при моделировании в алгоритмах машинного обучения, поскольку необработанные данные нельзя использовать в приложениях ML.

Рабочая модель BoW

Изначально модель извлекает словарь из всех слов в документе. Позже, используя матрицу терминов документа, он построит модель. Таким образом, модель BoW представляет документ только как пакет слов, а порядок или структура отбрасываются.

пример

Предположим, у нас есть следующие два предложения —

Предложение1 — это пример модели Bag of Words.

Предложение 2 — Мы можем извлекать функции, используя модель Bag of Words.

Теперь, рассматривая эти два предложения, мы имеем следующие 14 различных слов —

  • это
  • является
  • пример
  • мешок
  • из
  • слова
  • модель
  • мы
  • Можно
  • экстракт
  • функции
  • от
  • с помощью

Построение модели мешка слов в НЛТК

Давайте посмотрим на следующий скрипт Python, который создаст модель BoW в NLTK.

Сначала импортируйте следующий пакет —

from sklearn.feature_extraction.text import CountVectorizer 

Затем определите набор предложений —

Sentences=['This is an example of Bag of Words model.', ' We can extract
   features by using Bag of Words model.']
   vector_count = CountVectorizer()
   features_text = vector_count.fit_transform(Sentences).todense()
   print(vector_count.vocabulary_)

Выход

Это показывает, что у нас есть 14 различных слов в двух вышеупомянутых предложениях —

{
   'this': 10, 'is': 7, 'an': 0, 'example': 4, 'of': 9, 
   'bag': 1, 'words': 13, 'model': 8, 'we': 12, 'can': 3, 
   'extract': 5, 'features': 6, 'by': 2, 'using':11
}

Моделирование темы: идентификация шаблонов в текстовых данных

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

Вы можете использовать тематическое моделирование в следующих сценариях —

Классификация текста

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

Рекомендательные Системы

Мы можем создавать рекомендательные системы, используя меры сходства.

Алгоритмы моделирования тем

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

Латентное распределение Дирихле (LDA) — это один из самых популярных алгоритмов, который использует вероятностные графические модели для реализации тематического моделирования.

Скрытый семантический анализ (LDA) или Скрытое семантическое индексирование (LSI) — Он основан на линейной алгебре и использует концепцию SVD (разложение по единственному значению) в матрице терминов документа.

Неотрицательная матричная факторизация (NMF) — она ​​также основана на линейной алгебре, как и LDA.

Вышеупомянутые алгоритмы будут иметь следующие элементы —

  • Количество тем: Параметр
  • Матрица документ-слово: ввод
  • WTM (матрица тем Word) и TDM (матрица документов тем): вывод

Python Web Scraping — Динамические сайты

Вступление

Соскоб в Интернете — сложная задача, и сложность увеличивается, если сайт динамический. Согласно Глобальному аудиту доступности веб-сайтов Организации Объединенных Наций, более 70% веб-сайтов являются динамичными по своей природе, и для своей функциональности они используют JavaScript.

Пример динамического сайта

Давайте посмотрим на пример динамического веб-сайта и узнаем о том, почему его трудно очистить. Здесь мы собираемся взять пример поиска с веб-сайта с именем http://example.webscraping.com/places/default/search. Но как мы можем сказать, что этот сайт имеет динамичный характер? Об этом можно судить по выводу следующего скрипта Python, который попытается очистить данные с вышеупомянутой веб-страницы —

import re
import urllib.request
response = urllib.request.urlopen('http://example.webscraping.com/places/default/search')
html = response.read()
text = html.decode()
re.findall('(.*?)',text)

Выход

[ ]

Приведенный выше вывод показывает, что пример скребка не смог извлечь информацию, потому что элемент <div>, который мы пытаемся найти, пуст.

Подходы для очистки данных с динамических сайтов

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

  • Обратный инжиниринг JavaScript
  • Рендеринг JavaScript

Обратный инжиниринг JavaScript

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

Для этого нам нужно щелкнуть вкладку inspect element для указанного URL. Далее мы перейдем на вкладку NETWORK, чтобы найти все запросы, сделанные для этой веб-страницы, включая search.json с путем / ajax . Вместо доступа к данным AJAX из браузера или через вкладку NETWORK, мы можем сделать это также с помощью следующего скрипта Python —

import requests
url=requests.get('http://example.webscraping.com/ajax/search.json?page=0&page_size=10&search_term=a')
url.json() 

пример

Приведенный выше скрипт позволяет нам получить доступ к ответу JSON с помощью метода Python json. Точно так же мы можем загрузить необработанный строковый ответ и, используя метод json.loads в python, также можем загрузить его. Мы делаем это с помощью следующего скрипта Python. Он будет в основном очищать все страны, выполняя поиск буквы алфавита «а», а затем перебирая получившиеся страницы ответов JSON.

import requests
import string
PAGE_SIZE = 15
url = 'http://example.webscraping.com/ajax/' + 'search.json?page={}&page_size={}&search_term=a'
countries = set()
for letter in string.ascii_lowercase:
   print('Searching with %s' % letter)
   page = 0
   while True:
   response = requests.get(url.format(page, PAGE_SIZE, letter))
   data = response.json()
   print('adding %d records from the page %d' %(len(data.get('records')),page))
   for record in data.get('records'):countries.add(record['country'])
   page += 1
   if page >= data['num_pages']:
      break
   with open('countries.txt', 'w') as countries_file:
   countries_file.write('n'.join(sorted(countries))) 

После запуска вышеприведенного скрипта мы получим следующий вывод, и записи будут сохранены в файле с именем country.txt.

Выход

Searching with a
adding 15 records from the page 0
adding 15 records from the page 1
...

Рендеринг JavaScript

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

  • Иногда сайты могут быть очень сложными. Например, если веб-сайт создан с помощью расширенного инструмента браузера, такого как Google Web Toolkit (GWT), то полученный в результате код JS будет сгенерирован машинным способом и сложен для понимания и обратного инжиниринга.

  • Некоторые высокоуровневые фреймворки, такие как React.js, могут затруднить обратный инжиниринг, абстрагируя и без того сложную логику JavaScript.

Иногда сайты могут быть очень сложными. Например, если веб-сайт создан с помощью расширенного инструмента браузера, такого как Google Web Toolkit (GWT), то полученный в результате код JS будет сгенерирован машинным способом и сложен для понимания и обратного инжиниринга.

Некоторые высокоуровневые фреймворки, такие как React.js, могут затруднить обратный инжиниринг, абстрагируя и без того сложную логику JavaScript.

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

пример

В этом примере для рендеринга Java Script мы будем использовать знакомый модуль Python Selenium. Следующий код Python будет визуализировать веб-страницу с помощью Selenium —

Во-первых, нам нужно импортировать веб-драйвер из селена следующим образом:

from selenium import webdriver

Теперь укажите путь к веб-драйверу, который мы скачали в соответствии с нашим требованием —

path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
driver = webdriver.Chrome(executable_path = path)

Теперь укажите URL, который мы хотим открыть в этом веб-браузере, который теперь контролируется нашим скриптом Python.

driver.get( 'http://example.webscraping.com/search' )

Теперь мы можем использовать идентификатор панели инструментов поиска для настройки элемента для выбора.

driver.find_element_by_id('search_term').send_keys('.')

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

js = "document.getElementById('page_size').options[1].text = '100';"
driver.execute_script(js)

Следующая строка кода показывает, что поиск готов для нажатия на веб-странице —

driver.find_element_by_id('search').click()

Следующая строка кода показывает, что он будет ждать 45 секунд для завершения запроса AJAX.

driver.implicitly_wait(45)

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

links = driver.find_elements_by_css_selector('#results a')

Теперь текст каждой ссылки может быть извлечен для создания списка стран —

countries = [link.text for link in links]
print(countries)
driver.close()

Python Web Scraping — основанные на форме сайты

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

Вступление

В наши дни WWW (World Wide Web) движется к социальным сетям, а также к пользовательскому контенту. Таким образом, возникает вопрос, как мы можем получить доступ к такой информации, которая находится за пределами экрана входа в систему? Для этого нам нужно разобраться с формами и логинами.

В предыдущих главах мы работали с методом HTTP GET для запроса информации, но в этой главе мы будем работать с методом HTTP POST, который отправляет информацию на веб-сервер для хранения и анализа.

Взаимодействие с формами входа

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

В этом разделе мы рассмотрим простую форму отправки с помощью библиотеки запросов Python.

Для начала нам нужно импортировать библиотеку запросов следующим образом:

import requests

Теперь нам нужно предоставить информацию для полей формы авторизации.

parameters = {‘Name’:’Enter your name’, ‘Email-id’:’Your Emailid’,’Message’:’Type your message here’}

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

r = requests.post(“enter the URL”, data = parameters)
print(r.text)

После запуска скрипта он вернет содержимое страницы, на которой произошло действие.

Предположим, что если вы хотите отправить какое-либо изображение с помощью формы, это очень легко сделать с request.post (). Вы можете понять это с помощью следующего скрипта Python —

import requests
file = {‘Uploadfile’: open(’C:\Usres\desktop\123.png’,‘rb’)}
r = requests.post(“enter the URL”, files = file)
print(r.text)

Загрузка файлов cookie с веб-сервера

Файл cookie, иногда называемый веб-файлом или Интернет-файлом, представляет собой небольшой фрагмент данных, отправляемых с веб-сайта, и наш компьютер сохраняет его в файле, расположенном внутри нашего веб-браузера.

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

Что делают куки?

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

Шаг 1 — Во-первых, сайт аутентифицирует наши учетные данные и сохраняет их в файле cookie нашего браузера. Этот файл cookie обычно содержит сгенерированный сервером ток, информацию о времени ожидания и отслеживании.

Шаг 2 — Далее веб-сайт будет использовать куки в качестве доказательства аутентификации. Эта аутентификация всегда отображается при каждом посещении сайта.

Файлы cookie очень проблематичны для веб-скребков, потому что, если веб-скребки не отслеживают файлы cookie, отправленная форма отправляется обратно, и на следующей странице кажется, что они никогда не входили в систему. Файлы cookie очень легко отследить с помощью Python запрашивает библиотеку, как показано ниже —

import requests
parameters = {‘Name’:’Enter your name’, ‘Email-id’:’Your Emailid’,’Message’:’Type your message here’}
r = requests.post(“enter the URL”, data = parameters)

В приведенной выше строке кода URL будет страницей, которая будет действовать как обработчик для формы входа в систему.

print(‘The cookie is:’)
print(r.cookies.get_dict())
print(r.text)

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

Существует еще одна проблема, связанная с файлами cookie, которые иногда веб-сайты часто изменяют без предупреждения. С такой ситуацией можно справиться с запросами. Сессия () выглядит следующим образом:

import requests
session = requests.Session()
parameters = {‘Name’:’Enter your name’, ‘Email-id’:’Your Emailid’,’Message’:’Type your message here’}
r = session.post(“enter the URL”, data = parameters)

В приведенной выше строке кода URL будет страницей, которая будет действовать как обработчик для формы входа в систему.

print(‘The cookie is:’)
print(r.cookies.get_dict())
print(r.text)

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

Автоматизация форм с помощью Python

В этом разделе мы будем иметь дело с модулем Python под названием Mechanize, который сократит нашу работу и автоматизирует процесс заполнения форм.

Механизировать модуль

Модуль Mechanize предоставляет нам высокоуровневый интерфейс для взаимодействия с формами. Перед началом использования нам нужно установить его с помощью следующей команды —

pip install mechanize

Обратите внимание, что это будет работать только в Python 2.x.

пример

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

import mechanize
brwsr = mechanize.Browser()
brwsr.open(Enter the URL of login)
brwsr.select_form(nr = 0)
brwsr['email'] = Enter email
brwsr['password'] = Enter password
response = brwsr.submit()
brwsr.submit()

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

Python Web Scraping — Обработка CAPTCHA

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

Что такое капча?

Полной формой CAPTCHA является полностью автоматизированный публичный тест Тьюринга, который говорит «Компьютеры и люди отдельно» , который ясно показывает, что это тест для определения, является ли пользователь человеком или нет.

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

Загрузка капчи с Python

Предположим, что мы хотим зарегистрироваться на веб-сайте, и есть форма с CAPTCHA, а затем, перед загрузкой изображения CAPTCHA, мы должны узнать о конкретной информации, требуемой в форме. С помощью следующего скрипта Python мы можем понять требования к форме регистрации на веб-сайте http://example.webscrapping.com.

import lxml.html
import urllib.request as urllib2
import pprint
import http.cookiejar as cookielib
def form_parsing(html):
   tree = lxml.html.fromstring(html)
   data = {}
   for e in tree.cssselect('form input'):
      if e.get('name'):
         data[e.get('name')] = e.get('value')
   return data
REGISTER_URL = '<a target="_blank" rel="nofollow" 
   href="http://example.webscraping.com/user/register">http://example.webscraping.com/user/register'</a>
ckj = cookielib.CookieJar()
browser = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckj))
html = browser.open(
   '<a target="_blank" rel="nofollow" 
      href="http://example.webscraping.com/places/default/user/register?_next">
      http://example.webscraping.com/places/default/user/register?_next</a> = /places/default/index'
).read()
form = form_parsing(html)
pprint.pprint(form)

В приведенном выше скрипте Python сначала мы определили функцию, которая будет анализировать форму с помощью модуля Python lxml, а затем она напечатает требования к форме следующим образом:

{
   '_formkey': '5e306d73-5774-4146-a94e-3541f22c95ab',
   '_formname': 'register',
   '_next': '/places/default/index',
   'email': '',
   'first_name': '',
   'last_name': '',
   'password': '',
   'password_two': '',
   'recaptcha_response_field': None
}

Вы можете проверить из вышеприведенного вывода, что вся информация, кроме recpatcha_response_field , понятна и понятна. Теперь возникает вопрос, как мы можем обработать эту сложную информацию и загрузить CAPTCHA. Это можно сделать с помощью подушки библиотеки Python следующим образом;

Подушка Python Пакет

Подушка — это форк библиотеки изображений Python с полезными функциями для работы с изображениями. Это может быть установлено с помощью следующей команды —

pip install pillow

В следующем примере мы будем использовать его для загрузки CAPTCHA —

from io import BytesIO
import lxml.html
from PIL import Image
def load_captcha(html):
   tree = lxml.html.fromstring(html)
   img_data = tree.cssselect('div#recaptcha img')[0].get('src')
   img_data = img_data.partition(',')[-1]
   binary_img_data = img_data.decode('base64')
   file_like = BytesIO(binary_img_data)
   img = Image.open(file_like)
   return img

Вышеприведенный скрипт Python использует пакет подушек Python и определяет функцию для загрузки изображения CAPTCHA. Он должен использоваться с функцией с именем form_parser () , определенной в предыдущем скрипте, для получения информации о форме регистрации. Этот скрипт сохранит изображение CAPTCHA в полезном формате, который затем может быть извлечен в виде строки.

OCR: извлечение текста из изображения с использованием Python

После загрузки CAPTCHA в полезном формате мы можем извлечь ее с помощью Optical Character Recognition (OCR), процесса извлечения текста из изображений. Для этой цели мы собираемся использовать движок Tesseract OCR с открытым исходным кодом. Это может быть установлено с помощью следующей команды —

pip install pytesseract

пример

Здесь мы расширим приведенный выше скрипт Python, который загрузил CAPTCHA с помощью пакета подушек Python, следующим образом:

import pytesseract
img = get_captcha(html)
img.save('captcha_original.png')
gray = img.convert('L')
gray.save('captcha_gray.png')
bw = gray.point(lambda x: 0 if x < 1 else 255, '1')
bw.save('captcha_thresholded.png')

Приведенный выше скрипт Python будет читать CAPTCHA в черно-белом режиме, который будет понятен и легко передается в tesseract следующим образом:

pytesseract.image_to_string(bw)

После запуска вышеуказанного скрипта мы получим CAPTCHA регистрационной формы в качестве вывода.

Python Web Scraping — Тестирование со скребками

В этой главе объясняется, как выполнить тестирование с использованием веб-скребков в Python.

Вступление

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

Тестирование с использованием Python

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

  • По крайней мере, один аспект функциональности компонента будет тестироваться в каждом модульном тесте.

  • Каждый модульный тест независим и может также выполняться независимо.

  • Модульный тест не мешает успеху или провалу любого другого теста.

  • Модульные тесты могут выполняться в любом порядке и должны содержать хотя бы одно утверждение.

По крайней мере, один аспект функциональности компонента будет тестироваться в каждом модульном тесте.

Каждый модульный тест независим и может также выполняться независимо.

Модульный тест не мешает успеху или провалу любого другого теста.

Модульные тесты могут выполняться в любом порядке и должны содержать хотя бы одно утверждение.

Unittest — модуль Python

Модуль Python с именем Unittest для модульного тестирования поставляется со всей стандартной установкой Python. Нам просто нужно импортировать его, а остальное — задача класса unittest.TestCase, который будет выполнять следующее:

  • Функции SetUp и tearDown предоставляются классом unittest.TestCase. Эти функции могут выполняться до и после каждого модульного теста.

  • Он также предоставляет операторы assert, чтобы тесты могли проходить или не проходить

  • Он запускает все функции, которые начинаются с test_ как модульный тест.

Функции SetUp и tearDown предоставляются классом unittest.TestCase. Эти функции могут выполняться до и после каждого модульного теста.

Он также предоставляет операторы assert, чтобы тесты могли проходить или не проходить

Он запускает все функции, которые начинаются с test_ как модульный тест.

пример

В этом примере мы собираемся объединить очистку веб-страниц с unittest . Мы проверим страницу Википедии для поиска строки «Python». В основном он будет выполнять два теста, первый из которых будет соответствовать заголовку страницы, так же как «Python» или нет, а второй тест проверяет, что страница имеет div содержимого.

Сначала мы импортируем необходимые модули Python. Мы используем BeautifulSoup для просмотра веб-страниц и, конечно, юнит-тест для тестирования.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import unittest

Теперь нам нужно определить класс, который будет расширять unittest.TestCase. Глобальный объект bs будет разделен между всеми тестами. Определенная юнит-тестом функция setUpClass выполнит это. Здесь мы определим две функции: одну для тестирования титульного листа и другую для тестирования содержимого страницы.

class Test(unittest.TestCase):
   bs = None
   def setUpClass():
      url = '<a target="_blank" rel="nofollow" href="https://en.wikipedia.org/wiki/Python">https://en.wikipedia.org/wiki/Python'</a>
      Test.bs = BeautifulSoup(urlopen(url), 'html.parser')
   def test_titleText(self):
      pageTitle = Test.bs.find('h1').get_text()
      self.assertEqual('Python', pageTitle);
   def test_contentExists(self):
      content = Test.bs.find('div',{'id':'mw-content-text'})
      self.assertIsNotNone(content)
if __name__ == '__main__':
   unittest.main()

После запуска вышеуказанного скрипта мы получим следующий вывод —

----------------------------------------------------------------------
Ran 2 tests in 2.773s

OK
An exception has occurred, use %tb to see the full traceback.

SystemExit: False

D:\ProgramData\lib\site-packages\IPython\core\interactiveshell.py:2870:
UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
 warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

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

Давайте обсудим, как использовать Python Selenium для тестирования. Это также называется тестированием Selenium. И Python unittest, и Selenium не имеют много общего. Мы знаем, что Selenium отправляет стандартные команды Python в разные браузеры, несмотря на различия в дизайне их браузера. Напомним, что мы уже устанавливали и работали с Selenium в предыдущих главах. Здесь мы создадим тестовые сценарии в Selenium и используем его для автоматизации.

пример

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

Сначала для подключения к веб-браузеру мы импортируем веб-драйвер из модуля селена —

from selenium import webdriver

Теперь нам нужно импортировать ключи из модуля селена.

from selenium.webdriver.common.keys import Keys

Далее нам нужно предоставить имя пользователя и пароль для входа в нашу учетную запись Facebook

user = "[email protected]"
pwd = ""

Далее укажите путь к веб-драйверу для Chrome.

path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
driver = webdriver.Chrome(executable_path=path)
driver.get(" http://www.facebook.com ")

Теперь мы проверим условия, используя ключевое слово assert.

assert "Facebook" in driver.title

С помощью следующей строки кода мы отправляем значения в раздел электронной почты. Здесь мы ищем его по его идентификатору, но мы можем сделать это, выполнив поиск по имени как driver.find_element_by_name («email») .

element = driver.find_element_by_id("email")
element.send_keys(user)

С помощью следующей строки кода мы отправляем значения в раздел паролей. Здесь мы ищем его по его идентификатору, но мы можем сделать это, выполнив поиск по имени как driver.find_element_by_name («pass») .

element = driver.find_element_by_id("pass")
element.send_keys(pwd)

Следующая строка кода используется для нажатия ввода / входа после ввода значений в поле электронной почты и пароля.

element.send_keys(Keys.RETURN)

Теперь мы закроем браузер.

driver.close()

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

Логин в фейсбук

Сравнение: юнит-тест или селен

Сравнение юниттеста и селена затруднительно, потому что если вы хотите работать с большими тестовыми наборами, требуется синтаксическая жесткость соединений. С другой стороны, если вы собираетесь тестировать гибкость веб-сайта, то Selenium test будет нашим первым выбором. Но что, если мы сможем объединить их обоих? Мы можем импортировать селен в Python unittest и получить лучшее из обоих. Selenium может использоваться для получения информации о веб-сайте, а unittest может оценить, соответствует ли эта информация критериям для прохождения теста или нет.

Например, мы переписываем вышеприведенный скрипт Python для автоматизации входа в Facebook, объединяя их обоих следующим образом: