우리FISA

우리FIS아카데미(우리FISA) 18주차 AI엔지니어링 프로젝트 로그 남기기

히그다스 2023. 8. 27. 21:54

 

8/21

 

크롤링을 위한 작업 그 첫번째!
크롤링할 사이트 정하기
멘토님께서는 뽐뿌를 얘기하셨는데 들어가보니 생각보다 양질의 게시글이 없었다
질문과 답변이 있는 게시글을 생각했는데 질문만 있거나 하는 경우가 허다했다
그게 아니면 카드팔이
 

 
그 다음 후보는 인스타였는데
여기도 마찬가지로 카드팔이만 잔뜩 😓
 

 
결국 DC까지 들어가게 됐다
내가  DC를 들어가게 되다니
찾아보니 신용카드 갤러리가 있어서 열심히 뒤져봄
추천이라고 치면 그나마 자세하게 나온다
 

근데 줄임말이 많아서 공부(?)를 좀 해야겠음
어질어질하네 이 크롤링 제대로 할 수 있을까? 
 
다른 조에서 크롤링을 했다고 해서

그 조 크롤링 담당인 분에게 부탁해서 코드 받음 

근데 받은 코드에 잘 모르겠는 라이브러리가 있어서 구글 검색 ㄱㄱ


https://ongbike.tistory.com/466

 

selenium.webdriver.common.keys

Selenium library: 웹 크롤링 필수 라이브러리의 Keys 모듈 사용하는 방법 키보드의 키를 컴퓨터에 전달하기 위해서 사용함 send_keys( 입력할 키) from selenium.webdriver.common.keys import Keys 입력할 키 목록:입

ongbike.tistory.com

 
아니 근데 코드 꾸리는 게 왜이렇게 어렵지..?
조언을 구했더니 각 웹페이지나 컴퓨터에 따라 달라서 도와주지도 못한다고...
오롯이 나 혼자만의 싸움이라고 해서 슬프지만 동네 한바퀴 돌고 다시 시작

 

고군분투하다가 다음 페이지 넘어가는 거에서 또 막혀서
찾다가 혹시나 해서 dc 크롤링 하는 방법 검색 ㅋㅋㅋㅋㅋ
역시 개발자 세계는 모든 게 다 블로그에 있어서 좋아요 ㅜㅜ
이거 가지고 우선 돌려보는 중인데 오래 걸리네요
제발 됐으면 좋겠다...
 
https://kaya-dev.tistory.com/32

 

Selenium으로 웹사이트(디시인사이드) 크롤링하기

이번 포스트에서는 Selenium으로 국내 온라인 커뮤니티중 하나인 DC Inside(디시인사이드)를 크롤링하는 방법에 대해 정리하고자 합니다. 일반적으로 웹에서 데이터를 가져올 때 해당 사이트에서 제

kaya-dev.tistory.com

 
계속 돌려도 안돼서 결국 선생님께 help요청
선생님이 말하기로는 오류도 안나는데 별 반응도 없는건 그 사이트에서 막아놔서 그럴 수도 있다고 했다
그리고 이런 크롤링은 ipynb 보다 py파일로 돌리는게
낫다도 내일 아침에 같이 보자고 하셨다
제발 이걸 해낼 수 있기를..!


8/22

 

아침부터 ipynb파일을 py파일로 바꿔놓고 선생님이랑 각자 보기 시작했다

여기서 내가 찾은 건 코드에 있는 HTML코드랑 현재 dc갤의 HTML코드가 다르다는 거 

선생님한테 물어보니 사람들이 크롤링하지 못하게 하려고 자동으로 코드를 바꿔주는 그런걸 쓴다고 했다

근데 많이도 아니고 가끔 하나씩 달라서 되게 꼼꼼하게 봐야함...

날짜 형식도 다르고 해서 선생님이 코드요소하고 순서하고 많이 바꿔주셨다

내가한 건 없고... 선생님이 다 하셨음.. ㅋ

문제거나 바뀐 부분을 다 정리해보겠습니다

 

1.  URL 주소 문제

 

난 dc 신용카드갤에서 '추천'이라고 쳐서 그 주소를 url로 넣었는데

