CoderCastrov logo
CoderCastrov
Selenium Webdriver

Парсинг Instagram с помощью Selenium Python

Парсинг Instagram с помощью Selenium Python
просмотров
9 мин чтение
#Selenium Webdriver

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

Почему использовать Selenium?

Как мы знаем, что многие инструменты могут быть использованы для парсинга данных с веб-сайта, и три самых популярных из них - Scrapy, Beautifulsoup и Selenium. Однако каждый из них имеет особую способность для своего действия по парсингу веб-сайта.

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

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

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

Требования

Что вы узнаете

Вы получите знания о теории Selenium Python (автоматический вход в систему, автоматическое нажатие, автоматическая прокрутка страницы вниз, автоматическая загрузка).

Загрузка webdriver или geckodriver

Одним из инструментов, которые мы должны подготовить для запуска программы Selenium, является webdriver (для Chrome) или geckodriver (для Firefox). Вы можете загрузить его отсюда (для пользователей Chrome) или отсюда (для пользователей Firefox).

Установка необходимых библиотек

Сначала мы должны установить библиотеку Selenium в нашем терминале, например, следующим кодом:

pip install selenium

После этого мы должны установить некоторые необходимые библиотеки Python, такие как time и requests, как показано в коде ниже:

pip install time

и

pip install requests

Отлично! Наша среда для парсинга готова, и приступим к написанию кода!

Импорт необходимых библиотек

Вот код, который отвечает за импорт необходимых библиотек для парсинга с использованием Selenium:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time, urllib.request
import requests

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

Настройка кода PATH

Код PATH - это код, который связывает наш код с браузером. Вот логика кода PATH:

PATH = r"C:\download\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(PATH)

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

Получение веб-сайта Instagram

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

driver.get("https://www.instagram.com/")

Затем вы можете сохранить этот код и запустить его! И посмотрите...

Отлично! Наш автоматический бот успешно получает доступ к веб-сайту Instagram автоматически.

Вход в наш аккаунт Instagram

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

Сначала мы должны установить время ожидания с помощью библиотеки time, затем мы создаем код для входа в наш аккаунт Instagram, как показано ниже:

# Вход
time.sleep(5)
username = driver.find_element_by_css_selector("input[name='username']")
password = driver.find_element_by_css_selector("input[name='password']")
username.clear()
password.clear()
username.send_keys("xxxxxx")
password.send_keys("123456")
login = driver.find_element_by_css_selector("button[type='submit']").click()

Однако 5 - это время ожидания перед выполнением следующего кода. Время задается в секундах.

Затем мы должны узнать элемент для поля ввода имени пользователя, которое используется для входа в наш аккаунт Instagram, путем инспектирования элемента (CTRL+SHIFT+I), как показано на изображении ниже:

где столбец элементов выглядит следующим образом:

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

Согласно изображению выше, селектор поля ввода имени пользователя - input. А имя поля ввода имени пользователя - username. Затем код будет выглядеть так: username = driver.find_element_by_css_selector("input[name='username']").

То же самое применяется к переменной password, которая представлена на изображении ниже:

и столбце элементов ниже:

Мы можем получить тип селектора CSS для поля ввода пароля, который называется input, и его имя - password. Затем мы должны ввести наше имя пользователя и пароль для нашего аккаунта Instagram с помощью опции send_keys в этих строках. В этом случае я использую имя пользователя "xxxxxx" и пароль "123456".

Следующий шаг - автоматический клик по кнопке входа. Это можно сделать с помощью кода login = driver.find_element_by_css_selector("button[type='submit']").click(), где все то же самое, что и при создании переменных username и password ранее. Но для этого действия мы должны добавить опцию click в конце строки для автоматического клика, названную .click().

Хорошо, давайте запустим код и посмотрим!

Отличная работа! Мы сделали это!

Автоматическое пропускание всплывающего окна

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

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

# Сохранить информацию о входе?
time.sleep(10)
notnow = driver.find_element_by_xpath("//button[contains(text(), 'Не сейчас')]").click()
# Включить уведомления
time.sleep(10)
notnow2 = driver.find_element_by_xpath("//button[contains(text(), 'Не сейчас')]").click()

