군장병 AI 트랙(기본) PART 3 필기

배코딩·2022년 11월 18일
0

군장병 AI 교육

목록 보기
3/8

1강 Web Scraping with Beautiful Soup


편리한 웹 스크래핑 도구


  • ScrapeStorm

  • Listly (Chrome extension)


웹 스크래핑 과정


  1. URL 분석 (패턴 존재 여부, query 종류)

  2. URL 구성 (str, 추후 자동화 고려)

  3. HTTP Response 얻기

  • urlopen(URL) -> 한계점 존재

  • request.get(URL).content

  1. HTML source 얻기

HTTP Response 보내고 얻은 데이터에서 HTML 코드를 파싱

  • BeautifulSoup(HTTP Response, 'html.parser')
  1. HTML Tag 꺼내기
  • .find('Tag 이름', {'Attr 이름': 'Attr 값'})

.find(~) : 1개의 Tag (조건이 동일한 Tag가 여러 개일 경우에는 첫 번째 Tag)

.find_all(~) : 여러 개의 Tag를 찾은 다음 for 문으로 Tag 단위로 꺼내어 활용 (list 리턴)

  1. Tag 로부터 텍스트 혹은 Attribute 꺼내기
  • Tag.get_text()

  • Tag.attrs : dict 리턴


3강. Web Scraping with BeautifulSoup


https://alldic.daum.net/search.do?q=happiness

여기서 다음 사전 서버에서 search.do라는 함수가 있고 그 함수가 특정 HTTP를 리턴한다고 생각하자.

? 이후에 있는 것들은 함수의 파라미터라고 생각 (쿼리라고 명칭)


4강. Web Scraping with BeautifulSoup


URL에 한글 포함


URL로 서버에 HTTP Response를 보낼 때 URL은 아스키코드로 판단하므로 한글이 포함되어있으면 안된다. 그래서 퍼센트 인코딩이란걸 해줘야 함.

urllib의 parse를 이용해주면 된다.

기존의 문자열 str를 parse.quote(str) 해주어 URL 문자열에 끼워넣자.


5강 : Basic text data analysis (1)


텍스트 데이터 분석 과정


  1. 텍스트 데이터를 str 자료형으로 준비

  2. Tokenize (형태소 분석)

  3. POS Tagging (Part-of-speech, 품사 표시)

  4. Stopwords 제거 (불용어 제거)

  5. 단어 갯수 카운팅 & 단어 사전 생성

  6. 단어 사전 기반 데이터 시각화

  7. (+ 머신러닝/딥러닝 모델 적용)


POS tagging 결과를 lemmatizing에 써먹기


POS tagging의 결과로 품사가 명사는 N으로, 동사는 V로, 형용사는 J로 시작하는 어떤 단어로 나타난다.

lemmatizing에는 n, v, a로 지칭하므로 조건문을 통해 호환해주어 써먹자.


  • tokenizing 하기 전에 소문자 변환 잊지 말자

6강 : Basic text data analysis (2)


  • 정규표현식

https://www.youtube.com/watch?v=t3M6toIflyQ


re.match('^[a-zA-Z]+', 'air?plane')

매치되는게 없다면 NoneType 리턴

위 예제의 경우 air까지만 매치되므로 span=(0, 3)으로 뜸


추려낸 tokens를

corpus = nltk.Text(tokens) 로 담아두면 당장은 tokens랑 다른게 없어보이지만

이걸로 plot, similar, collocations 등의 메소드를 활용할 수 있음


7강 : Basic text data analysis (3)


scikit-learn

문서에서 단어 빈도 벡터 만들기 : Count Vectorizer

문서 간의 유사도 분석 : TF-IDF Vectorizer (TfidfVectorizer)

(Term Frequency - Inverse Document Frequency)

(빈도 값 대신 TF-IDF 값으로 채워진 벡터. Count Vector 만으로는 유사도 분석 확실하게 못함. 영문에서 That 같이 흔하게 쓰이는 단어 (물론 That은 불용어 제거에서 걸러지지만, 불용어가 아니면서도 분석 대상 문서들에서 흔하게 쓰인 단어도 있을 수 있음) 같은 경우 어느 문서에서든 많이 쓰일 확률이 높은데 이 것이 유사도 분석에 영향을 끼쳐버리면 유의미한 분석 결과가 나오기 힘듦으로 유사도 분석은 TF-IDF Vectorizer를 활용하자)

