파이썬 크롤링

파이썬 인스타그램 크롤링

꼬마곰 2021. 8. 6. 14:07
반응형

인스타그램을 크롤링 하기 위해 처음에 크롬브라우져 웹 드라이버를 미리 설치 하셔야 합니다.

https://chromedriver.chromium.org/downloads

 import pandas as pd
 import numpy as np
 
 # 라이브러리 import
 # 라이브러리 : 필요한 도구
 from selenium import webdriver  # 라이브러리(모듈) 가져오라
 from selenium.webdriver import ActionChains as AC
 from tqdm import tqdm
 from tqdm import tqdm_notebook
 import re  # regular expression (정규표현식) - 해시태그(#) 제거
 from time import sleep
 import time
 # 데이터 수집할 키워드 지정
 keyword = "김치"
 keyword

'김치'

 

 # 크롬창 띄우기
 driver = webdriver.Chrome("../chromedriver.exe")  # 윈도우 : "chromedriver.exe"
 driver.get("https://www.instagram.com/")
 time.sleep(3)
 # 본인 계정으로 로그인
 driver.find_element_by_css_selector(".KPnG0").click( )
 ur_id=""
 ur_pw=""

 fb_id="email"
 fb_pw="pass"
 element = driver.find_element_by_id(fb_id)
 element.send_keys(ur_id)
 element = driver.find_element_by_id(fb_pw)
 element.send_keys(ur_pw)
 element.submit() # click()
 time.sleep(7)
 
 driver.find_element_by_css_selector(".aOOlW.HoLwm ").click()
 # 나중에 하기 클릭
 # 검색창에 커서 클릭
 element = driver.find_element_by_css_selector(".eyXLr.wUAXj ").click()
 element
 time.sleep(1)

 # 검색 창에 검색어 입력
 element = driver.find_element_by_css_selector(".XTCLo.x3qfX")
 element.send_keys(keyword)
 time.sleep(3)
 
 # 검색어 리스트 중 첫번째 검색어 클릭
 query_list = driver.find_elements_by_css_selector(".-qQT3") # .-qQT3 중에 0번째
 query_list[0].click()
 time.sleep(3)
 # 사진 클릭
 CSS_tran="div.v1Nh3.kIKUG._bz0w"                         # 사진 버튼 정의 ("div.Nnq7C.weEfm")
 tran_button = driver.find_element_by_css_selector(CSS_tran)     # 사진 버튼 찾기
 AC(driver).move_to_element(tran_button).click().perform()       # 사진 버튼 클릭
 time.sleep(1)
 
 # 사진(pic) 크롤링 시작
 overlays1 = "div._2dDPU.CkGkG .FFVAD"                   # 사진창 속 사진   
 img = driver.find_element_by_css_selector(overlays1)    # 사진 선택
 pic = img.get_attribute('src')                          # 사진 url 크롤링 완료
 pic

'https://scontent-ssn1-1.cdninstagram.com/~~ 생략'

 # 날짜(date) 크롤링 시작
 overlays2 = "div._2dDPU.CkGkG .c-Yi7 > time"                  # 날짜 지정
 datum2 = driver.find_element_by_css_selector(overlays2)     # 날짜 선택
 datum2.get_attribute('title')

'2021년 5월 17일'

 # 좋아요(like) 크롤링 시작
 overlays3 = ".Nm9Fw"                                        # 리뷰창 속 날짜
 datum3 = driver.find_element_by_css_selector(overlays3)     # 리뷰 선택
 like = datum3.text                                          # 좋아요 크롤링 완료
 like

'좋아요 135개'

# 해시태그(tag) 크롤링 시작
overlays4 = ".C7I1f.X7jCj"                                  # 태그 지정
datum3 = driver.find_element_by_css_selector(overlays4)     # 태그 선택
tag_raw = datum3.text
tags = re.findall('#[A-Za-z0-9가-힣]+', tag_raw)            # ""#OOO"만 뽑아오기(OOO: 한글,숫자,영어,_)
tag = ''.join(tags).replace("#"," ")                        # "#" 제거
tag
# print(target_info)

''

# 다음장 클릭
CSS_tran2="a._65Bje.coreSpriteRightPaginationArrow"             # 다음 버튼 정의
tran_button2 = driver.find_element_by_css_selector(CSS_tran2)  # 다음 버튼 find
AC(driver).move_to_element(tran_button2).click().perform()     # 다음 버튼 클릭
# 크롬창 띄우기
driver = webdriver.Chrome("chromedriver.exe")  # 윈도우 : "chromedriver.exe"
driver.get("https://www.instagram.com/")
time.sleep(3)
dict = {}   # 전체 데이터를 담을 딕셔너리 생성

