ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Selenium 기초 및 활용 하기 7 - 인스타 그램 이미지 크롤링
    빅데이터/Selenium 2022. 1. 14. 21:35

    유투버 '프로그래머 김플 스튜디오' 강의 참조

     

     

     

     

    • 인스타 아이디가 있으면 비교적 쉽게 되겠지만 2021년 7월 기준 약 100~300개가 넘어가는 게시물들은 블락이 걸린다. 즉 로그인이 필요 하다!

    이렇게 이용이 가능 하다!

     

     

     

     

    * 기본 세팅

    from urllib.request import urlopen
    from urllib.parse import quote_plus #아스키 코드 변환 용
    from bs4 import BeautifulSoup
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time

     

     

    01 URL 세팅

    • 아래 URL을 가지고 세팅

    baseUrl = 'https://www.instagram.com/explore/tags/'
    plusUrl = input('검색할 태그를 입력하세요: ')
    url = baseUrl + quote_plus(plusUrl)
    
    print(url)

    • 이렇게 기본 URL 과 뒤에 오는 URL을 따로 만들어 놓으면 무엇이든지 검색을 해서 크롤링을 할 수 있다

     

     

    02 페이스북 로그인

    다음 링크를 참조해서 공부하였다
    (https://somjang.tistory.com/entry/Python-Selenium%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%98%EC%97%AC-%EC%9D%B8%EC%8A%A4%ED%83%80%EA%B7%B8%EB%9E%A8-%ED%81%AC%EB%A1%A4%EB%A7%81-%ED%95%98%EA%B8%B0)

     

    • 웹페이지를 띄우고 이 버튼을 클릭을 먼저 해야 한다. 

     

    login_option="facebook"
    facebook_login_page_css=".sqdOP.L3NKy.y3zKF "
    facebook_login_page_css2=".sqdOP.yWX7d.y3zKF " 
    facebook_id_form_name="email"
    facebook_pw_form_name="pass"
    facebook_login_btn_name="login"
    
    
    driver = webdriver.Chrome()
    driver.get(url)
    time.sleep(3)
    
    if login_option == "facebook":
        is_facebook_btn_click = False
        try:
            print("페이스북 로그인 버튼 클릭!")
            facebook_login_btn = driver.find_element(By.CSS_SELECTOR(facebook_login_page_css))
            time.sleep(5)
            facebook_login_btn.click()
            is_facebook_btn_click = True
            is_login_success = True
        except Excpetion as e:
            print(e, "페이스북 로그인 버튼 클릭 실패!")
            is_facebook_btn_click = False
            is_login_success = False
        
        time.sleep(10)
    • 혹시나 버튼 하나로 안될수도 있다고 한다. 신기하게도 facebook_login_page_css/facebook_login_page_css2 둘다 검색을 해보면 똑같은 버튼인데 두개의 다른 css를 가지고 있다. 

     

    ▶ 로그인 페이지로 성공적으로 넘어가면 아래와 같은 화면이 뜬다. 여기서 이제 입력을 시켜주면 된다.

    login_option="facebook"
    facebook_login_page_css=".sqdOP.L3NKy.y3zKF "
    facebook_login_page_css2=".sqdOP.yWX7d.y3zKF " 
    facebook_id_form_name="id"
    facebook_pw_form_name="pw*"
    facebook_login_btn_name="login"
    
    url = 'https://www.instagram.com/accounts/login/'
    driver = webdriver.Chrome()
    driver.get(url)
    time.sleep(3)
    
    if login_option == "facebook":
        is_facebook_btn_click = False
        try:
            print("페이스북 로그인 버튼 클릭!")
            facebook_login_btn = driver.find_element(By.CSS_SELECTOR, facebook_login_page_css)
            time.sleep(3)
            facebook_login_btn.click()
            is_facebook_btn_click = True
            is_login_success = True
        except:
            print("페이스북 로그인 버튼 클릭 실패!")
            is_facebook_btn_click = False
            is_login_success = False
        
        time.sleep(3)
        
        if not is_facebook_btn_click:
            print("페이스북 로그인 버튼2 클릭!")
            try:
                facebook_login_btn = driver.find_element(By.CSS_SELECTOR, facebook_login_page_css2)
                time.sleep(3)
                facebook_login_btn.click()
                is_facebook_btn_click = True
                is_login_success = True 
            except e: 
                print("페이스북 로그인 버튼2 클릭 실패!")
                is_login_success = False
                time.sleep(3)
    
    print("로그인 시작")
    
    
    id_input_form = driver.find_element(By.ID, 'email')
    pw_input_form = driver.find_element(By.ID, 'pass')
    
    id_input_form.send_keys(facebook_id_form_name)
    pw_input_form.send_keys(facebook_pw_form_name)
    
    time.sleep(3)
    
    try:
        login_btn = driver.find_element(By.ID, 'loginbutton')
        login_btn.click()
        print("로그인 성공!")
        time.sleep(3)
    except Exception as e:
        print(e)
        print("[로그인 페이지] 로그인 버튼 클릭 실패!")

    그러면 이렇게 성공적으로 로그인이 된다. 

    ▶ 위의 코드는 자기가 편한대로 짜기만 하면 된다. 이렇게 로그인이되면 이제 검색을 시켜보면 검색이 되는것을 볼 수 있다. 

     

     

     

    02 사진 접근

    baseUrl = 'https://www.instagram.com/explore/tags/'
    plusUrl = input('검색할 태그를 입력하세요: ')
    url = baseUrl + quote_plus(plusUrl)
    driver.get(url)
    time.sleep(3)
    
    
    html = driver.page_source #웹 페이지의 html소스를 들고 온다. 
    soup = BeautifulSoup(html)
    
    insta = soup.select('.v1Nh3.kIKUG._bz0w')
    
    print(insta)

    굿!

     

     

     

     

     

     

    03 사진 URL 접근

    • 현재 한 사진에 대해서 접근 가능한 URL이 2개로 나뉘어 진다. <a> 태그는 원 사진이 올라와있는 인스타그램에 접근이 가능하고 <img> 태그는 말 그대로 사진에 바로 접근이 가능 하다.
    insta = soup.select('.v1Nh3.kIKUG._bz0w')    
    for i in insta:
    	print('https://www.instagram.com'+ i.a['href'])

    굿

     

    ▶ 이제 다운로드를 해보자

    insta = soup.select('.v1Nh3.kIKUG._bz0w')
    print("태그 검색 완료!")
    
    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/' + plusUrl + str(n)+ '.jpg', 'wb') as h: #텍스트 파일이 아니니 'wb'로 처리
                img = f.read() # urlopen()을 한걸 읽고 
                h.write(img) # open()으로 설정한 값대로 저장 
        n+=1
        print(imgUrl)
        print()

    ▶ 추가적으로 계속해서 사진을 크롤링 하고싶다면 셀레니엄의 스크롤다운 기능이나 반복문 회수를 정해주면 된다. 

Designed by Tistory.