문서 d, 단어 t에 대해

tf-idf(d, t) = tf(d, t) x idf(d, t) (x는 외적이 아니라 그냥 곱하기임)

idf(d, t) = lognd1+df(t)log{\frac{n_d}{1+df(t)}} (ndn_d : 전체 문서의 수, df(t) : 단어 t를 가진 문서의 수)

요약하면, 대상이 되는 문서들에서 흔하게 공통적으로 나오는 단어는 가중치를 낮게, 빈도가 좀 적게 겹치는 단어는 가중치를 높여서 값을 새로 매기고 그걸로 유사도 분석을 함


Cosine similarity


TF-IDF를 적용하여 구한 vector를 대상으로 Cosine similarity를 적용하여 문서 간의 유사도를 측정함.

두 벡터 간의 코사인 값으로 유사도를 판단함.

코사인 함수는 치역이 [-1, 1]인데,

-1일 때 : 서로 완전히 반대되는 경우
0일 때 : 서로 독립적인 경우
1일 때 : 서로 완전히 같은 경우

를 의미한다.


8강 : Basic text data analysis (4)


with open('shawshank.txt', 'r', encoding = 'utf-8') as f: 
    lines = f.readlines()  # 영화 리뷰 파일의 모든 라인을 읽어와 리스트로 저장
    doc1 = ' '.join(lines)
    
with open('inception.txt', 'r', encoding= 'utf-8') as f:  
    lines = f.readlines()  # 영화 리뷰 파일의 모든 라인을 읽어와 리스트로 저장
    doc2 = ' '.join(lines)
    
corpus = [doc1, doc2]  # doc1, doc2를 합쳐 corpus list를 생성
vectorizer = TfidfVectorizer()  # TfidfVectorizer() 객체 변수 생성
X = vectorizer.fit_transform(corpus).todense() # fit_transform()를 통해 corpus의 텍스트 데이터를 벡터화해 X에 저장하고 X를 dense한 matrix로 변환

print("Similarity between 'The Shawshank Redemption' and 'Inception': ", cosine_similarity(X[0], X[1]))
  1. 하나의 영화 리뷰를 하나의 str 변수로 각각 모아놓기

  2. corpus에 영화 리뷰 str들 담아두기

  3. TfidfVectorizer 객체의 fit_transform 메소드로 TF-IDF vector 구하기

리턴 값 : numpy.array (행: 영화, 열 : tokenizing 된 단어에 대한 TF-IDF 값)

이 때 리턴 값은 희소 행렬인 경우가 많으므로 자동으로 0인 값의 메모리 할당을 최소화하기 위해, 아예 0을 다 빼고 유의미한 값에 대해서만 (행, 열) 값과 원소 값만을 리턴함

만약 온전한 형태의 array 리턴받고싶다면 .todense() 쓰면 됨

코사인 유사도 계산에는 어떤 것이든 상관없음


  • numpy.ndarray 에 .T 를 해주면 전치행렬

9강 : WordCloud for text data (1)


  • URL 한글 부분 퍼센트 인코딩 없이 그대로 원본 복사하기

URL 창에서 맨 앞에 스페이스바 공백 하나 입력하고, 주소 부분 복사하면

한글 원본 그대로 복사가 됨


스크래핑해낸 태그 하나가 담겨있는 변수 a_tag에 대해, a_tag['href'] 처럼, 굳이 a_tag.attrs['href']로 하지않고 바로 key 인덱싱해주면, key 값에 해당하는 attribute의 value를 바로 리턴해줌.

근데 해석 상 용이하지않아서 attrs에서 꺼내는게 좋음. 혹여 구글링하다가 저런 코드나오면 아 이런 의미였지 하고 떠올리는데 써먹자.


언론사마다 HTML 구조가 달라 하나의 코드로 여러 언론사를 스크래핑하는건 불가능에 가까움

