Java 인스타그램 크롤링 - java inseutageulaem keulolling

코드 중간에 if, break문을 써놓은 부분은 게시물을 크롤링해오던 중 중간에 갑자기 한 달 전 게시물이 뜬금없이 들어가있어서 뒤 게시물과 날짜가 같으면 break하도록 작성했습니다. 대부분의 게시글은 분,시간 단위로 올라와서 날짜로 비교해도 상관없을 것 같습니다.

다만 이렇게 날짜를 비교하는 코드를 넣으니 속도가 너무 느려져셔 개선해야 할 것 같습니다.

난 1학년이니까 아무것도 모를 수도 있지라고 생각한게 엊그제 같은데 벌써 3학년이 끝났다.
근데 여전히 아무것도 모른다.

하지만 졸업을 하려면 졸업작품을 만들어야하니까 이제부터 전공이랑 조금 더 친해지려고 velog도 가입했으니까ㅎㅎ
원래 시작이 반이랬다!

종강한 게으른 몸을 이끌고 어제 처음으로 이미지 크롤링을 시도해봤다.
오늘은 인스타그램에 있는 이미지를 다운로드하는 코드를 공부했다.

👇🏻 무지한 저에게 한줄기 희망같았던 영상
파이썬 인스타그램 크롤링 이미지 다운로드 beautifulsoup selenium 사용법

selenium, beautifulsoup4 설치

먼저 코드를 작성하기 전에 해야할 일

$ pip install selenium
$ pip install beautifulsoup4

실습 준비

from urllib.request import urlopen
from urllib.parse import quote_plus
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import ssl

인스타그램 해시태그 주소 확인하기

인스타그램에서 #아이유를 검색하면 이렇게 예쁜 아이유가 잔뜩 나온다.
하지만 아이유의 유혹에 넘어가지 않고 침착하게 주소를 가져온다.

Java 인스타그램 크롤링 - java inseutageulaem keulolling

인스타그램 #아이유 주소

https://www.instagram.com/explore/tags/아이유/

이 주소에서 /아이유/라는 부분은 컴퓨터가 알 수 없기 때문에 아스키코드로 변환해줘야한다.
이때 필요한 친구가 바로

from urllib.parse import quote_plus

이 친구이다.

url 저장

