CoderCastrov logo
CoderCastrov
Парсер

Парсинг данных Instagram с использованием Python и Selenium

Парсинг данных Instagram с использованием Python и Selenium
просмотров
4 мин чтение
#Парсер

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

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

Для выполнения парсинга нам понадобится HTML-элемент, который находится на веб-странице. Чтобы просмотреть все HTML-элементы, щелкните правой кнопкой мыши и выберите «Проверить». Затем вы увидите следующий экран:

Элементы HTML на странице Instagram

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

Для использования Selenium необходим chromedriver. Загрузите chromedriver для Windows (выберите chromedriver_win32.zip). Затем откройте загруженный zip-файл.

https://chromedriver.chromium.org/downloads

Загрузка chromedriver chromedriver.exe

2. Импорт библиотек

import pandas as pd
import datetime
import time
import random
import pytz

# Библиотека для парсинга
import warnings
warnings.filterwarnings("ignore")
from selenium import webdriver
from selenium.webdriver.common.by import By

pd.set_option('display.max_colwidth', None)

3. Вход в Instagram

В этом процессе chromedriver автоматически выполняет вход, вводя имя пользователя и пароль Instagram.

driver = webdriver.Chrome(r"C:\\Users\\chromedriver.exe")
user_ig = "vipohon"
pass_ig = "********"


driver.get("https://www.instagram.com/")
    
timesleep = random.randint(1, 5)
time.sleep(timesleep)
    
# очистка поля ввода имени пользователя и пароля, если они уже заполнены
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(user_ig)
password.send_keys(pass_ig)
    
# нажатие кнопки входа на странице Instagram
login = driver.find_element_by_css_selector("button[type='submit']").click()

4. Получение URL-адресов публикаций

В этом процессе мы получим все URL-адреса публикаций на открытом профиле.

url = "https://www.instagram.com/nfitriyah/"
url_postingan_list = []

time.sleep(10)

driver.get(url)

last_height = driver.execute_script("return document.body.scrollHeight")
scroll_times = 0
    
while True:
    
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(timesleep)

    new_height = driver.execute_script("return document.body.scrollHeight")

    if ((new_height == last_height) or (scroll_times == 30)):  #scroll_times можно изменить 
        break
    
    elems = len(driver.find_elements(by=By.XPATH, value='//div[@class="_aabd _aa8k _aanf"]/a'))
    print(elems)
    for p in list(range(0,elems)):
        url = driver.find_elements(by=By.XPATH, value='//div[@class="_aabd _aa8k _aanf"]/a')[p].get_attribute('href')
        url_postingan_list.append(url)
        
    df_url_postingan = pd.DataFrame(url_postingan_list, columns=['url'])
    
    last_height = new_height
    scroll_times += 1

df_url_postingan=df_url_postingan['url'].drop_duplicates()
df_url_postingan=df_url_postingan.reset_index()
df_url_postingan=df_url_postingan[['url']]
df_url_postingan.tail()

Вывод:

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

Полученные URL-адреса публикаций

href = "/p/CmbW75Cy-yE/" указывает на идентификатор публикации. Если этот идентификатор добавить к URL-адресу Instagram (www.instagram.com), получится URL-адрес этой публикации. Вот пример полученного URL-адреса публикации: www.instagram.com/p/CmbW75Cy-yE/

Пример URL-адреса публикации

5. Получение данных профиля

В этом процессе мы получим количество публикаций, количество подписчиков и количество подписок.

jumlah_post = []
jumlah_followers = []
jumlah_following = []

post = driver.find_elements(by=By.XPATH, value='//div[@class="_aacl _aacp _aacu _aacx _aad6 _aade"]//span[@class="_ac2a"]')[0].text
followers = driver.find_elements(by=By.XPATH, value='//div[@class="_aacl _aacp _aacu _aacx _aad6 _aade"]//span[@class="_ac2a"]')[1].get_attribute("title")
following = driver.find_elements(by=By.XPATH, value='//div[@class="_aacl _aacp _aacu _aacx _aad6 _aade"]//span[@class="_ac2a"]')[2].text

jumlah_post.append(post)
jumlah_followers.append(followers)
jumlah_following.append(following)

df_profil = pd.DataFrame(list(zip(jumlah_post,jumlah_followers,jumlah_following)),
                          columns =['jumlah_post','jumlah_followers','jumlah_following'])
df_profil

Вывод:

Данные профиля

6. Получение данных публикаций

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

id_post = []
jumlah_likes = []
caption_post = []
url_post = []
tanggal_post = []

