🧑‍💻 IT 솔루션
home
Change IT
home
🖲️

DC-Observer (디씨 챗)

태그
DC-Observer
Sunkist18
크롤링 전체 코드

함수 정의 및 URL 구성

def fetch_titles(gall_id): url = f"https://gall.dcinside.com/board/lists/?id={gall_id}"
Python
복사
디시인사이드 게시판에 정보를 추출할 URL을 생성합니다.
gall_id 라는 매개변수가 필요한데 이는 각 갤러리마다 고유한 ID값을 의미하며
아래의 예시에서 확인할 수 있는 겐지 갤러리 owgenji 의 ID를 가집니다

HTTP 요청 헤더 설정

이 부분이 상당히 중요한데, 디시인사이드나 특정 사이트는 요청이 어느 디바이스에서 왔는지에 따라 다른 값을 제공하기도 하는데 (ex PC브라우저 or 모바일) 이를 설정하기 위해 fake-useragent 라는 패키지를 사용해서 윈도우즈-크롬 인 척 합니다 (+ 서버가 요청을 차단하지 않도록 합니다.)
headers = { "User-Agent": UserAgent(browsers=["chrome"], os="windows").chrome, }
Python
복사

첫 번째 HTTP GET 요청 후 마이너 갤러리 체크 및 재요청

response = requests.get(url, headers=headers) if "location.replace" in response.text: minor_url = url.replace("board/", "mgallery/board/") response = requests.get(minor_url, headers=headers)
Python
복사
설정된 디시인사이트 갤러리로 GET요청을 보냅니다.
근데 초기 설정을 보시면 f"https://gall.dcinside.com/board/lists/?id={gall_id}" 이렇게 되어있는데, 사실 저건 메이저 갤러리에 해당하는 URL이고 마이너 갤러리는 URL이 조금 다릅니다.
그래서 처음 요청이 실패하면, 마이너 갤러리라고 판단. 마이너 갤러리 URL로 변경하여 요청을 다시 받아옵니다.

게시물 데이터 추출 및 갤러리 대표 이미지 추출

갤러리 대표 이미지 추출 부분은 Chat UI 만드느라 사용한건데
img_span = soup.find(class_="cover")["style"] img_url = img_span.split("url(")[1].split(")")[0]
Python
복사
이런식으로 정제해서 사용했습니다.
이런건 직접 갤러리를 들어가서 HTML 파일을 분석 후 찾아내면 됩니다
같은 방식으로 게시물의 제목들도 뽑아오고 headers = [th.get_text(strip=True) for th in soup.find_all("th", scope="col")]
각 게시물에 있는 추가 정보들도 뽑아오고 정제합니다
extracted_data = [] for post in posts: title_element = post.find('td', class_='gall_tit ub-word') if '<b>' in str(title_element): continue row_data = {} cols = post.find_all("td") for i, header in enumerate(headers): row_data[header] = cols[i].get_text(strip=True) row_data["제목"] = title_element.get_text(strip=True) row_data["이미지"] = img_url row_data["댓글수"] = 0 if "[" not in row_data["제목"] else int(row_data["제목"].split("[")[-1].split("]")[0]) extracted_data.append(row_data)
Python
복사
댓글 수는 아래와 같이 제목에서 뽑아옵니다 [3]
근데 실제로 이를 실행해보면 상단에는 항상 공지글이 있다는 걸 알 수 있습니다
공지글은 크롤링해도 사실 크게 영양가가 없기 때문에 없애주는게 낫습니다.
방법이야 많은데, 저는 공지글은 굵은글자로 표시된다는 점을 이용해서 HTML <b> 태그가 있는 제목은 무시하도록 했습니다
for post in posts: title_element = post.find('td', class_='gall_tit ub-word') if '<b>' in str(title_element): continue
Python
복사

함수 실행 결과

fetch_titles 실행하면 아래처럼 나오고
글쓴이, 댓글수, 말머리, 번호, 이미지, 작성일, 제목, 조회, 추천 등의 정보가 나오고
여기서 제목만 출력하게 코드를 조금 수정한다면 아래처럼 나오게 할 수 있고, 데이터를 얻었으니 이를 활용하는 방법은 무궁무진합니당.

활용법

이런식으로 1초마다 fetch해서 채팅 형식으로 보여주는 프로그램 같은거 만들 수 있음.
예능 영상이나 드라마 볼때 띄워놓고 반응보면서 영상봐도 좋을 것 같고요
반응이 좋은 프로그램이나 예능같은 경우는 글리젠이 빨라서 잘 안보일 것 같다고요?
위 만든 프로그램처럼 댓글이나 추천 달리면 색깔도 바뀌게 해서 눈에 띄게하면 좋을 것 같네요.