우리가 원하는 태그의 url이 다 다르기 때문에 url은 계속 바뀌게 된다.
따라서 매번 코드에서 url을 바꿔주는 귀찮은 일을 피하기 위해 base가 될 url(https://www.instagram.com/explore/tags/) 우리가 원하는 태그의 url을 합친 url을 변수에 저장해둔다.

context = ssl._create_unverified_context()

search = input('검색할 태그 : ')
baseUrl = 'https://www.instagram.com/explore/tags/'
newUrl = baseUrl + quote_plus(search)

원하는 페이지 가져오기

인스타그램에서 보이는 모든 게시글들은 아래와 같이 자바스크립트로 되어있기 때문에 단순히 beautifulsoup만으로는 페이지를 가져올 수 없다.

Java 인스타그램 크롤링 - java inseutageulaem keulolling

이때 사용하는 친구가

from selenium import webdriver

강의에서는 크롬을 썼지만 난 사파리를 쓰기 때문에 크롬만 사파리로 스을쩍 바꿔줬다.

driver = webdriver.Safari()
driver.get(newUrl)

이렇게 하면 인스타그램에서 내가 입력한 태그를 검색한 창을 가져오기까지가 끝났다.

beautiful과 urlopen을 이용할 때는 urlopen으로 url을 열고 read를 한 다음에 beautifulsoup으로 분석을 했다.

selenium을 사용할 때는 driver.page_source를 사용
-> driver의 페이지 소스를 불러와서 html에 저장

html = driver.page_source
soup = BeautifulSoup(html)

이미지 가져오기

페이지 소스보기를 통해 이미지 하나를 나타내는 클래스를 찾아본다.

Java 인스타그램 크롤링 - java inseutageulaem keulolling

글씨가 작아서 잘 안보이겠지만

v1Nh3 kIKUG _bz0w

라고 쓰여있다.

soup에서 'v1Nh3 kIKUG _bz0w'를 찾아서 select를 한다.
이때 클래스를 가져와야 하니까 맨 앞에 .(마침표)를 찍어준다.
위와 같은 경우는 클래스를 띄어쓰기로 구분하고 있기 때문에 띄어쓰기를 지우고 .(마침표)로 바꿔서 insta라는 변수에 저장한다.

insta = soup.select('.v1Nh3.kIKUG._bz0w')

-> 가져온 페이지에서 이러한 태그를 가진 거를 불러와서 저장함

driver가 뜨는 시간이 좀 걸리기 때문에 몇초 쉬었다가 분석을 시작한다는 의미

driver = webdriver.Safari()
driver.get(newUrl)

time.sleep(3)

html = driver.page_source
soup = BeautifulSoup(html)

driver를 열고 3초 쉬었다가 분석 시작

이미지 가져오기 및 저장

페이지 소스에서 태그를 타고 쭈우우욱 내려가보면 img alt라는 친구가 보인다. 이 친구가 이미지를 갖고 있다.

Java 인스타그램 크롤링 - java inseutageulaem keulolling

우리는 이 중에서 src를 가져오면 된다.

이미지를 저장할 img 폴더를 실행 파일이 있는 폴더에 미리 만들어 준다.
👇🏻이미지를 불러와서 저장하는 코드

💻 프로그램 코드

from urllib.request import urlopen
from urllib.parse import quote_plus
from bs4 import BeautifulSoup
from selenium import webdriver
import time

search = input('검색할 태그 : ')
baseUrl = 'https://www.instagram.com/explore/tags/'
newUrl = baseUrl + quote_plus(search)

driver = webdriver.Safari()
driver.get(newUrl)

time.sleep(3)

html = driver.page_source
soup = BeautifulSoup(html)

insta = soup.select('.v1Nh3.kIKUG._bz0w')

n = 1

for i in insta:
    print('https://www.instagram.com' + i.a['href'])
    imgUrl = i.select_one('.KL4Bh').img['src']
    with urlopen(imgUrl) as f:
        with open('./img/' + search + str(n) + '.jpg', 'wb') as h:
            img = f.read()
            h.write(img)
    n += 1
    print(imgUrl)
    print()

driver.close()

실행결과

캐주얼룩을 검색했을 때 요렇게 이쁘게 저장된 걸 확인할 수 있다.

Java 인스타그램 크롤링 - java inseutageulaem keulolling

웹크롤링 프로젝트 (java)

인스타그램 좋아요 매크로 프로그램 만들기 (java-selenium, chrome driver)

Java 인스타그램 크롤링 - java inseutageulaem keulolling
한지2021. 8. 4. 2:04

URL 복사 이웃추가

본문 기타 기능

공유하기 신고하기

*공부목적의 프로젝트 입니다*

//현 게시글 내용에는 없지만 exception 처리 필요

//크롬 웹드라이버, 셀레니움 설치작업 필요(이전 게시물 참고)

//window 환경

우선 인스타는 사람손으로 좋아요를 많이눌러도 막기 때문에 counting으로 수를 적당히 조절해주어야 한다. (;;; 매우 깐깐스)

첫 페이지 경로를 base_url 로 지정해 웹을 열어준다. 웹 열리는 시간을 고려하여 타임 딜레이를 준다.

private String base_url("https://www.instagram.com/"); driver.get(base_url); Thread.sleep(2000);

이젠 로그인 되어있다고 가정 후 진행한다

(*로그인 자동화 코드들은 구글링하면 많이 나오니 참고)

우선 인스타그램에서 원하는 태그를 검색한다.

검색 후 url을 보면,

Java 인스타그램 크롤링 - java inseutageulaem keulolling

경로가 보인다. 이걸 그대로 다시 get 메서드로 긁어온다.

driver.get("https://www.instagram.com/explore/tags/맞팔");

이렇게 get 메서드로 주소를 주면 알아서 검색이 된 페이지가 열린다.

이제 가장 첫 번째 사진을 클릭한다.

f12로 해시태그 검색된 페이지의 html 코드를 분석해 첫 번째 사진 요소를 찾는다.

Java 인스타그램 크롤링 - java inseutageulaem keulolling

해당 div 클래스가 _9 ~~ 라고 나오고 있다. 이것을 cssSelector로 가져와 클릭시킨다.

모든 사진이 해당이므로 elements로 가져와 인덱스 설정해주어야 한다. n번째 사진으로도 시작 설정 가능

(;;;와이파이라 로딩이 좀 걸려서 슬립을 길게 걸어주었다. 이건 상황에 맞게 조정해주기)

Thread.sleep(7000); driver.findElements(By.cssSelector("div._9AhH0")).get(0).click(); 

사진이 클릭되면 다음과 같이 창이 나오는데,

좋아요 -> 다음 클릭을 반복시켜야 하므로 클릭 요소를 찾아주어야 한다.

Java 인스타그램 크롤링 - java inseutageulaem keulolling

'좋아요' 버튼의 주변 코드들을 분석해보면,

세 개 요소 중 첫번째의 클래스 인 것이 보인다.

Java 인스타그램 크롤링 - java inseutageulaem keulolling

driver.findElement(By.className("fr66n")).click();

클래스네임으로 요소를 찾아 클릭시켜 좋아요를 눌러준다.

다음 버튼은 한줄짜리.. 링크 요소 a 클래스 중 '다음'은 딱 하나라서 text로 쉽게 찾아진다.

Java 인스타그램 크롤링 - java inseutageulaem keulolling

driver.findElement(By.linkText("다음")).click();

다음 버튼을 클릭해준다.

이제 반복문으로 코드를 묶어 클릭 중간중간 슬립을 랜덤으로 적당히 걸어주고, 설정 카운트 다 되면 break 걸도록 코드를 구성한다.

계속하면 막히기 때문에 10개마다 긴 슬립을 걸어 텀을 주었다.

if(count >= count_setting)break; if(count % 10 == 0) Thread.sleep((long) (10000+n));

완료 후 드라이버 종료까지 해준다.

driver.quit();

매크로 진행 영상 움짤 입니닷

태그는 내가 사랑하는 bigbangtheory 로 진행했다 ^8^

Java 인스타그램 크롤링 - java inseutageulaem keulolling

태그

취소 확인

`

공감

이 글에 공감한 블로거 열고 닫기

댓글 3 이 글에 댓글 단 블로거 열고 닫기

인쇄

댓글쓰기

1/1

이전 다음

이 블로그 웹크롤링 프로젝트 (java) 카테고리 글

전체글 보기

웹크롤링 프로젝트 (java)글 목록글 제목작성일

화면 최상단으로 이동

이 블로그 인기글

이 블로그 인기글글 제목작성일

화면 최상단으로 이동

이 블로그 인기글

화면 최상단으로 이동