웹크롤러(크롤링 코드)

2 minute read

실전 코드

지금 설명하는 코드는 청와대 국민청원 게시판 크롤링하는 예제입니다.


    #Step 1. 필요한 모듈을 로딩합니다
    from selenium import webdriver
    import time 
    import math
    import pandas as pd
    from bs4 import BeautifulSoup
    print("청와대 국민청원 게시판 크롤링")

    #Step 3. 수집된 데이터를 저장할 파일 이름 입력받기 
    f_dir = input("2.파일을 저장할 폴더명만 쓰세요(기본값:C:\):")
    if f_dir == '' :
        f_dir="C:\"
        
    collect_cnt = int(input('몇 건을 수집하시겠습니까?: '))
    collect_page_cnt = math.ceil(collect_cnt / 7) #전체게시판에 나타나는 글 수가 총 7개이므로 7로 나눠준다.

    #Step 4. 크롬 드라이버 설정 및 웹 페이지 열기
    chrome_path = "C:\chromedriver\chromedriver.exe"
    driver = webdriver.Chrome(chrome_path)

    url = 'http://www1.president.go.kr/petitions'
    driver.get(url)
    time.sleep(2) # 창이 켜지는걸 기다려주기 위함
    driver.maximize_window() # 화면 최대화


    #Step 9. 데이터 수집하기
    no2=[]           # 게시글 번호 컬럼
    title2=[ ]       # 게시글 제목 컬럼
    join2=[]       # 논문 저자 컬럼
    category2=[ ]     # 소속 기관 컬럼
    start2=[ ]        # 게시글 날짜 컬럼
    end2=[ ]       # 국내석사 컬럼
    contents2=[]     # 초록내용

    no = 1           # 게시글 번호 초기값
    check=[] #참여인원 임시저장
    # 다음 페이지 번호 만들기
    page_no=[]
    getget=[] #게시글제목 임시저장
    bb=[]      #청원번호임시저장     
    for a in range(1,collect_page_cnt+1) :
        print("\n")
        print("%s 번째 국민청원 게시글 상세 정보입니다.=======================" %a)
        

        html = driver.page_source #페이지 정보를 다 불러온다.
        soup = BeautifulSoup(html, 'html.parser')
        content_list = soup.find('div','ct_list1').find_all('li')

        for i in content_list:

            # 게시글 제목 체크하기
            try:
                title=i.find('div','bl_subject').get_text().strip()
                getget=title.split(' ') # [제목 ,번호 ] 로 리스트에 저장된다.
                
            except :
                continue 
            else :
                # 1.청원 번호
                number = i.find('div','bl_no').get_text() #[번호, 숫자]로 리스트에 저장된다.
                bb=number.split(' ')
                no2.append(bb[1])
                print('1.청원번호:',bb[1])
                
                # 2. 논문 제목
                title2.append(getget[1].strip())
                print("2.제목 : %s" %getget[1].strip())

                # 3. 참여인원
                join=i.find('div','bl_agree cs').get_text()
                
                check = join.split(' ')
                print('3.참여인원:',check[1])
                join2.append(check[1])

                # 4. 카테고리
                company=i.find('div','bl_category ccategory cs wv_category').get_text()#[분류, 분류내용]로 저장된다.
                category = company.split(' ')
                category2.append(category[1])
                print('4.카테고리:',category[1])

                url_1 = i.find('div','bl_subject').find('a')['href'] #[href]로 지정하면 url을 가져온다.
                full_url = 'http://www1.president.go.kr'+url_1

                time.sleep(1)

                driver.get(full_url) # 클릭한 url의 페이지를 가져온다.

                html_1 = driver.page_source
                soup_1 = BeautifulSoup(html_1, 'html.parser')  
                #청원시작일
                start = soup_1.find('div','petitionsView_info').get_text()
                y = start.split()
                start2.append(y[1][4:])
                print('5.청원시작일:', y[1][4:])

                #청원종료일
                end2.append(y[2][4:])
                print('5.청원종료일:', y[2][4:])
                #청원 내용
                con = soup_1.find('div','View_write').get_text().strip()
                contents2.append(con)
                print('6.청원내용:',con)
                time.sleep(1)

                driver.back()  # 이전 페이지로 돌아가기



                time.sleep(2)

                no += 1
                
                if no>collect_cnt : # 지정한 건수를 넘어서면 break를 걸어서 종료한다.
                    break
                                
        a += 1 #다음페이지번호를 카운트함
        
        try :
                driver.find_element_by_link_text('%s' %a).click() # 다음 페이지번호 클릭
        except :
                driver.find_element_by_link_text('다음 페이지로').click()
            
        time.sleep(2)
        
    print("요청하신 작업이 모두 완료되었습니다")

    # Step 10. 수집된 데이터를 xls와 csv 형태로 저장하기
    # 현재 날짜와 시간으로 폴더 만들고 파일 이름 설정하기
    import time
    import os

    # # 데이터 프레임 생성 후 xls , csv 형식으로 저장하기
    # import pandas as pd 

    df = pd.DataFrame()
    df['번호']=no2
    df['제목']=pd.Series(title2)
    df['참여인원']=pd.Series(join2)
    df['카테고리']=pd.Series(category2)
    df['청원시작일']=pd.Series(start2)
    df['청언종료일']=pd.Series(end2)
    df['청원내용']=pd.Series(contents2)


    # xls 형태로 저장하기
    df.to_excel(f_dir,index=False, encoding="utf-8")


    print('요청하신 데이터 수집 작업이 정상적으로 완료되었습니다')

Leave a comment