Вышеуказанный код объясняет, что первый шаг, который мы должны выполнить для пропуска всплывающего окна с названием Сохранить информацию о входе, заключается в создании переменной Не сейчас, например, notnow = driver.find_element_by_xpath(“//button[contains(text(), 'Не сейчас')]").click().

В данном случае, мы пытаемся получить элемент переменной Не сейчас с помощью метода find_element_by_xpath, как объясняется на веб-сайте Selenium Python здесь. Когда мы используем метод xpath для поиска расположения элемента, мы можем использовать целевой текст. Например, мы используем текст с названием Не сейчас, когда хотим получить расположение элемента Не сейчас во всплывающем уведомлении с помощью метода xpath, как показано на изображении ниже:

где столбец элементов выглядит следующим образом:

Запустим его! И если вы сделали это, то вы можете найти второе всплывающее уведомление, как показано на изображении ниже:

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

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

и столбца элементов, как показано ниже:

таким образом, код будет выглядеть следующим образом: notnow2 = driver.find_element_by_xpath(“//button[contains(text(), 'Не сейчас')]").click().

Давайте проверим код! Запустите его и посмотрите! (если этот шаг завершен, вы увидите основную страницу вашей учетной записи Instagram).

Обработка поисковой строки

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

Search Box

Затем мы должны получить элемент поисковой строки, чтобы автоматически заполнить пустое поле. В данном случае мы используем публичный аккаунт Instagram с именем host.py. (просто нажмите, чтобы увидеть аккаунт)

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

# поисковая строка
time.sleep(5)
searchbox = driver.find_element_by_css_selector("input[placeholder='Search']")
searchbox.clear()
searchbox.send_keys("host.py")
time.sleep(5)
searchbox.send_keys(Keys.ENTER)
time.sleep(5)
searchbox.send_keys(Keys.ENTER)

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

И мы должны создать переменную searchbox с помощью кода searchbox = driver.find_element_by_css_selector("input[placeholder='Search']"), где тип этого поля - это input. Тип селектора - placeholder с названием Search, как показано на изображении ниже (вы можете найти его, проверив элементы):

Search Box Selector

Затем мы должны использовать опцию send_keys из библиотеки, чтобы автоматически ввести имя целевого аккаунта Instagram в поисковую строку, например searchbox.send_keys("host.py").

Затем мы должны автоматически создать кнопку Enter, заполнив код с помощью опции Keys.ENTER. (Примечание: мы должны создать ее дважды и проверить на веб-сайте аккаунта Instagram для отладки)

Наконец, если мы закончили и успешно запустили код, то мы найдем целевой профиль Instagram, как показано на изображении ниже:

Target Profile

Отлично сработано! Вы справились!

Прокрутите профиль вниз

Поскольку у нас уже есть страница профиля для целевого пользователя, мы можем предположить, что мы уже скрепили эту страницу ранее. Однако, сначала нам нужно автоматически прокрутить страницу вниз. Вот код:

# Прокрутка
прокруткавниз = driver.execute_script("window.scrollTo(0, document.body.scrollHeight);var прокруткавниз=document.body.scrollHeight;return прокруткавниз;")
совпадение = False
while(совпадение == False):
    последний_счет = прокруткавниз
    time.sleep(3)
    прокруткавниз = driver.execute_script("window.scrollTo(0, document.body.scrollHeight);var прокруткавниз=document.body.scrollHeight;return прокруткавниз;")
    if последний_счет == прокруткавниз:
        совпадение = True

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

Получение постов URL

Теперь пришло время получить эти URL-посты, которые размещены на https://instagram.com/host.py/!

Как мы знаем, что там есть 11 постов в виде изображений. Поэтому мы можем создать код, как показано на изображении ниже:

code

Согласно изображению выше, мы должны создать пустой список, который будет использоваться для хранения всех URL-постов с именем posts, и мы можем написать код, как показано ниже:

posts = []

Затем мы создаем переменную links, которая будет получать все элементы с тегом “a”. Затем создаем цикл for, чтобы получить все URL-посты, следуя коду на изображении выше, и выводим их!

Теперь код для получения всех URL-постов создан. Мы можем проверить его и увидеть! (просто подождите несколько минут)

output

В точности! Изображение выше представляет все URL-посты на странице, которые показывают 11 URL-адресов. Хорошая работа!

Скачать все посты

Наконец, нам нужно скачать все посты и сохранить их в директорию, где сохранен скрипт. Вот код:

На изображении выше объясняется, что мы должны сначала создать переменную для хранения имен всех изображений, которые мы хотим скачать, с именем shortcode. Например, если имя URL первого поста https://www.instagram.com/p/CNMnQ0JAPfA/, то мы можем назвать файл CNMnQ0JAPfA.jpg. Затем это должно быть применено к другим файлам.

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

Заключение

Наконец, мы полностью разобрались с кодом. Так что чего мы ждем? Вот сам код:

# Вставьте здесь свой код парсинга

Запустим и посмотрим!

Надеюсь, это поможет!

Давайте свяжемся: https://github.com/arrlanyhars