for u in df_url_postingan['url']:
    
    idpost = u[-12:-1]
    id_post.append(idpost)
    
    url_post.append(u)
    
    driver.get(u)
    time.sleep(5)
    
    likes = driver.find_elements(by=By.XPATH, value='//div[@class="_aacl _aaco _aacw _aacx _aada _aade"]/span')[0].text
    jumlah_likes.append(likes)
    
    user_caption = driver.find_elements(by=By.XPATH, value='//span[@class="_aap6 _aap7 _aap8"]/a')[1].text
    
    if user_caption == 'nfitriyah':
        caption = driver.find_elements(by=By.XPATH, value='//div[@class="_a9zs"]/span')[0].text
        caption_post.append(caption)
    else:
        caption = ''
        caption_post.append(caption)
    
    tanggal = driver.find_element(by=By.XPATH, value='//div[@class="_a9zr"]//div[@class="_aacl _aacn _aacu _aacy _aad6"]/time').get_attribute("datetime")
    waktu = datetime.datetime.strptime(tanggal, "%Y-%m-%dT%H:%M:%S.%fZ")
    tanggalpost = waktu.replace(tzinfo=pytz.UTC)
    tanggalpost = tanggalpost.astimezone(pytz.timezone("Asia/Jakarta"))
    tanggalpost = tanggalpost.strftime('%Y-%m-%d %H:%M:%S')
    tanggal_post.append(tanggalpost)
    
df_urlpost = pd.DataFrame(list(zip(id_post, jumlah_likes, caption_post, url_post, tanggal_post)),
                          columns =['id_post', 'jumlah_likes', 'caption_post', 'url_post', 'tanggal_post'])
df_urlpost

Вывод:

Данные публикаций

7. Получение данных комментариев

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

comment = []
id_post = []
url_post = []
username_comment = []
url_comment = []
tanggal_komen = []

for u in df_url_postingan['url'][0:5]:
    idpost = u[-12:-1]
    
    driver.get(u)
    time.sleep(5)
    
    for i in range (2):
        hasLoadMore = True
        while hasLoadMore:
            timesleep = random.randint(1, 5)
            time.sleep(timesleep)
            try:
                if driver.find_element(by=By.XPATH, value='//li//div[@class="_ab8w  _ab94 _ab99 _ab9h _ab9m _ab9p  _abcj _abcm"]//button[@class="_abl-"]'):
                    driver.find_element(by=By.XPATH, value='//li//div[@class="_ab8w  _ab94 _ab99 _ab9h _ab9m _ab9p  _abcj _abcm"]//button[@class="_abl-"]').click()
                
            except:
                hasLoadMore = False
    
    len_komen = len(driver.find_elements(by=By.XPATH, value='//ul[@class="_a9ym"]//span[@class="_aacl _aaco _aacu _aacx _aad7 _aade"]'))
    
    if len_komen>1:
        for p in list(range(0,len_komen)):
            komentar = driver.find_elements(by=By.XPATH, value='//ul[@class="_a9ym"]//span[@class="_aacl _aaco _aacu _aacx _aad7 _aade"]')[p].text
            comment.append(komentar)
            
            username = driver.find_elements(by=By.XPATH, value='//ul[@class="_a9ym"]//span[@class="_aap6 _aap7 _aap8"]/a')[p].text
            username_comment.append(username)
            
            urlcomment = driver.find_elements(by=By.XPATH, value='//ul[@class="_a9ym"]//div[@class="_aacl _aacn _aacu _aacy _aad6"]/a')[p].get_attribute('href')
            url_comment.append(urlcomment)
            
            id_post.append(idpost)
            url_post.append(u)
            
            tanggal = driver.find_elements(by=By.XPATH, value='//ul[@class="_a9ym"]//div[@class="_a9zr"]//div[@class="_aacl _aacn _aacu _aacy _aad6"]/a/time')[p].get_attribute("datetime")
            waktu = datetime.datetime.strptime(tanggal, "%Y-%m-%dT%H:%M:%S.%fZ")
            tanggalkomen = waktu.replace(tzinfo=pytz.UTC)
            tanggalkomen = tanggalkomen.astimezone(pytz.timezone("Asia/Jakarta"))
            tanggalkomen = tanggalkomen.strftime('%Y-%m-%d %H:%M:%S')
            tanggal_komen.append(tanggalkomen)
            
df_comment = pd.DataFrame(list(zip(id_post,comment,username_comment, url_post, url_comment, tanggal_komen)),
                          columns =['id_post','comment','username_comment', 'url_post', 'url_comment', 'tanggal_komen'])
df_comment

Вывод:

Данные комментариев

Ссылки:

https://algorit.ma/blog/web-scraping-adalah-2022/ https://medium.com/@patrick.yoho11/installing-selenium-and-chromedriver-on-windows-e02202ac2b08