그러면 주소 뒤에 "+str(start_page)" 이 부분 때문에 추천1 이라고 검색이 된다고...

어쩐지 내가 본 화면이랑 크롤링 돌려서 나온 화면이랑 다르다 했다

1페이지랑 2페이지 주소가 달라서 2페이지 보고 가져오신거 같다

이런 것도 잘 봐야겠다

 

<기존 코드>
#게시글 목록 페이지
base_url = BASE + '/board/lists/?id=creditcard&s_type=search_subject_memo&s_keyword=.EC.B6.94.EC.B2.9C'+str(start_page)


<실제 DC갤 주소>
# 1페이지
https://gall.dcinside.com/board/lists/?id=creditcard&s_type=search_subject_memo&s_keyword=.EC.B6.94.EC.B2.9C
# 2페이지
https://gall.dcinside.com/board/lists/?id=creditcard&page=2&search_pos=&s_type=search_subject_memo&s_keyword=.EC.B6.94.EC.B2.9C


<개선 코드>
#게시글 목록 페이지
base_url = BASE + f'/board/lists/?id=creditcard&page={str(start_page)}&search_pos=&s_type=search_subject_memo&s_keyword=.EC.B6.94.EC.B2.9C'

 

8/23 추가

 

이거 왜 '추천1'로 검색됐냐면

주소뒤에 바로 str(start_page)가 들어가서였다

'&page=' 추가 후 제대로 돌아가는 것 확인함

base_url = BASE + '/board/lists/?id=creditcard&s_type=search_subject_memo&s_keyword=.EC.B6.94.EC.B2.9C&page='+str(start_page)

 

2.  변경된 HTML 

 

어디서 안돌아가는지 도저히 모르겠어서 HTML 뜯어보기 시작

근데 게시글 종류에 "gall_subject"가 그 어디에도 없었다

한참 고민하다가 선생님한테 물어보니

사이트에서 크롤링하지 못하게 하려고 자동으로 코드를 바꿔주는 그런걸 쓴다고 했다

그래서 지금 현재 설정되어 있는 "gall_num"으로 코드 변경

작지만 작지않은 부분 clear

'이슈'는 없었는데 신용카드와 관련없는 글 같아 보여서 자체적으로 추가했다

 

<기존 코드>
#게시글의 제목을 가져오는 부분
title = article.find('a').text
#게시글의 종류(ex-일반/설문/투표/공지/등등...)
head = article.find('td',{"class": "gall_subject"}).text
if head not in ['설문','AD','공지','이슈']: 
#사용자들이 쓴 글이 목적이므로 광고/설문/공지 제외, 이슈는 신용카드 내용과 관계없음


<수정 코드>
#게시글의 제목을 가져오는 부분
title = article.find('a').text
#게시글의 종류(ex-일반/설문/투표/공지/등등...)
head = article.find('td',{"class": "gall_num"}).text
if head not in ['설문','AD','공지','이슈']: 
#사용자들이 쓴 글이 목적이므로 광고/설문/공지 제외, 이슈는 신용카드와 관련없어 제외

 

3. start_date = 1

 

이건 완전 초반에 start_page가 왜이렇게 크지 해서 

잘 모르고 고친거였는데 

크롤링할 때 다음 페이지로 넘어가지 않는 문제가 생겼다

 

<기존 코드>
start_page = 1000

<수정코드>
start_page = 1

 

기존 코드에는  최신날짜가 1페이지에 보이는 걸 고려해서 start_date를 최근의 날짜로 지정하는 코드를 짜놨는데

 

start_date = time.strptime("2023/8/21","%Y/%m/%d")
end_date = time.strptime("2023/8/15","%Y/%m/%d")

 

내가 start_page를 바꿔버려서 

이 코드의 논리가 안먹힌 것 때문이었다

선생님이랑 얘기하다가 갑자기 start_page=1000가 머리 속을 스쳐가며 깨달았다

 

 #다음 게시글 목록 페이지로 넘어가기
    if start_date < contents_date: #게시글의 마지막 날짜가 수집기간 날짜에 포함되는가?
        start_page += 1
        continue
        
    elif contents_date < end_date: #수집기간보다 오래된 날짜면 수집을 완료함
        print("수집을 종료합니다.")
        #수집한 데이터를 저장

 

