파이썬 크롤링
파이썬 인스타그램 크롤링
꼬마곰
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
반응형