그래서 언론사마다 스크래핑 코드를 만들어놓은 후 IF로 분기해서 스크래핑 코드를 실행하는 식으로 타협해야됨

다만 네이버같은 경우에는, 뉴스 title 옆에 네이버뉴스 링크가 달려있는 경우가 있는데 이건 네이버 뉴스 HTML로 통일되어있으므로 이런 경우에는 여러 언론사 글이라도 하나의 코드로 스크래핑이 가능하다.

그러나 이 것도 네이버뉴스 링크가 존재하는 기사도 있고 없는 기사도 있음


10강 : WordCloud for text data (2)


bot으로 인식해서 스크래핑 막힐 때

HTTP Request와 HTTP Response 는 헤더와 바디로 구성되어있는데, HTTP Request의 헤더에 크롬 브라우저 헤더 정보를 같이 넘겨주면 된다.

크롬 개발자 모드의 네트워크 탭에서 새로고침 한번 해주고 뜨는 파일 중에 맨 위 요청 헤더 파일의 request header 탭의 user-agent 값 복붙해서 파이썬 코드의 requests.get() 메소드의 argument로 넘겨주자. (dict로 넘겨주면 됨. 키 값은 'User-Agent')


정규표현식으로 본문 전처리


pattern = re.compile(r'정규표현식')

: 정규표현식 패턴 변수에 저장해놓기


target_idx = pattern.search(본문)

: 본문에서 정규표현식 패턴에 맞는 부분 중에 첫 번째 부분의 위치를 구함


target_idx.start()

: 시작 인덱스를 구해서, [:인덱스]로 본문 자르기



혹은

pattern = re.compile(r'\'')
본문 = pattern.sub('', 본문)

이걸로 패턴에 맞는 부분을 본문에서 바로 지워버릴 수도 있음


11강 : WordCloud for text data (3)


기사마다 특정 정보들을 추출하고, 그걸 DataFrame으로 만들기 위해, 정보마다 리스트로 만들어 모아두면 됨. 하나의 열을 이룰거임


열을 수합하여 DataFrame을 만들 때, 구해놓은 열 리스트들의 길이가 모두 같아야 함. 꼭 유의하자.


스크래핑을 반복할 때 엑셀파일이 덮어씌워지는 걸 방지하기 위해, 파일 이름에 현재 시간을 넣어서 저장해줌.

article_df.to_excel('result_{}.xlsx'.format(datetime.now().strftime('%y%m%d_%H%M')), index=False, encoding='utf-8')

article_df.head()

  • 쿼리 부분을 수정해서 여러 조건 걸고 검색 가능

  • 검색할 때 특수 문자를 적절히 활용해서 조건을 걸고 검색할 수 있음.

    예를 들어 "데이터 검색" -"축구" 라고 검색하면 축구라는 단어가 들어간 걸 모두 제외해주고, 데이터 검색이라는 문구가 반드시 들어간 것만을 검색함.

    구글링 할 때 유용하게 써먹자.


13강 : WordCloud for text data (5)


웹 스크래핑 전 개발 환경 셋팅


NLTK 설치

  • import nltk

  • nltk.download() : 팝업창에서 Corpora, Models 다운로드

Konlpy 설치

  • Microsoft Build Tools 2015 설치

  • 기존의 자바, JDK 삭제 후 jdk-8u221-windows-x64.exe 설치

  • pip install JPype1-1.2.0-cp38-cp38-win_amd64.whl (경로에 저 whl 파일 다운받아놓고 구문 실행)

  • pip install konlpy==0.5.2 (cmd 관리자 권한 실행)

  • pip install tweepy==3.10.0 (cmd 관리자 권한 실행)

  • RuntimeError 발생 시 자바 환경변수 설정하고 주피터 노트북 재부팅

  • JVM 관련 에러 발생 시 JDK 재설치

  • msvcr100.dll 관련 에러 발생 시 마이크로소프트 다운로드 센터에서 Microsoft Visual C++ 2010 재배포 가능 패키지를 받아 설치


14강 : WordCloud for text data (6)


  • 파이썬 변수를 저장하고 불러올 땐 pickle 모듈
import os, pickle 

raw_pos_tagged = 변수들 모음집 (dict)