그니까 정리하자면

 

1.  start_date를 최신 날짜로 하고 / start_page를 1000로 지정해서 / 뒷페이지 부터 크롤링을 하는 방식을 채택하던지

 

start_date = time.strptime("2023/8/21","%Y/%m/%d")
end_date = time.strptime("2023/8/15","%Y/%m/%d")

start_page = 1000

if start_date < contents_date: #게시글의 마지막 날짜가 수집기간 날짜에 포함되는가?
        start_page += 1
        continue
        
elif contents_date < end_date: #수집기간보다 오래된 날짜면 수집을 완료함
        print("수집을 종료합니다.")
        #수집한 데이터를 저장

 

2.  start_date를 오래된 날짜로 하고 / start_page를 1로 지정해서 / 페이지부터 크롤링하는 방식을 채택하던지

 

start_date = time.strptime("2023/8/15","%Y/%m/%d")
end_date = time.strptime("2023/8/21","%Y/%m/%d")

start_page = 1 

if start_date < contents_date: #게시글의 마지막 날짜가 수집기간 날짜에 포함되는가?
        start_page += 1
        continue
        
elif contents_date < end_date: #수집기간보다 오래된 날짜면 수집을 완료함
        print("수집을 종료합니다.")
        #수집한 데이터를 저장

 

어우 적으면서도 어지럽다

이해가 됐다 안됐다 한다...

 

4. 코드 순서 변경

 

while문을 돌리는 코드 순서를 조금 변경했다

기존에는 페이지를 넘기고 게시글과 답글을 모으는 for문 전에 끝내버렸는데

선생님이 중간에 꺼지는 거 보단 끝까지 하는게 좋겠다고 끝으로 옮기셨다

더 안정적으로 바뀐 느낌이다

 

<기존코드>
Flag = True
	while Flag:        

    [중간코드]

    if start_date < contents_date: #게시글의 마지막 날짜가 수집기간 날짜에 포함되는가?
        start_page += 1
        continue
        
    elif contents_date < end_date: #수집기간보다 오래된 날짜면 수집을 완료함
        print("수집을 종료합니다.")
        Flag = False
        continue
        
    for article in article_list:
        
        #게시글의 제목을 가져오는 부분
        title = article.find('a').text
        

<수정코드>
Flag = True
while Flag:        

    [중간코드]
    
	Flag = False
	continue

 

번외. 소소한 것들

 

1. 소소한 것 첫번째

 

크롤링 다한 파일을 보니 답글 아이디는 필요없을 거 같아서 뺐다

시간도 필요할까 싶긴 한데 이건 나중에 회의에 논의 해봐야지

→ 답글 등록 일자도 삭제하기로 했다

 

#수집한 정보를 저장하는 리스트
c_gall_no_list = []
title_list = [] #제목
contents_list = [] #게시글 내용
contents_date_list = []
gall_no_list = [] #글 번호
# reply_id = [] #답글 아이디
reply_content = [] #답글 내용
reply_date = [] #답글 등록 일자

 

2. 소소한 것 두번째

 

둘 다 같은 코드고 중간중간 쉬어주는 코드다

안쉬면 크롤링으로 인식해서 차단당할 수도 있다고하니 주의 ! 

 

from time import sleep
sleep(1)

import time
time.sleep(1)

 

이것도 마찬가지로 쉬어주는 코드라고 들었는데 자세히 찾아봤다

 

driver.implicitly_wait(3)

 

인터넷에는 좋은 선생님들이 많이 계신다 ㅎㅎㅎ

 

https://balsamic-egg.tistory.com/16

 

[파이썬] driver.implicitly_wait 와 time.sleep 차이점

driver.implicitly_wait(10) 과 time.sleep(10) 의 차이점은 뭘까요? 결론부터 얘기하자면, driver.implicitly_wait(10) : 10초안에 웹페이지를 load 하면 바로 넘어가거나, 10초를 기다림. time.sleep(10) : 10초를 기다림.

