인스타그램 사진 크롤링: Python, selenium근황2023. 9. 7. 18:04
Table of Contents
친구가 갑자기 인스타그램 사진 크롤링을 부탁해왔다.
요즘 AI 학습 만진다더니 그거에 필요한 자료를 모으는 모양...
왜 인스타에서 모으는진 모르겠으나 간단히 구글링 해보니 여러 선행자료들이 나와있었다.
그걸보고 하면 되지 않겠느냐~ 했더니 실행이 안된단다.
요구사항은 좀 많았는데, 우선순위였던 '이미지, 태그' 이 두가지에 집중해서 건내줬다.
인스타를 계정만 만들고 안하는지라 구조도 몰랐는데 이번에 크롤링 코드를 보고 조금 최신화시키면서 들여다보게 되었다.
피네스타처럼 로그인을 안하면 사진 더 살펴보거나 자세히 보는건 못하는 모양...
인터넷에 여러 예제들을 참고하고 필요한 것만 뜯어서 작성했다.
코드 :
rom selenium import webdriver
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.parse import quote_plus as qp
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
def user_data():
global username, userpw, hashTag, N, M
username = '' # 아이디
userpw = '' # 패스워드
hashTag = input("검색어를 입력하세요 : ") # 검색 태그
N = input("스크롤 횟수를 지정하세요 : ")
M = input("다운받을 이미지 개수를 정하세요 : ")
hashTag = str(hashTag)
N = int(N)
M = int(M)
def url_setting():
loginUrl = 'https://www.instagram.com/accounts/login/'
return loginUrl
def login(driver):
driver.get(url_setting())
driver.find_element(By.NAME, 'username').send_keys(username)
driver.find_element(By.NAME, 'password').send_keys(userpw)
driver.find_element(By.NAME, 'password').send_keys(Keys.ENTER)
driver.implicitly_wait(5)
driver.find_element(By.CLASS_NAME, '_a9--._a9_1').click()
driver.implicitly_wait(5)
def get_content(driver):
html = driver.page_source
soup = BeautifulSoup(html, "lxml")
#Get Content Address
imglist = []
for i in range(0, N):
insta = soup.select('._aabd._aa8k._al3l')
for i in insta:
print('https://www.instagram.com' + i.a['href'])
imgUrl = i.select_one('._aagv').img['src']
imglist.append(imgUrl)
imglist = list(set(imglist))
html = driver.page_source
soup = BeautifulSoup(html, "lxml")
insta = soup.select('._aabd._aa8k._al3l')
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
time.sleep(3)
#Save images to Computer
n = 0
for i in range(0, M):
try:
image_url = imglist[n]
with urlopen(image_url) as f:
with open('./img/' + hashTag + str(n) + '.jpg', 'wb') as h:
img = f.read()
h.write(img)
n += 1
except:
print("강제 종료: 요구사항보다 게시물 부족")
break
print(f"{n}개 항목 다운로드 완료.")
def searching(driver):
#Click Searching box to Open Input Bar / Q: why used try-catch? A: because Responsive website UI
try:
driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/div[1]/div[1]/div/div/div/div/div/div[2]/span/div/a').send_keys(Keys.ENTER)
except:
driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/div[1]/div[1]/div/div/div/div/div[2]/div[2]/span/div/a').send_keys(Keys.ENTER)
driver.implicitly_wait(5)
try:
driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/div[1]/div[2]/section/main/div/div[1]/div/div/div/div/input').send_keys(hashTag)
except:
driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/div[1]/div[1]/div/div/div[2]/div/div/div[2]/div/div/div[1]/div/div/input').send_keys(hashTag)
driver.implicitly_wait(5)
time.sleep(2)
try:
driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/div[1]/div[2]/section/main/div/div[1]/div/div/div/div/div[3]/div/div/div/div/div/div/a[1]').send_keys(Keys.ENTER)
except:
driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/div[1]/div[1]/div/div/div[2]/div/div/div[2]/div/div/div[2]/div/a[1]').send_keys(Keys.ENTER)
time.sleep(6)
def engine():
driver = webdriver.Chrome()
driver.implicitly_wait(5)
login(driver)
searching(driver)
get_content(driver)
driver.close()
#Start on Here
user_data()
engine()
https://github.com/hwisulee/insta_crawling/tree/main
'근황' 카테고리의 다른 글
Jetpack Compose 잠깐 건드려본 소감 (0) | 2024.04.29 |
---|---|
삼성 갤러리 앱 사진, 동영상 안보일 때 (0) | 2023.10.31 |
다시 개발 중... (0) | 2023.09.22 |
네이버 부스트캠프 8기 2차 코딩테스트 탈락 (0) | 2023.07.04 |
네이버 부스트캠프 8기 1차, 2차 코딩테스트 후기 (0) | 2023.06.24 |
@스몰스테핑 :: 작은 발걸음
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!