# 파이썬 변수를 pickle 파일로 저장하는 방법 
with open('raw_pos_tagged.pkl', 'wb') as f:
    pickle.dump(raw_pos_tagged, f) 

# pickle 파일로부터 파이썬 변수를 불러오는 방법 
with open('raw_pos_tagged.pkl','rb') as f:
    data = pickle.load(f)
    
# -> "ran out of input" 문제 발생 시 아래 코드로 대신 실행. 컴퓨터가 너무 옛날꺼라 메모리 초과되는 경우 해당 문제 발생할 수도 있음.
    
data = [] 
if os.path.getsize('raw_pos_tagged.pkl') > 0:      
    with open('raw_pos_tagged.pkl', "rb") as f:
        unpickler = pickle.Unpickler(f)
        data = unpickler.load()
data

이걸 어따써먹나? : 예를 들어 크롤링이 8시간 씩 오래 걸리는 등 오래 걸리는 작업을 할 때, 도중에 정전 나거나 컴퓨터 다운되면 몇 시간 씩 한 거 다 날아감..

그래서 중간 중간에 pickle로 그 때의 크롤링 결과가 담긴 리스트 등의 변수를 저장해둘 때 쓰는거임.

excel 같은 파일로 저장을 해버릴 수도 있긴 하지만 저장도 번거롭고 다시 불러와서 재사용하기도 번거로움. 그냥 pickle로 저장 및 불러오면 바로 변수로 활용 가능해서 유용함.


  • 한글 형태소 분석이 가능한 Konlpy.tag의 Okt 모듈

    만약에 Okt().pos() 쓰는데 커널이 죽는다면, argument로 넘긴 원본 텍스트에 이모티콘이 들어있을 가능성이 높으니, 구글에 이모티콘 자동 제거 검색해서 싹 제거하고 다시 돌려보자.


불용어 처리할 때 뭘 처리해야될지 모를 때, 일단 시각화해보고 빈도 높은 곳에 불용어들이 있다면 그걸 보고 리스트에 넣어 처리 후 다시 시각화하면 됨.


15강 : WordCloud for text data (7)


워드 클라우드 라이브러리 설치

cmd 또는 conda prompt 관리자 권한 실행 후

conda install -c https://conda.anaconda.org/conda-forge wordcloud==1.5.0

실행


워드 클라우드 생성


from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline # 주피터 노트북 내에서 결과 볼 때 쓰는 코드

python_coloring = np.array(Image.open("python_mask.jpg"))

word_cloud = WordCloud(font_path="C:/Windows/Fonts/malgun.ttf", # font_path="C:/Windows/Fonts/NanumSquareB.ttf"
                       max_words=50, # max words (default 200),
                       mask=python_coloring,
                       width=2000, height=1000, 
                       background_color='white').generate_from_frequencies(word_dic)

plt.figure(figsize=(15,15)) # 화면에서 보여지는 워드클라우드의 크기
plt.imshow(word_cloud)
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()

word_cloud.to_file("word_cloud_completed.png")

만약 원본 이미지의 색상과도 일치시키고 싶다면

from wordcloud import ImageColorGenerator

image_colors = ImageColorGenerator(python_coloring)

추가해준 후 plt 세팅에서

plt.imshow(word_cloud.recolor(color_func=image_colors), interpolation='bilinear')

를 추가해주면 된다. 참고로 colormap 매개변수도 있는데 이걸 통해 Matplotlib의 colormap을 활용할 수도 있다.

plt.imshow(word_cloud.?(colormap='Blues'), interpolation='bilinear')


16강 : Advanced web scraping with Selenium (1)

한글 기사를 스크래핑하여 번역 후 영문을 대상으로 텍스트 분석 및 워드클라우드 생성

Selenium 활용 : 가상 브라우저를 활용하여 웹을 강제로 스크래핑

Selenium과 Service는 항상 세트로 쓰임

!pip install selenium==4.1.0

!pip install webdriver-manager==3.5.2 # 만약 셀레니움 또는 웹드라이버 모듈 버전이 문제를 일으킨다면 다운그레이드해서 다른 예전 방식으로 가상 브라우저를 띄워야한다.

