내 스크래핑 방식은 페이지단위로 스크래핑을 하기 때문에, 스크래핑 주기에 따라 페이지가 다 넘어가지 않으면 당연하게도 이전 스크래핑 내용과 새로 스크래핑한 내용이 겹치게 된다. 이를 해결하기 위해 DB단에서 데이터를 제거하는게 가장 빠르고 편리했다.

 

게다가, 이것 때문에 mongodb에서 mariadb로 전환하기도 했다. mongodb에서는 중복제거가 매우 어렵다... 내가 너무 잘 몰라서 그런 것일수도 있는데, 인덱스를 사용하거나, 맵리듀스를 사용하거나... 아무튼 내가 원하는 대로는 결과가 잘 나오지 않았다.

 

mongodb에서 mariadb로 전환하는데는 조금 시간이 걸렸지만, 다행히 잘 적응하고 전환도 잘 했다. 그리고 쉽게 중복제거를 찾을 수 있었다.

 

DELETE a FROM 중복검사할테이블 a, 중복검사할테이블 b WHERE a.id > b.id AND a.열이름= b.열이름;

 

간단하게 말하면 같은 테이블을 a, b로 명명하고 "열"을 기준으로 같으면 제거하는 방식이다.

중간에 a.id > b.id 는 아마 id열로 뭔가 하는것같은데 이건 이해가 잘 안된다..ㅠㅠ 아무튼 id열도 있어야 한다.

 

파이썬에서 최종적으로 중복제거하는 구문은 다음과 같다.

 

conn = pymysql.connect(host="XXXXXXXXXXX", port=XXXXX, user="root", password="root", db="XXXXXe", charset="utf8")
curs = conn.cursor()

removeDuptitle = "DELETE a FROM bg_product_data a, bg_product_data b WHERE a.id > b.id AND a.title = b.title;"
curs.execute(removeDuptitle)
removeDupLink = "DELETE a FROM bg_product_data a, bg_product_data b WHERE a.id > b.id AND a.link = b.link;"
curs.execute(removeDupLink)

conn.commit()
conn.close()

 

그리고, 각 사이트에서 품절되거나, 뭔가 별로인 deal 정보라서 글을 내리는 경우, 짧게 "삭제합니다", "펑" 뭐 이런식으로 넣어놨는데, 이런것까지 스크래핑되지 않게 하기 위해 (정확히 말하면 스크래핑은 했지만 db에서는 삭제하기 위해) 아래와 같이 title부분의 글자수가 상당히 짧으면, 삭제하는 구문을 넣어봤다.

 

conn = pymysql.connect(host="XXXXXXXXXXX", port=XXXXX, user="root", password="root", db="XXXXXe", charset="utf8")
curs = conn.cursor()

removeShortTitle = "delete from bg_product_data where char_length(title) <= 8;"
curs.execute(removeShortTitle)

conn.commit()
conn.close()

이렇게 하면, title이 8글자 이하면 아예 삭제해버린다. 어차피 게시글이 8글자도 안되는 게시물은 없을 것이다... 아마.! ㅋㅋ

+ Recent posts