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&action=view&gul=1264&page=1&go_cnt=0">
#TypeError : expected string or bytes-like object 에러
# 이는 for 문으로 돌려서 리스트를 문자열로 바꿔서 해결해야 한다.
print("완료")
'Python' 카테고리의 다른 글
[python] 네이버쇼핑 실시간 디지털가전 인기 키워드 검색어 크롤링 추출 (1) | 2022.08.31 |
---|---|
[python] hanspell 맞춤법, 오탈자 띄어쓰기 교정해보기 (0) | 2022.08.31 |
[python] konply 설치 및 다운로드 방법 (0) | 2022.08.28 |
[python] 검색엔진 줌 ZUM 자동완성 연관 키워드 검색어 크롤링 추출 (0) | 2022.08.26 |
[python] 스마트스토어 해시태그 키워드 추출 수정 버전(2022.08.25 기준) (0) | 2022.08.26 |
댓글