from webdriver_manager.chrome import ChromeDriverManager # 자동으로 크롬드라이버(가상브라우저) 파일을 다운로드해주는 라이브러리
from selenium.webdriver.chrome.service import Service # 다운로드된 크롬드라이버 파일을 연결하기 위해 활용

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

from bs4 import BeautifulSoup 
import time
import pandas as pd

import warnings
warnings.filterwarnings("ignore") # 불필요한 Warning 메시지를 꺼줍니다.

# 자동으로 크롬드라이버(가상브라우저) 파일을 다운로드 후 세팅
service = Service(executable_path=ChromeDriverManager().install())  

# 세팅된 크롬드라이버를 연결해 가상브라우저 실행
driver = webdriver.Chrome(service=service)

참고로 가상 브라우저에서 방문한 사이트의 여러 버튼을 조작하고, 액션을 취하고 이런거는 삼가자. 코드 돌리는데 지대한 영향을 줄 수 있음. 결과만 보는 용도로 쓰자

selenium과 webdriver를 활용하여 가상 브라우저를 띄워 스크래핑하는게 도움이 되는 부분 중 하나는, 예를 들어 어떤 사이트를 스크래핑하는데 사이트 개발자의 의도에 의해 스크래핑이 막혀 빈 내용만 넘어오는 경우가 있는데, 이럴 때 유용하다. 가상 브라우저에 사이트를 띄워놓고, 그 가상 브라우저를 대상으로 스크래핑하는 것이라서 막힐 일이 없음


웹에서 태그를 특정해서 불러오는 방법에는 두 가지가 있음.

1) BeautifulSoup로 웹 전체를 html 파싱 후, 거기서 find로 불러오는 방법

2) Selenium으로 파싱없이 웹 전체에서 바로 findelement_by~~~로 불러오는 방법

보통 하나의 태그만 불러와 값을 넣거나 버튼을 클릭하는 등의 조작을 할 때는 2번 방법, 여러 태그를 한 번에 불러올 때는 1의 방법을 쓰면 된다. 물론 1번 방법으로 불러온 태그에 대해 웹에 어떤 조작을 하는 것은 불가능하다.

만약 태그의 class나 id가 추후에 변경될 것 같다싶으면 안전빵으로 find_element_by_xpath로 찾으면 된다. 태그의 XPath는 크롬 개발자 모드에서 태그에 해당하는 부분 마우스 우클릭하고 Copy full XPath로 복사해서 붙여넣어 써먹으면 된다.

찾고 나서는 .send_keys(), .clear(), .click(), .text() 등의 메소드를 활용하여 조작할 수 있다.

셀레니움을 활용해야만 하는 상황이 아니라면 웬만하면 requests.get().content 를 활용하여 스크래핑하자. 셀레니움은 속도도 느리고 다양한 문제들이 터질 가능성이 높음.


17강 : Advanced web scraping with Selenium (2)

기사 본문 전체를 영어로 번역 후 형태소 분석 및 워드 클라우드를 생성하려니 시간도 오래 걸리고 requests 양이 많아 IP 차단이 될 수도 있다.

워드클라우드를 만드는게 목적이라면 그냥 한글 형태소 분석 후 결과로 나온 단어들만 따로 번역을 돌려주면 된다.

물론 단어만 따로 번역해줄때도 마찬가지로 time.sleep으로 약간의 텀을 두어야 된다. 번역 결과 제공에 시간이 소요되기 때문이다. 텀의 정도는 개개인의 네트워크 환경에 따라 적절히 주자. 보통 3~7초 사이로 두면 적당한 듯


18강 : Advanced web scraping with Selenium (3)

네이버 파파고같은 경우에는 번역 결과 로딩 시간이 유동적으로 크게 다른 경우가 있다.

이럴 때는 time.sleep으로 텀 주기도 좀 애매한데, 이런 경우에는 일단 번역 결과 전에는 없다가 후에 나타나는(display가 none이다가 block으로 바뀌는 등) 태그가 있다면 그 태그가 포착될 때까지(=번역 결과 제공 완료) 유동적으로 기다리는 코드를 쓸 수 있다.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By

