본문 바로가기

코딩/파이썬(Python)

[파이썬] 국회 의안정보시스템 스크래핑

반응형

국회 의안정보시스템(http://likms.assembly.go.kr/bill/main.do)에는 발의된 법안과 진행상황에 대한 정보가 실시간으로 올라오는데, 이를 스크래핑하는 코드를 짜보았다.

 

 

밑의 코드는 AWS Lambda에서 돌아가도록 코드를 작성한 것이고, 각자 상황에 맞춰서 일부 수정하면 될 듯 하다.

 

import requests
from bs4 import BeautifulSoup
import boto3

def cleaner(msg) :
    
    msg = msg.replace("\t","")
    msg = msg.replace("\r","")
    msg = msg.replace("\n","")

    return msg.strip()


def handler(event, context) :

    dynamodb = boto3.client('dynamodb')
    url = "http://likms.assembly.go.kr/bill/BillSearchResult.do"

    headers = {
        "Host": "likms.assembly.go.kr",
        "Connection": "keep-alive",
        "Cache-Control": "max-age=0",
        "Upgrade-Insecure-Requests": "1",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
        "Origin": "http://likms.assembly.go.kr",
        "Content-Type": "application/x-www-form-urlencoded",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "Referer": "http://likms.assembly.go.kr/bill/main.do",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
    }

    data = {
        
        "tabMenuType":"billSimpleSearch",
        "billKindExclude":"",
        "hjNm":"",
        "ageFrom":"21", #21대 국회
        "ageTo":"21",
        "billKind":"전체",
        "generalResult":"",
        "proposerKind":"전체",
        "proposeGubn":"전체",
        "proposer":"",
        "empNo":"",
        "billNo":"",
        "billName":"금융투자",

    }

    s = requests.Session()

    s.headers = headers

    r = s.post(url, data=data)

    soup = BeautifulSoup(r.content, 'html.parser')

    trs = soup.select("div.tableCol01")[0].select("table tbody tr")

    for tr in trs :
        
        tds = [cleaner(td.text) for td in tr.select("td")]
        billId = tr.select('td')[1].find('a')['href'].split("'")[1]
        content = {
            "no" : {"S":tds[0]},
            "title" : {"S":tds[1]},
            "gubun" : {"S":tds[2]},
            "submit" : {"S":tds[3]},
            "pass": {"S":tds[4]} if tds[4] != "" else {"S":" "},
            "result" : {"S":tds[5]}  if tds[5] != "" else {"S":" "},
            "progress" : {"S":tds[7]},
            "url" : {"S":"http://likms.assembly.go.kr/bill/billDetail.do?billId={}".format(billId)}
        }
        
        result = dynamodb.put_item(TableName='law_change', Item=content)
        
반응형