balsamic-egg.tistory.com

 

내일은 데이터 크롤링 한거 raw_data로 DB 하나 꾸리고(contents에 reply 컬럼 추가해서 하나로 !)

전처리에 대해 고민해봐야 한다

다들 한번쯤 해봤다고 하니 안되면 해봤던거 좀 달라고 해야겠다

오늘까지 크롤링 끝내서 다행이다 💪💪

 

 

8/23

 

어제 회의 결과 이런 결과를 얻었다

 

 

답글날짜를 주석처리하며 진행하다보니

이거 혹시 수집할때 글 번호를 기준으로 하나로 묶을 수 없나? 하는 의문이 생김

그럼 내가 따로 DB를 합치지 않아도 돼서 단계를 하나 줄일 수 있을 거 같은데

문제는 글에 답글이 평균 5~6개 정도 달려있어서 한 컬럼 안에 제대로 들어갈 수 있을지 걱정된다

아직 해보진 않아서 이런 저런 생각 중

본격적으로 구글링 해볼거다

 

그냥 해보자 싶어서 해봤는데 역시나 걱정했던 오류가 떴다

그냥 따로 해서 붙이는게 나을 듯

 

 

그 다음 미션

지금은 페이지별로 게시물 수집단위가 되어있어서 21일까지만 크롤링 하고 싶은데 22일 23일 것도 같이 수집된다

 

오늘을 기준으로 6개월치를 크롤링하는 건 있는데 기준날짜를 딱 정해서 하는 건 좀 더 찾아봐야겠다선생님은 start_date랑 contents_date를 비교하는 코드를 짜면 될 거라고 했는데 그 부분은 이미 들어가있는 거 같아서 좀 더 찾아봐야할 듯

 

 

갑자기 7월 14일부터 크롤링이 시작되는 문제가 생겨서 혼자 앓다가 선생님께 help

이게 1000페이지부터 시작하는 걸로 짜다보니 그 1000페이지째가 7월 14일이라 생기는 문제 같다고 하셨다

참고 코드의 로직이 1년단위라서 그러면 오히려 괜찮은데 내가 1일단위로 끊다보니 더 비효율적인 상황이 되어버렸다고..

그래서 우선 수집해서 데이터 프레임으로 넣기 전에 모으고자 하는 기간만 골라서 csv 파일로 저장하는 걸로 하기로 했다

다시 시작이네....................

 

1페이지부터 돌리려니 너무 쓸데없이 시간이 걸리는거 같아서 

직접 갤러리에서 확인하니 11페이지부터 크롤링 하고 싶은 기간이라 start_page =11로 조정

크롤링 돌리는 중....

 

크롤링은 어제 파일 쓰기로 해서 문제가 없는데 거기서 원하는 날짜를 뽑아내는 것만 남았다

해보니 오류가 나는데 아마 날짜 형식 때문인거 같고 컴퓨터도 과하게 일했고 나도 머리가 녹을 거 같으니 내일 마저 하기

 

8/24

오늘 드디어 크롤링 완료 !!!!

csv 파일 공유하고 털어냈다

내일부터는 텍스트 전처리를 통해 인사이트 도출과 쓸만한 데이터 만들어내기

오늘 글이 짧은 이유는 중간에 2023 금융권 공동채용 박람회를 다녀왔기 때문 ㅎㅎ

이 블로그에서 풀지는 모르겠지만 꽤나 도움이 됐다

 

8/25

 

오전에는 수업하고 오후에 회의했는데 AWS에 DB 올려달래서 리더랑 같이 해봤는데 어렵진 않았다

이렇게 채워넣고 OK 누른 뒤 비밀번호 입력해주면 끝 

이러면 내가 하는 작업이 AWS랑 연동이 돼서 팀원들이 볼 수 있다고 한다

 

 

그 다음에는 DB를 생성하고 내가 로컬에서 작업한 쿼리를 넣어주면 완성 !

 

이제 크롤링한 자료에서 언급된 횟수를 시각화하고 데이터 전처리를 해야하는데 집에 너무 가고 싶다......

다음 주에 해야지

 

 


출처 : 본문에 있음