#함께보면_좋은강의
파이썬 크롤링을 이용하여 인스타그램 맞팔 여부 자동 확인하기
이번에는 지난번에 약속한대로 파이썬을 이용하여
가장 기본적인 텍스트 크롤링을 해보도록 할게요.
앞서 난이도가 높은 크롤링을 진행하여 의미가 무색해지긴 했지만
그래도 정리 차원에서 포스팅을 진행하려 합니다.
파이썬으로 하는게 더 깔끔해 보이기도 하구요.
아래는 자바스크립트로 진행한 텍스트 크롤링 입니다.
https://sangminem.tistory.com/28
이와 동일한 기능을 하는 프로그램을 파이썬으로 구현해 보도록 하겠습니다.
먼저 필요한 모듈을 임포트 합니다.
import requests
import re
import os
from bs4 import BeautifulSoup
requests 모듈 및 bs4 패키지가 없으면 설치를 해야 합니다.
pip install requests
pip install bs4
위와 같이 입력을 하면 설치가 됩니다.
requests 모듈은 간편하게 HTTP 요청을 처리하도록 도와주고
bs4 패키지 내의 BeautifulSoup 모듈은 HTML DOM 형태의 데이터에서
원하는 내용을 쉽게 추출할 수 있게 해주는 기능을 가지고 있습니다.
re 모듈은 특수문자 제거를 위해, os 모듈은 폴더 생성 시 폴더 존재 여부를 체크하기 위해 임포트 하였습니다.
다음으로 파일 내용에서 url 정보를 가져와 보도록 하겠습니다.
파일 내용은 위와 같습니다.
라인마다 마지막 부분에 URL 정보가 있습니다.
코드는 다음과 같습니다.
r = open('sample.txt', mode='rt', encoding='utf-8')
url_list = []
for line in r:
temp = line.split('^')
url = re.sub('\n','',temp[len(temp)-1])
url_list.append(url)
r.close()
라인 별로 데이터를 가져와서 '^' 기준으로 분할을 하여 url 정보만 url_list 배열에 담았습니다.
그리고 파일을 close 함으로써 메모리에서 해제하였습니다.
다음으로 url 정보를 하나씩 요청하여 필요 정보를 추출해 보도록 할게요.
all_contents = "위치"+"\t"+"날짜"+"\t"+"제목"+"\t"+"번역"+"\t"+"원문\r\n"
for url in url_list:
res = requests.get(url)
soup = BeautifulSoup(res.content, 'html.parser')
tit_loc = soup.select('.tit_loc')[0]
date_text = ''
for span in tit_loc.findAll('span'):
date_text = re.sub('[\n\r\t]','',span.get_text().strip())
span.extract()
loc_text = re.sub('[\n\r\t]','',tit_loc.get_text().strip())
먼저 각 데이터의 구분 값을 첫 라인에 '\t'로 구분하여 입력을 했습니다.
그런 다음 url을 차례로 호출하여 웹 페이지 통체로 가져와서 res 변수에 담고
BeautifulSoup 모듈을 이용하여 가져온 html을 파싱하기 쉽게 만들어 soup 변수에 담았습니다.
select 메서드로 위치와 날짜가 담긴 부분을 가져와서 tit_loc 변수에 담았습니다.
날짜는 가져온 데이터에 자식노드인 span에 있어서 바로 추출을 하였고
위치는 tit_loc class에서 자식노드인 span 태그를 제외한 부분이어서
extract 메서드를 통해 span태그를 제거한 뒤에 추출을 하였습니다.
이어서 제목, 번역문, 원문을 추출해 보도록 하겠습니다.
for url in url_list:
res = requests.get(url)
soup = BeautifulSoup(res.content, 'html.parser')
tit_loc = soup.select('.tit_loc')[0]
date_text = ''
for span in tit_loc.findAll('span'):
date_text = re.sub('[\n\r\t]','',span.get_text().strip())
span.extract()
loc_text = re.sub('[\n\r\t]','',tit_loc.get_text().strip())
# 추가 작성
title = soup.select('h3.search_tit')[0]
title_text = re.sub('[\n\r\t]','',title.get_text().strip())
contents = soup.select('div.ins_view_pd')
content_text = []
for content in contents:
temp = ''
for paragraph in content.findAll('p','paragraph'):
for ul in paragraph.findAll('ul'):
ul.extract()
temp += paragraph.get_text()
content_text.append(re.sub('[\n\r\t]','',temp.strip()))
temp = ''
all_contents += loc_text+'\t'+date_text+'\t'+title_text+'\t'+content_text[0]+'\t'+content_text[1]+'\r\n'
file = open('result.txt','wb')
file.write(all_contents.encode('utf-8'))
file.close()
제목은 h3 태그의 search_tit 클래스를 이용하는 것을 확인하여 바로 추출을 하였고
번역문, 원문이 담긴 태그 및 클래스는 동일하여 2가지를 동시에 배열에 담았습니다.
그 안에 있는 다수의 p 태그 및 paragraph 클래스에 걸쳐있는 내용을 가져왔고
ul 태그에 있는 내용은 필요없는 부분이라서 extract 메서드로 제거했습니다.
결과적으로 content_text[0]에는 번역, content_text[1]에는 원문이 담기게 됩니다.
추출한 모든 내용을 다시 '\t' 구분으로 이어 붙여 데이터 셋을 완성하였습니다.
모든 url을 호출하여 각 라인을 완성하여 하나의 변수에 담았고
마지막으로 그 내용을 result.txt에 파일 쓰기 하였습니다.
실행은 다음과 같이 합니다.
python crawling_text.py
건이 많을 경우 시간이 좀 걸릴 수도 있습니다.
이와 같이 데이터가 정제되어 보기 좋게 저장이 되었습니다.
각 내용을 탭으로 구분했기 때문에 엑셀을 이용한 편집도 용이합니다.
자바스크립트보다 확실히 소스가 짧고 깔끔해 보입니다.
이번 내용을 작성하면서 파이썬 기능이 얼마나 단순하면서 강력한지 다시 한 번 느꼈네요. :)
'코딩 강의 > 유용한 스킬 없을까요' 카테고리의 다른 글
비트코인 암호 화폐 거래소 업비트 API(파이썬)를 활용한 변동성 돌파 전략 구현 방법 (돌파 계수 = 노이즈 비율) (1) | 2021.06.17 |
---|---|
프로그램 매매 핵심 지표, 이동평균선 구하는 방법 (암호 화폐) (1) | 2021.06.11 |
pyupbit 라이브러리를 통한 비트코인 암호 화폐 거래소 API(파이썬) 사용 방법 (1) | 2021.06.10 |
비트코인 암호 화폐 거래소 업비트 API(파이썬) 사용 방법 (6) | 2021.05.16 |
파이썬 크롤링으로 URL 이미지 저장하기 (0) | 2020.10.29 |
파이썬 크롤링을 이용하여 인스타그램 맞팔 여부 자동 확인하기 (5) | 2020.08.31 |
파이썬 크롤링을 활용하여 캔버스 이미지 저장하기 (6) | 2020.08.29 |
자바스크립트 크롤링 따라하기 (4) | 2020.08.26 |
댓글