본문 바로가기
Python

[python] Requests BeautifulSoup 옛날 게시판 정규식 크롤링

by 퍼포먼스마케팅코더 2022. 8. 28.
반응형

Python Requests BeautifulSoup 옛날 게시판 정규식 크롤링 

이거는 옛날 관련했었던 어떤 특정 url을 가져와 보기 그걸로 해서 시험상에서 했는데요. 다른 점은 뭐냐 하면 엄청 옛날 관련됐었던 그런 게시판들 있지 않습니까 간혹씩 그런 것들을 가끔씩 크롤링 한다거나 뭐 이런 경우가 있기는 하는데 연습 삼아서 저는 가지고 와봤어요. 한 20년 전에 있었던 크롤링 이런 것들을 가져와 보는 것. 특히 BeautifulSoup 로 해서 예시 삼아서 가지고 오긴 했는데 저 같은 경우에는 정규식을 이용했습니다. 정규식을 이용을 해서 특정적으로 뭔가 반복되는 뭔가 이거를 html을 크롤링을 하면서 부분만 가지고 오게 되는 거죠. 

 

일반적으로 있었던 크롤링과는 다릅니다. 정규식으로 해서 뭔가 특정 내용이 뭔가 있을 경우 그거를 가지고 오는 방법이기 때문에 다른 그런 크롤링 방법이라고 볼 수 있겠네요. 이 크롤링은 무단으로 이렇게 쓴다거나 뭐 이렇게 하면 절대 안 되겠죠. 그런 것 안 되긴 하는데 시원 삼아서 이런 식으로 옛날 게시판에 크롤링 해야 되는 경우가 아무래도 있을 수도 있을 겁니다. 백업이라든가 이런 것을 여러분들이 나중에 생각을 하신다면 이걸 참고 삼아서 보신다면 도움이 될 수 있을 것 같습니다.

 

저 같은 경우에는 셀레늄으로 크롤링한다거나 이런 방법도 있긴 하겠지만 일반적으로는 거의 Requests 형식을 따라가려는 그런 게 있거든요. 왜냐하면 그게 셀레늄을 사용을 하게 된다면 사용해보신 분들은 다 아시겠지만 느립니다. 그건 최대한 삼가고 Requests 와 그다음에 BeautifulSoup을 사용을 해봐야지 게시판 크롤링을 어떻게 해볼까 나는 그거를 주로 신경을 많이 써요. 해당 부분 근데 이 외에 간혹씩 많이 막히셔서 셀레늄으로 전환돼서 사용하시려는 분들도 있거든요. 그것도 틀린 것은 아니에요. 그렇긴 하지만 정규식으로 뭔가 이렇게 찾아보는 방법도 있다라는 것만 이해만 해주시면 될 것 같습니다.

 

 

import requests
from bs4 import BeautifulSoup
import re


for n in range(1, 2) : #35
    url = 'https://konkuk.ac.kr/~shindh/spboard/board.cgi?id=report2&page={}'.format(n)

    headers = { 'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
                'Accept-Encoding': 'gzip'
    }


    raw = requests.get(url=url, headers=headers)
    #html = BeautifulSoup(raw.content.decode('euc-kr', 'replace'), 'html.parser') #글자 깨질시 content 로 하면 된다 

    html = BeautifulSoup(raw.content.decode('euc-kr', 'replace'), 'html.parser') #글자 깨질시 content 로 하면 된다. 이외 decode로 cp949, euc-kr 로 바꿔 진행


    #results = html.select('td')

    #print(results[5])

    #print(html)

    results_2 = html.find_all('a')   #a 태그만 다 가져오기

    #print(results_2)


    #results_2[100]['href']

    for trg in results_2 : 
        trg_2 = trg['href'] # a 태그 내에 href 만 가져온다.
        try :
            gul_num = re.search('&gul=(.+?)&', trg_2).group(1)  #글쓴이 번호만 가져오기
            #print(gul_num)
            url = 'http://konkuk.ac.kr/~shindh/spboard/board.cgi?id=report2&action=view&gul='+ str(gul_num) + f'&page={n}&go_cnt=0'  #URL 화
            #print(url)
            detail_url = url
            headers = { 'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
            'Accept-Encoding': 'gzip'
            }
            
            detail_url_raw = requests.get(url=detail_url, headers=headers)
            #html = BeautifulSoup(raw.content.decode('euc-kr', 'replace'), 'html.parser') #글자 깨질시 content 로 하면 된다 
            detail_html = BeautifulSoup(detail_url_raw.content.decode('euc-kr', 'replace'), 'html.parser') #글자 깨질시 content 로 하면 된다. 이외 decode로 cp949, euc-kr 로 바꿔 진행
            
            detail_content = detail_html.find('td', {'class' : 'cont'}).text

            detail_content_2 = detail_content.split('.') #마침표로 문자열 분리
            
            f = open('C:/Users/user/raw/konkuk/'+str(n)+'_'+str(gul_num)+'.txt', 'w', encoding='utf-8-sig') #메모장 열기
            
            for i in detail_content_2 :
                last_sentence = str(i) + '.' #끝에 마침표 넣자
                last_sentence = last_sentence.replace("\t", "").strip() #빈칸 공백 제거
                #print(last_sentence)
                #f = open('C:/Users/user/raw/konkuk/'+str(n)+'_'+str(gul_num)+'.txt', 'w', encoding='utf-8') #메모장 열기
                f.write(last_sentence + '\n')  #입력
            f.close() #메모장 닫기
            
            print(str(gul_num)+' 의 감상문 중 ' + str(n) +' 페이지 작성완료')
        except :
            pass
        #print(str(n) +' 페이지 작성완료')
    n +=1  #페이지 넘어가면은 또 반복되도록 설정
    
#url = 'http://konkuk.ac.kr/~shindh/spboard/board.cgi?id=report2&action=view&gul='+ str(gul_num) + f'&page={n}&go_cnt=0'
#print(url)
#print(html)


#<a href="http://konkuk.ac.kr/~shindh/spboard/board.cgi?id=report2&amp;action=view&amp;gul=1264&amp;page=1&amp;go_cnt=0">

#TypeError : expected string or bytes-like object 에러
# 이는 for 문으로 돌려서 리스트를 문자열로 바꿔서 해결해야 한다.


print("완료")

 

반응형

댓글