school/IAM

[IAM] 크롤링 데이터 정리

SHplusR 2022. 10. 14. 17:37

크롤링 소스로 모은 데이터를 정리한다.

크롤링으로 모은 데이터는 원래 이런 모양이었다. 

엑셀 자체서 리스트의 [ ] 가 포함된 채로 들어갔다. 해당 값은 특수문자 [ ] 가 포함된 str형태로 들어왔다. 그래서 star열의 경우 

 

1.  [ ] 특수문자 제거  >>  "5.0, 4.0, 3.0"

2. 리스트화 하기 >>[["5.0, 4.0, 3.0"],["5.0, 5.0, 4.0"],  ......  ]

3. 이중리스트 제거 >>["5.0, 4.0, 3.0","5.0, 5.0, 4.0",  ......  ]

4. 공백을 기준으로 리스트에 집어 넣는다. 

예를들면 3의 list를 star_list라고 한다면 star_list[0] = 5.0, 4.0, 3.0 이 되는데 이때 공백을 기준으로 나누어 빈 star_test3

안에 넣는것이다.

 

5. "5.0,"의 , 는 공백으로 대체한다. 

 

코드는 아래와 같다.

 

filename = 'movie.xlsx'

#별점
df = pd.read_excel(filename, usecols = ['star'])

#특수문자 제거
startest = df.apply(lambda x: x.str.strip('[]'), axis = 1)

#리스트화 하기
star_list_from_df = startest.values.tolist()

#이중리스트 벗기기
star_list2 = np.concatenate(star_list_from_df).tolist()

star_test3 = []

#공백을 기준으로 리스트 만들기
for i in range (len(star_list2)) :
    test2 = star_list2[i].split()
    star_test3 += test2

#이대로 하면 "5.0," 처럼 , 도 포함되므로 ,는 공백으로 대체
for i in range (len(star_test3)) :
    star_test3[i] = star_test3[i].replace(",","")

print(len(star_test3))

 

문제는 review 였다.

star 와 마찬가지로 특수문자가 포함된 str형태로 들어오는데, 이는 공백으로 해결못한다. star는 숫자간 공백이 있어서 가능했지만....review는 내가 하나의 요소로 잡으려는 것에도 공백 포함이 되어 다른 요소로 들어갔다.

예를 들어 

['좋아하는 서점입니다!', '애용하는 서점입니다. 오랜만에  갔는데 계산대 알바생분들 불친절하셔서 놀랐네요,,,']

이런 리뷰는 

"['좋아하는",  "서점입니다!',",  " '애용하는",  "서점입니다.오랜만에"....이런식으로 나뉘는것이다.

그래서 엄청엄청 고민을 많이 했는데 ...... 

 

#리뷰
dff = pd.read_excel(filename, usecols = ['review'])

#리스트화 하기
review_list_from_df = dff.values.tolist()

#이중리스트 벗기기
review_list2 = np.concatenate(review_list_from_df).tolist()

review_test3 = []

for i in range (len(review_list2)) :
    rtest2 = eval(review_list2[i])
    review_test3 += rtest2

print(len(review_test3))

 

eval()이라는 아주 편한...함수가 있더라 ㅋㅅㅋ......이거 가지고 이틀 고민했는데 구글링 더 해볼걸그랬다. 

 

그래서 만든 각각의 리스트를 인덱스로 묶는 작업을 했다. 

['5.0','4.0','3.0] 과 ['굳','좋아요','그냥그럼'] 을

('5.0','굳'),('4.0','좋아요'),('3.0','그냥그럼') 이렇게 묶고 이를 엑셀파일로 만드는 작업이다.

 

코드는 아래와 같다.

 

zip으로 인덱스끼리 묶기
craw_list = list(zip(review_test3,star_test3))
for i in range (len(craw_list)) :
    print(craw_list[i])
print(craw_list)
maidf = pd.DataFrame.from_records(craw_list)
maidf.to_excel('test10.xlsx')

 

zip 함수를 사용했다.

이렇게 각각 만든 파일을 모두 합치고, 별점만 주고 리뷰는 없는 경우를 제거하고, 중복값을 제거하였다.

 

# 모든 파일 합치기
excel_names = ['test.xlsx', 'test2.xlsx', 'test3.xlsx','test4.xlsx', 'test5.xlsx', 'test6.xlsx','test7.xlsx', 'test8.xlsx', 'test9.xlsx','test10.xlsx']
excels = [pd.ExcelFile(name) for name in excel_names]
frames = [x.parse(x.sheet_names[0], header=None,index_col=None) for x in excels]
frames[1:] = [df[1:] for df in frames[1:]]
combined = pd.concat(frames)

#파일저장

combined.to_excel("C:/Users/user/PycharmProjects/reviewdict/final.xlsx", header=False, index=False)
#null값 제거 한 값
filename = 'final.xlsx'

# nil 제거
df = pd.read_excel(filename)
print(df)
print(df.isnull().sum())
df_nonnil = df.dropna(axis=0)

print(df_nonnil,df_nonnil.isnull().sum())
df_nonnil.to_excel("C:/Users/user/PycharmProjects/reviewdict/final_nonnil.xlsx", header=False, index=False)
# 중복값
filename = 'final_nonnil.xlsx'

# 중복값 측정
df = pd.read_excel(filename)
print(df.duplicated().sum())

 

그리고 결과물은 아래와 같다. 만개넘게 했는데 뒷작업을 하니 3000개가 빠지고 약 7000개가 남았다.