wait = WebDriverWait(driver, timeout=10) # timeout : 지정한 조건의 충족까지 대기할 최대 시간 (만약 10초 내에 충족되지 않으면 에러가 발생)
   wait.until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "#targetEditArea > p")))

19강 : Advanced web scraping with Selenium (4)

Selenium 쓰는 도중에 가상 브라우저 상 현재 페이지의 html 크롤링하고싶으면 driver.page_source로 긁어온 후 파싱하면 된다.


20강 : Wadiz scraping & 메일 자동발송

메일을 발송해주는 SMTP 라이브러리 (HTTP가 정보 전송 규약이듯 SMTP는 메일 송/수신에 관해 정리된 규약임)

지메일 같은 경우 앱 비밀번호(메일)를 설정해두고, 그걸 이용해서 파이썬 코드에서 지메일에 연결해주면 됨.

import smtplib
from email.mime.text import MIMEText

def sendMail(sender, receiver, msg):
    smtp = smtplib.SMTP_SSL('smtp.gmail.com', 465) # arg : 메일 서버 URL, 포트 번호
    smtp.login(sender, 'taosgjlnxmwlvlfu') # 구글 메일 앱 비밀번호를 통해 서버 접속
    
    msg = MIMEText(msg) # 메일 객체 (arg : 본문)
    msg['Subject'] = 'Product is available!' # 제목 지정
    
    smtp.sendmail(sender, receiver, msg.as_string())
    smtp.quit()
    
sendMail('이메일@gmail.com', '이메일@gmail.com', '내용')

21강 : Post request 처리 & 상권분석서비스

HTTP Request 종류

HTTP Request에는 여러 종류가 있는데, 특히 더 많이 쓰이는 것은 GET, POST, PUT, DELETE 정도이다.

보통 브라우저의 주소창이나 a 태그를 통해 특정 주소로 이동하는 것은 GET 요청이고, 어떤 버튼을 눌렀을 때 주소가 바뀌지 않으면서 화면 상 출력되는 데이터가 바뀐다면 POST 요청일 확률이 높다.

HTTP Response로 돌아오는 데이터도 여러 종류가 있다. HTML, XML, JSON 등

응답으로 뭘 보내줄지는 웹 페이지를 개발한 서버 개발자 마음이다.


CRUD가 HTTP 메소드에서는

Create : POST
Read : GET
Update : PUT
Delete : DELETE

라고 보면 된다.


GET은 서버의 데이터베이스에서 데이터를 가져와서 보는 걸 요청하는거고, POST는 포털 사이트 회원가입 창에서 정보를 치고 가입하기를 누르는 순간 정보를 서버에 보내 데이터베이스에 저장한다던가, 검색창에서 특정 조건들을 입력하고 검색하기를 누르는 순간 서버에서 조건에 맞는 데이터베이스 데이터를 가공해 클라이언트에게 보내준다고 생각하면 편할 듯


크롬 개발자 도구의 네트워크 탭에서 POST 요청 파일을 볼 수 있고, 파일 내 payload 탭에서 유저가 서버로 보낸 form data를 볼 수 있다.

form data에서 request URL과 보낼 데이터(dict)를 request.post 함수로 보내고 content로 json을 꺼내서 json.loads()로 로드해 쓰면된다.

자잘한 팁으로, form data를 dict형으로 선언할 때 멀티커서를 이용하면 따옴표 및 쉼표 처리를 다중으로 쉽게 처리할 수 있다.


22강 : HTML Table tag 처리 & 네이버 금융

웹을 만들 때는 웹 접근성을 고려하는게 좋다.

예를 들어 ▲ 78 과 같은 부분이 있다면 시각 장애인은 이런걸 못 보니까 화면을 읽어주는 프로그램을 쓸텐데, 그럴 때 저 화살표 부분을 읽게할 수 있게 상승 문구가 들어간 span 태그를 넣어두고 css로 블라인드 처리해두면 됨.


23강 : 공공데이터포털 Open API 활용 & XML

API 활용법

API는 애플리케이션과 애플리케이션의 소통을 위한 것이다. 쉽게 말해 음식점에서 고객과 주방 사이에서 음식을 주문받고 전달하는 점원이 바로 API의 역할이다.

