각 특가 사이트에서 게시글을 크롤링하면, 크롤링 주기에 따라 데이터들이 겹칠 수 있다. 예를들어, 퀘이사존의 특가 사이트에서 1,2페이지를 크롤링하고 게시글이 20개가 크롤링 되었다고 치자. 처음엔 당연히 문제가 없다. 근데 1시간마다 크롤링을 한다면?
1시간마다 해당 사이트의 글이 얼마나 올라올지 알 수 없는데 5개가 추가로 올라왔다고 가정해보자. 내 크롤링은 20개를 크롤링하는데, 5개가 추가되었으므로 남은 15개는 이전에 크롤링했던 데이터이다. 즉 중복이 생긴다! 크롤링 할 때마다 이러한 중복 데이터를 제거해야 하는데, sql 계열의 데이터베이스에서는 쉽지만 nosql 계열 데이터베이스는... 뭔가 쉽지 않은 것 같다.
mongodb에서 여러가지를 찾아봤는데, 아예 잘 모르는 db라서 그런지... 감도 잘 안잡히는데 그래도 시간을 써가며 찾아본 결과 distinct를 쓰거나, 인덱스를 만들거나, 맵리듀스를 사용하거나..... 뭔가 방법은 많았는데 직접 해보니 잘 되지 않았다. 십지어 맵리듀스는 이런데 쓰는게 아닌 빅데이터에 쓰는 고급 기술이었다. 어렵다. ㅜㅜ
아무튼, 토요일 하루종일 이걸 붙들고 씨름을 했는데 도저히 답이 나오지 않았다. 결국 mariadb로 바꿀 수밖에 없었다. 류모씨는 나에게 패배자라고 했지만 도저히 답이 없다ㅠ
SQL 계열의 DB는 확실히 이전에 조금 해보았기 때문에 어렵지 않았다. 또한 쉽게 구글링하여 중복 제거를 할 수 있는 SQL 구문을 찾을 수 있었다. python과 연동하여 작동하는 구문을 찾는것은 따로 유투브에서 강의를 들어서 찾을 수 있었다. 이렇게 편안할 수가 있나.
아무튼 만든 코드는 다음과 같다.
## 크롤링한 데이터를 DB에 저장하기
conn = pymysql.connect(host="XXXXXXXXXXX", port=XXXXX, user="root", password="root", db="XXXXXe", charset="utf8")
curs = conn.cursor()
sql = "insert into product_data(title, link, date, source) values(%s, %s, %s, %s)"
curs.execute(sql, (finalDealTitle, finalDealLink, finalDealDate, '퀘이사존'))
conn.commit()
conn.close()
## 중복 데이터 정리
conn = pymysql.connect(host="XXXXXXXXXXX", port=XXXXX, user="root", password="root", db="XXXXXe", charset="utf8")
curs = conn.cursor()
removeDuptitle= "DELETE a FROM product_data a, product_data b WHERE a.id > b.id AND a.title = b.title;"
curs.execute(removeDuptitle)
removeDupLink = "DELETE a FROM product_data a, product_data b WHERE a.id > b.id AND a.link = b.link;"
curs.execute(removeDupLink)
conn.commit()
conn.close()
이제 크롤링과 DB는 거의 끝나간다. due date는 약 열흘정도 남았다. 좀만 더 하면 되겠지?
'SCC 9기' 카테고리의 다른 글
[SCC 9기] - Project TIL : 뷰포트 (0) | 2020.08.31 |
---|---|
[SCC 9기] - Project TIL : mariadb 내용을 딕셔너리 형태로 재생성 (0) | 2020.08.27 |
[SCC 9기] - Project TIL : 날짜/시간 변경 알고리즘 (0) | 2020.08.22 |
[SCC 9기] - Project TIL : 스크래핑 (0) | 2020.08.22 |
[SCC 9기] - 6주차 (0) | 2020.08.22 |