# 검색창에 커서 클릭
element = driver.find_element_by_css_selector(".pbgfb.Di7vw")
element.click()
time.sleep(1)

# 검색 창에 검색어 입력
element = driver.find_element_by_css_selector(".XTCLo.x3qfX")
element.send_keys(keyword)
time.sleep(3)

# 검색어 리스트 중 첫번째 검색어 클릭
query_list = driver.find_elements_by_css_selector(".-qQT3")
query_list[0].click()
time.sleep(7)

# 사진 클릭
CSS_tran="div.Nnq7C.weEfm"                                      # 사진 버튼 정의 
tran_button = driver.find_element_by_css_selector(CSS_tran)     # 사진 버튼 찾기
AC(driver).move_to_element(tran_button).click().perform()       # 사진 버튼 클릭
time.sleep(1)

# 크롤링 시작
len_insta = 10   # 몇 개 글을 크롤링 할건지

for i in tqdm_notebook(range(0, len_insta)):    # range : 숫자가 1씩하는 함수

    target_info = {}                                            # 사진별 데이터를 담을 딕셔너리 생성

    try:    # 크롤링을 시도해라.
        # 사진(pic) 크롤링 시작
        overlays1 = "div._2dDPU.CkGkG .FFVAD"                   # 사진창 속 사진   
        img = driver.find_element_by_css_selector(overlays1)    # 사진 선택
        pic = img.get_attribute('src')                          # 사진 url 크롤링 완료
        target_info['picture'] = pic
        # print(target_info)

        # 날짜(date) 크롤링 시작
        overlays2 = "div._2dDPU.CkGkG .c-Yi7 > time"                  # 날짜 지정
        datum2 = driver.find_element_by_css_selector(overlays2)     # 날짜 선택
        date = datum2.get_attribute('title')
        get_attribute('title')                                    # 날짜 크롤링 완료
        target_info['date'] = date
        # print(target_info)
        # print(datalist)

        # 좋아요(like) 크롤링 시작
        overlays3 = ".Nm9Fw"                                        # 리뷰창 속 날짜
        datum3 = driver.find_element_by_css_selector(overlays3)     # 리뷰 선택
        like = datum3.text                                          # 좋아요 크롤링 완료
        target_info['like'] = like
        # print(target_info)

        # 해시태그(tag) 크롤링 시작
        overlays4 = ".C7I1f.X7jCj"                                  # 태그 지정
        datum3 = driver.find_element_by_css_selector(overlays4)     # 태그 선택
        tag_raw = datum3.text
        tags = re.findall('#[A-Za-z0-9가-힣]+', tag_raw)            # ""#OOO"만 뽑아오기(OOO: 한글,숫자,영어,_)
        tag = ''.join(tags).replace("#"," ")                        # "#" 제거
        target_info['tag'] = tag
        # print(target_info)

        dict[i] = target_info            # 토탈 딕셔너리로 만들기

        print("{0}".format(i), tag)

        # 다음장 클릭
        CSS_tran2="a._65Bje.coreSpriteRightPaginationArrow"             # 다음 버튼 정의
        tran_button2 = driver.find_element_by_css_selector(CSS_tran2)  # 다음 버튼 find
        AC(driver).move_to_element(tran_button2).click().perform()     # 다음 버튼 클릭
        time.sleep(2)

    except:  # 에러가 나면 다음장을 클릭해라
        # 다음장 클릭
        CSS_tran2="a._65Bje.coreSpriteRightPaginationArrow"             # 다음 버튼 정의
        tran_button2 = driver.find_element_by_css_selector(CSS_tran2)  # 다음 버튼 find
        AC(driver).move_to_element(tran_button2).click().perform()     # 다음 버튼 클릭
        time.sleep(2)

print(dict)

# 판다스로 만들기 : 엑셀(테이블) 형식으로 만들기
import pandas as pd
result_df = pd.DataFrame.from_dict(dict, 'index')

n = result_df['picture'].count()

# csv 형식(엑셀이랑 비슷한 파일)으로 저장
result_df.to_csv("insta({}).csv".format(keyword), encoding='euc-kr')
num_pic = len(result_df['picture'])
num_pic
# 이미지들 image_insta 폴더에 다운받기
import os
import urllib.request

# 만약 폴더가 없으면 만들어라
if not os.path.exists("image_insta"):
    os.makedirs("image_insta")
        
for i in range(0, 50):
    
    try:
        index = result_df['picture'][i]
        date = result_df['date'][i]
        urllib.request.urlretrieve(index, "image_insta/{0}_{1}.jpg".format(date, i))        
    except:
        pass
반응형