AI SCHOOL/Python

[Python] 대통령연설기록 수집 - 2 (연설 내 가져오기)

moru_xz 2023. 1. 22. 18:59
import time
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)

수집한 연설 목록 가져오기

df = pd.read_csv("대통령연설기록_강사님.csv")
df.shape
df.head()

url 만들기

base_url = "https://www.pa.go.kr/research/contents/speech/index.jsp"
sub_url = df.iloc[-2]["내용링크"]
print(df.iloc[-2]["제목"])
print(base_url + sub_url)
수석·보좌관회의
https://www.pa.go.kr/research/contents/speech/index.jsp?spMode=view&catid=c_pa02062&artid=1401640

# 이 부분 조금 헷갈리기는 함 

 

내용 페이지에 http 요청

# 인증서가 없는 사이트는 접속 시 웹 브라우저에서 다음과 같은 에러 메시지가 발생합니다.
# verify=False를 통해 SSL 인증서 확인 과정을 생략하겠다는 의미입니다.
# 인증서가 없는 사이트 접속으로 인해 혹시라도 발생할 수 있는 문제를 알려주기 위한 경고 메시지 입니다.
# 인증서 오류가 신경쓰인다면 아래 경고메시지 비활성화 처리로 없앨 수도 있지만 경고이기 때문에 데이터 수집에는 문제가 없습니다. 
response = requests.get(url = base_url+sub_url, verify = False)
response.text

BeautifulSoup 적용

html = bs(response.text)
html.select('td.content')[0].text
# 내 생각에 selector 하는 것 보다 bs 해서 위치 찾고 select하는 게 나은 것 같음

다른 방법

# html.find_all("td", {"class":"content"})
content = html.find("td", {"class":"content"}).text

# 다른 방법
content=html.select('#content > div > table > tbody > tr > td.content')[0].text

내용 수집 함수 만들기

 

def get_content(sub_url):
    """내용수집 함수
    1) 수집할 URL 만들기
    2) requests로 HTTP 요청하기
    3) response.text에 BeautifulSoup 적용하기
    4) 내용 가져오기
    5) time.sleep()
    6) 내용 반환하기
    """
    try :
        base_url = "https://www.pa.go.kr/research/contents/speech/index.jsp"
        url = base_url + sub_url
        response = requests.get(url, verify = False)
        html = bs(response.text)
        content = html.select('td.content')[0].text
        return content
    except :
        return None
    
# except HTTPConnection :
# 특정 시간을 쉬었다가 해당 함수를 다시 호출하게 할 수도 있습니다.
# HTTPConnection 오류일때만 해당 함수를 다시 호출하게 하는 방법도 있습니다.
# time.sleep(60)
# get_content(sub_url)
# 중간에 오류가 나게 되면 다시 처음부터 수집해야 하는 상황이 될 수도 있기 때문에 
# 일단 오류가 나면 None 값을 반환하도록 합니다.
# 함수가 잘 만들어졌는지 확인하기
get_content('?spMode=view&catid=c_pa02062&artid=1310442')

전체 데이터에 적용

from tqdm.notebook import tqdm
tqdm.pandas()
df = df.head(10) #전체 다하면 너무 무리
view = df['내용링크'].progress_map(get_content)
view

내용 변수 만들기

df['내용'] = view
df


쉽지 않다!