Парсинг данных Instagram с использованием Python и Selenium
Парсинг веб-сайтов - это метод, используемый для автоматического сбора информации, такой как числа, текст, таблицы и медиа, с различных веб-сайтов. Парсинг веб-сайтов в основном автоматически копирует и вставляет все, что отображается на странице.
В этой статье я расскажу о парсинге данных Instagram с использованием Python и библиотеки Selenium. Мы попробуем получить данные о подписчиках, подписках, количестве публикаций, подписях, количестве лайков и комментариев к публикациям. Эти данные могут быть использованы для создания мониторинга социальных медиа, моделирования тем, анализа настроений и других методов машинного обучения.
Для выполнения парсинга нам понадобится HTML-элемент, который находится на веб-странице. Чтобы просмотреть все HTML-элементы, щелкните правой кнопкой мыши и выберите «Проверить». Затем вы увидите следующий экран:
После того, как мы узнали, как получить HTML-элементы на веб-странице, перейдем к процессу парсинга данных Instagram.
Для использования Selenium необходим chromedriver. Загрузите chromedriver для Windows (выберите chromedriver_win32.zip). Затем откройте загруженный zip-файл.
https://chromedriver.chromium.org/downloads
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-адреса публикаций на открытом профиле.
href = "/p/CmbW75Cy-yE/" указывает на идентификатор публикации. Если этот идентификатор добавить к URL-адресу Instagram (www.instagram.com), получится URL-адрес этой публикации. Вот пример полученного URL-адреса публикации: www.instagram.com/p/CmbW75Cy-yE/
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