예를 들면 특정 게임 클라이언트에 소셜 아이디로 로그인한다던가, 공공데이터포털에서 특정 정보를 XML 형태로 파이썬 코드로 갖고오는 것도 API의 역할이다.


공공데이터포털 오픈 API의 경우, request URL에 조회하려는 데이터의 관련 정보와 인증키를 넣어 서버에 요청하여 XML, JSON 등으로 받아낼 수 있다.

어떤 API에 대해, 어떤 URL로 request를 보내고 그 URL에 어떤 요청 파라미터(쿼리)를 명세해야하는지, 심지어 예시도 있고 오류 메시지에 대한 것도 API 기술 문서에 상세하게 적혀 있으니 잘 참고하자.

응답 메시지로 오는 XML, JSON 등의 내용 해석도 물론 기술되어있다.

공공데이터포털의 경우 웹 페이지에 API 상세 정보 탭에서는 해당 API의 기술 문서에 나오는 내용과 더불어 각 프로그래밍 언어 별로 어떻게 활용할 수 있는지 예시 코드도 있다.

일일 트래픽 한도, tps, 응답시간 등의 정보도 참고하자.


행정 코드 조회

행정표준코드관리시스템에서 여러 행정 코드를 조회할 수 있다. 지역의 법정동 코드 또한 여기서 조회 가능하다.


XML

원래 XML로 서버 간에 데이터를 주고받다가 한계점을 개선하고 만든게 JSON임.

근데 예전에 만들어졌던 API들 같은 경우는 XML을 그대로 제공하는 경우도 많음. 그래서 많이 접하게 될 거임.

XML은 전체적인 구조가 HTML과 유사하지만 데이터들을 감싸고 있는 태그명들은 개발자 맘대로 정해서 쓸 수 있다.


코드 멀티 커서

ctrl + 클릭 : 멀티 커서
ctrl + shift + 방향키 : 단어 단위 드래그


24강 : 자동 스크롤 처리

Selenium 자동 스크롤

유튜브, 페이스북 또는 soundcloud처럼 맨 밑까지 스크롤을 내렸을 때 로딩이 되면서 추가로 컨텐츠가 나오는 방식의 웹 페이지를 대상으로, 자동으로 스크롤을 내리면서 스크래핑하는 법을 배워보자.

다만 SNS 사이트들은 크롤링을 막기 위해 HTML 구조를 자주 바꾸기 때문에, 그때그때 가능한 자동 스크롤 스크래핑 코드가 새로 나온다.

Facebook auto scroll down python 이런 식으로 구글링해서 그때그때 코드 찾아서 쓰자.

근데 SNS 사이트를 대상으로 하는 스크래핑은 웬만하면 지양하자. 자주 크롤링 타겟이 되는만큼 크롤링 방지에 힘을 많이 쓰기 때문에 뚫기가 쉽지 않음. 물론 필요하면야 하긴 해야겠지


service = Service(executable_path=ChromeDriverManager().install()) 
driver = webdriver.Chrome(service=service)

driver.get('주소') 
time.sleep(3)

while True:
    lastHeight = driver.execute_script("return document.body.scrollHeight")
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3)
    newHeight = driver.execute_script("return document.body.scrollHeight")
    if newHeight == lastHeight:
         break

execute_script는 웹 페이지 상에서 괄호 안의 JS 코드를 실행하도록 요청하는 메소드이다.

원리는 웹 페이지에서 스크롤을 내리다가 끝에 다다르면 페이지에 데이터가 추가로 더 뜨면서 스크롤 전체 길이가 길어질 것이다.(막대가 아닌 스크롤 공간 전체 길이)

현재 웹 페이지의 스크롤 전체 길이를 기록하고, 스크롤 바를 맨 밑까지 내린 후의 스크롤 전체 길이를 기록하여 이 둘을 비교하고, 만약 같다면 그 때가 페이지의 끝이란 뜻이므로 이 때 HTML을 스크래핑 및 파싱하면 된다.

profile
PS, 풀스택, 앱 개발, 각종 프로젝트 내용 정리 (https://github.com/minsu-cnu)

0개의 댓글