인스타그램 크롤링
- 인스타그램 URL을 만들어서 접속
- 제일 처음 게시물을 클릭하여 내용을 가져온다.
- 그다음 차례대로 옆으로 이동하며 내용을 가져온다.
인스타그램 접속하기
chorme driver를 통해 인스타그램에 접속 해보자.
from selenium import webdriver
driver = webdriver.Chrome('chromedriver.exe')
import time
# 인스타그램 접속하기
driver.get('https://www.instargram.com')
#로딩하는데 시간이 걸릴 수 있으므로 3초간 대기
time.sleep(3)
인스타그램은 계정을 로그인하여야 원활한 크롤링을 진행 할 수 있다.
# 인스타계정으로 로그인
insta_id = '인스타그램 ID 입력'
input_id = driver.find_elements_by_css_selector('input._2hvTZ.pexuQ.zyHYP')[0]
password = 'PW 입력'
input_pw = driver.find_elements_by_css_selector('input._2hvTZ.pexuQ.zyHYP')[1]
input_id.send_keys(insta_id)
input_pw.send_keys(password)
first = driver.find_element_by_css_selector("#loginForm > div.Igw0E.IwRSH.eGOV_._4EzTm.kEKum > div:nth-child(3)")
first.click()
인스타그램 검색 url 접속
인스타그램의 검색 결과 페이지의 주소는 URL 주소로 표현할 수 있다.
searching 함수는 키워드에 따른 인스타그럼 검색 결과 URL을 생성해 return 해준다.
def searching(word):
url = 'https://www.instagram.com/explore/tags/'+word
return url
'부산맛집'을 검색하는 URL을 생성하여 이동한다.
word = '부산맛집'
url = searching(word)
driver.get(url)
첫 번째 게시글 열기
selenium을 이용해 첫 번째 게시글을 클릭해 준다.
def click_first(driver):
first = driver.find_element_by_css_selector('#react-root > section > main > article > div:nth-child(3) > div > div:nth-child(1) > div:nth-child(1) > a > div.eLAPa > div._9AhH0')
first.click()
time.sleep(3)
click_first(driver)
click_first() 함수에서 find_element_by_css_selector 를 사용해 해당 요소를 찾아 클릭한다.
그리고 정보를 로딩하는데 시간이 걸릴 수 있기 때문에 time.sleep(3) 를 통해 3초정도 대기 시켜준다.
게시글 정보 가져오기
게시글에는 본문 내용, 작성 일시, 위치 정보,좋아요 수 등을 가지고 올 수 있다.
게시글 정보를 가져오는 순서
- 현재 게시글 html 정보 가져오기
- 본문 내용 가져오기
- 작성 일시, 좋아요 수 , 위치 정보 가져오기
- 리스트로 저장
import re
from bs4 import BeautifulSoup
def get_content(driver):
# 1. 현재 게시글 html 정보 가져오기
html = driver.page_source
soup = BeautifulSoup(html, 'lxml')
# 2. 본문 내용 가져오기
# 본문 내용이 없을 수 있으므로 예외 처리구문을 이용
try:
content = soup.select('div.C4VMK > span')[0].text
except:
content = ''
# 3. 작성 일시, 좋아요 수 , 위치 정보 가져오기
# 해쉬 태그는 정규 표현식을 이용해 가져온다.
tags = re.findall(r'#[^\s#,\\]+', content)
# 작성일자 정보 가져오기
date = soup.select('time._1o9PC.Nzb55')[0]['datetime'][:10]
# 좋아요 수 가져오기
# 예외처리구문.
try:
like = soup.select('div.Nm9Fw > button')[0].text[4:-1]
except:
like = 0
# 위치정보
# 예외 처리구문
try:
place = soup.select('div.M30cS')[0].text
except:
place = ''
# 4. 저장하기
data = [content, date, like, place, tags]
return data
get_content(driver)
['육질이 너무 좋아서 만족 백퍼센트였던 소장가치#소장가치..#광안리핫플#광안리소장가치 #부산핫플#해운대맛집#센텀맛집#수영맛집#부산맛집#광안리맛집#광안리한우#광안리소고기#남천동맛집#민락동맛집',
'2020-08-26',
'',
'',
['#소장가치..',
'#광안리핫플',
'#광안리소장가치',
'#부산핫플',
'#해운대맛집',
'#센텀맛집',
'#수영맛집',
'#부산맛집',
'#광안리맛집',
'#광안리한우',
'#광안리소고기',
'#남천동맛집',
'#민락동맛집']]
다음 게시글로 이동하고 이어서 크롤링 진행.
화살표의 위치를 next_page 라는 변수로 지정한 뒤 click() 명령어를 통해 마우스로 클릭하는 것과 동일한 동작을 수행
def next_page(driver):
next_page = driver.find_element_by_css_selector('body > div._2dDPU.CkGkG > div.EfHg9 > div > div > a._65Bje.coreSpriteRightPaginationArrow')
next_page.click()
time.sleep(3)
next_page(driver)
원하는 게시글 수만큼 크롤링 진행
앞에서 만든 함수들을 이용해 여러 게시글 정보를 수집해보자.
word = "부산맛집" #검색어
url = searching(word)
# 검색페이지 접속
driver.get(url)
time.sleep(3)
# 첫 번째 게시글 열기
click_first(driver)
#크롤링 결과를담을 리스트 생성
result = [ ]
# 여러 게시글 수집하기
target = 10 # 크롤링할 게시글 수
for i in range(target):
# 게시글 수집에 오류 발생시 5초 대기후, 다음 게시글로 넘어가도록 예외처리 구문 활용
try:
data = get_content(driver) # 게시글 정보 가져오기
result.append(data)
next_page(driver)
except:
time.sleep(5)
next_page(driver)
result = pd.DataFrame(result)
result
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | .오늘은 #녹우 초이스.코로나에 태풍에 진짜 사람이 없긴없구나_.여기 #살치살 살살... | 2020-08-26 | 2 | [#녹우, #살치살, #소주가_술술.....👀시술, #일상, #소통, #하루, #일... | |
1 | 내가 꼭 퀸가현처럼 롤렉스사주께 ^^ | 2020-08-26 | 8 | Busan, South Korea | [] |
2 | <수영 나마사케 입니다>#퇴근#부산#나마사케#사케##수영역#센텀병원#신세계#센텀해운... | 2020-08-26 | 1 | [#퇴근, #부산, #나마사케, #사케, #수영역, #센텀병원, #신세계, #센텀해... | |
3 | 꽃돼지 잘먹었습니다~^^#부산꽃돼지#사상맛집 #덕천맛집 #부산맛집 #부산맛집추천 #... | 2020-08-26 | [#부산꽃돼지, #사상맛집, #덕천맛집, #부산맛집, #부산맛집추천, #부산맛집꽃돼... | ||
4 | #부산취미미술 #반려동물초상화/#수강생작품 ✍🏻직사각25cm, 시바견 폴리💙하루에 ... | 2020-08-26 | 3 | Art studio On 아트스튜디오 온 | [#부산취미미술, #반려동물초상화/, #수강생작품] |
5 | 몸매플렉스😄오늘도 💯.코로나방역수칙 철저히 지킵니당1미터이상 거리두기 실천중#코로나... | 2020-08-26 | 2 | 부산광역시 주례동 | [#코로나조심, #냉정핑크바, #pinkbar, #냉정맛집, #주례동술집, #냉정술... |
6 | <수영 나마사케 입니다>#퇴근#부산#나마사케#사케##수영역#센텀병원#신세계#센텀해운... | 2020-08-26 | 2 | [#퇴근, #부산, #나마사케, #사케, #수영역, #센텀병원, #신세계, #센텀해... | |
7 | 사진 보니까 또 배고프다 '-'...#마마된장 #서면맛집 #서면 #세트 #소고기된장... | 2020-08-26 | 2 | Busan, South Korea | [#마마된장, #서면맛집, #서면, #세트, #소고기된장찌개, #삼겸살, #맛집, ... |
8 | 여긴 진짜다!! 양파소스장에 찍어먹으니깐 대존맛!#명성오리불고기 인정이다진짜!!#엄... | 2020-08-26 | 1 | [#명성오리불고기, #엄궁, #사상, #하단, #부산데이트코스, #사상맛집, #엄궁... | |
9 | 내가젤루조아하는조개구이😍😚😋진짜3년만에먹는조개구이😝🤩🦐🦪남친은이날처음으로내가조개구이... | 2020-08-26 | 3 | [#맛집, #부산맛집, #부산조개구이, #태종대, #태종대조개구이, #태종대조개구이... |
크롤링이 잘 진행 되는것을 알 수 있다.
이제 원하는 검색어를 입력해 크롤링을 진행해보자.
나는 부산맛집, 부산데이트, 부산여행 의 검색어를 통해 게시글내용을 크롤링하였다.
word = "부산맛집" #검색어
url = searching(word)
# 검색페이지 접속
driver.get(url)
time.sleep(3)
# 첫 번째 게시글 열기
click_first(driver)
#크롤링 결과를담을 리스트 생성
result1 = [ ]
# 여러 게시글 수집하기
target = 1000 # 크롤링할 게시글 수
for i in range(target):
# 게시글 수집에 오류 발생시 5초 대기후, 다음 게시글로 넘어가도록 예외처리 구문 활용
try:
data = get_content(driver) # 게시글 정보 가져오기
result1.append(data)
next_page(driver)
except:
time.sleep(5)
next_page(driver)
# 인스타그램 검색페이지 URL 만들기
word = '부산데이트'
url = searching(word)
# 검색페이지 접속
driver.get(url)
time.sleep(3)
# 첫 번째 게시글 열기
click_first(driver)
#크롤링 결과를담을 리스트 생성
result2 = [ ]
# 여러 게시글 수집하기
target = 1000 # 크롤링할 게시글 수
for i in range(target):
# 게시글 수집에 오류 발생시 2초 대기후, 다음 게시글로 넘어가도록 예외처리 구문 활용
try:
data = get_content(driver) # 게시글 정보 가져오기
result2.append(data)
next_page(driver)
except:
time.sleep(2)
next_page(driver)
# 인스타그램 검색페이지 URL 만들기
word = '부산여행'
url = searching(word)
# 검색페이지 접속
driver.get(url)
time.sleep(3)
# 첫 번째 게시글 열기
click_first(driver)
#크롤링 결과를담을 리스트 생성
result3 = [ ]
# 여러 게시글 수집하기
target = 1000 # 크롤링할 게시글 수
for i in range(target):
# 게시글 수집에 오류 발생시 2초 대기후, 다음 게시글로 넘어가도록 예외처리 구문 활용
try:
data = get_content(driver) # 게시글 정보 가져오기
result3.append(data)
next_page(driver)
except:
time.sleep(2)
next_page(driver)
크롤링 데이터 중복 처리
drop_duplicates 함수를 이용하여 크롤링한 데이터의 중복을 제거 해주자.
- 먼저 3개의 데이터프레임을 합쳐준다
- drop_duplicates 함수를 적용시킨다.
df = pd.DataFrame([])
df.append(result1)
df.append(result2)
df=df.append(result3)
df.columns = ['본문','시간','좋아요','위치','해쉬태그']
본문 | 시간 | 좋아요 | 위치 | 해쉬태그 | |
---|---|---|---|---|---|
0 | 골벗 정회원대회태풍온다길래 취소되는줄알고 조마조마했드만,비는 오지도않고 날씨는 란딩... | 2020-08-26 | NaN | 동부산cc | ['#KPGA', '#시티원골프연습장', '#레슨프로', '#부산', '#부산골프레... |
1 | 틀린 그림 찾깅 | 2020-08-26 | 4 | Busan 釜山, South Korea | [] |
2 | 해운대 프라이빗한 공간이 핫한 해운대 스케줄청담 스케줄이 유명한건 알았지만 해운대에... | 2020-08-26 | 4 | 스케줄해운대 | ['#부산맛집', '#부산밥집', '#food', '#foodstagram', '#... |
df.drop_duplicates(subset = ['본문'] , inplace = True)
df=df.reset_index(drop=True)
'데이터 분석 > 토이프로젝트' 카테고리의 다른 글
transformer를 활용한 한-영 번역 모델(pytorch) (2) | 2022.01.21 |
---|---|
토이 프로젝트 - foilum을 이용한 지도 시각화 (0) | 2020.08.27 |
토이프로젝트 - 워드 클라우드 (2) | 2020.08.27 |
토이프로젝트 - 인스타그램 (0) | 2020.08.27 |