20대 성장기/공부

빅데이터 디자인실무 1급 과정_파이썬 프로그래밍 [4-2] 웹크롤링

방구석주희 2021. 11. 24. 22:14
728x90

/petitions/602431 에서 요소는

[ '', 'petitions', '602431'] 3개로 구성된다.

따라서 청원등록번호(602431)를 가져오기 위해서 2번 요소를 가져와야한다.

 

#각 게시글 별 상세페이지 내용 수집
#청원번호, 제목, 청원자 수, 카테고리, 날짜, 내용 수집

no = 1

cno2 = []
title2 = []
people2 = []
category2 = []
s_date2 = []
e_date2 = []
content2 = []

for i in range(0, len(url_list)) :
    
    print('\n')
    print('{} 번째 국민청원 게시글 상세 정보입니다 =================' .format(no))
    
    full_url = 'https://www1.president.go.kr/' + url_list[i]
    driver.get(full_url)
    time.sleep(1)
    
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')
    
    #수집하고 싶은 부분 class 복사
    
    content_all = soup.find('div','petitionsView_left_pg')
    
    #[4]에서 명명해둔 ff_name불러오기(txt로 저장하기)
    
    f = open(ff_name, 'a', encoding='utf-8')
    
    #청원 등록 번호 : url_list에서 번호에 해당하는 것만 가져옴
    #'/'을 기준으로 split
    c_no = url_list[i].split('/')
    cno_1 = c_no[2]
    
    print('1. 청원글번호: ' , cno_1 , '\n')
    f.write('\n')
    f.write('{} 번째 국민청원 게시글 상세 정보입니다 ==========' .format(no) + '\n')
    f.write('1. 청원글번호: ' + cno_1 + '\n')
    cno2.append(cno_1)
    
    f.close()
     
    #반복문 종료 확인
    
    no += 1
    
    if no>cnt :
        break

 


청원제목 추출
참여인원 추출
정보영역 추출

no = 1

cno2 = []
title2 = []
people2 = []
category2 = []
s_date2 = []
e_date2 = []
content2 = []

for i in range(0, len(url_list)) :
    
    print('\n')
    print('{} 번째 국민청원 게시글 상세 정보입니다 =================' .format(no))
    
    full_url = 'https://www1.president.go.kr/' + url_list[i]
    driver.get(full_url)
    time.sleep(1)
    
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')
    
    #수집하고 싶은 부분 class 복사
    
    content_all = soup.find('div','petitionsView_left_pg')
    
    #[4]에서 명명해둔 ff_name불러오기(txt로 저장하기)
    
    f = open(ff_name, 'a', encoding='utf-8')
    
    c_no = url_list[i].split('/')
    cno_1 = c_no[2]
    
    print('1. 청원글번호: ' , cno_1 , '\n')
    f.write('\n')
    f.write('{} 번째 국민청원 게시글 상세 정보입니다 ==========' .format(no) + '\n')
    f.write('1. 청원글번호: ' + cno_1 + '\n')
    cno2.append(cno_1)
    
    #청원제목 추출
    title = content_all.find('h3', 'petitionsView_title').get_text()
    print('2. 청원제목: ' , title , '\n')
    f.write('2. 청원제목: ' + title + '\n')
    title2.append(title)
    
    #참여인원 추출
    people = content_all.find('h2','petitionsView_count').find('span','counter').get_text()
    print('3. 참여인원: ' , people , '명', '\n')
    f.write('3. 참여인원: ' + people + '명' + '\n')
    people2.append(people)
        
    #정보영역 추출
    cat_all = content_all.find('ul','petitionsView_info_list').find_all('li')
    
    #카테고리 영역
    category = cat_all[0].get_text().replace('카테고리','')
    print('4. 카테고리: ' , category , '\n')
    f.write('4. 카테고리: ' + category + '\n')
    category2.append(category)

    #청원시작일
    s_date = cat_all[1].get_text().replace('청원시작','')
    print('5. 청원시작일: ' , s_date , '\n')
    f.write('5. 청원시작일: ' + s_date + '\n')
    s_date2.append(s_date)

    #청원마감일
    e_date = cat_all[2].get_text().replace('청원마감','')
    print('6. 청원마감일: ' , e_date , '\n')
    f.write('6. 청원마감일: ' + e_date + '\n')
    e_date2.append(e_date)

    #청원내용
    content = content_all.find('div','View_write').get_text().replace('\n','')
    print('7. 청원내용: ' , content.strip() , '\n')
    f.write('7. 청원내용: ' + content.strip() + '\n')
    content2.append(content)

  
    
    f.close()

    
    #반복문 종료 확인
    
    no += 1
    
    if no>cnt :
        break


conda install openpyxl

#출력 결과를 표(데이터 프레임)로 만들기
blue_house = pd.DataFrame()

blue_house['청원번호'] = cno2
blue_house['청원제목'] = pd.Series(title2)
blue_house['참여인원'] = pd.Series(people2)
blue_house['카테고리'] = pd.Series(category2)
blue_house['청원시작일'] = pd.Series(s_date2)
blue_house['청원마감일'] = pd.Series(e_date2)
blue_house['청원내용'] = pd.Series(content2)

#csv, xlsx로 내보내기(저장)
blue_house.to_csv(fc_name, encoding='utf-8-sig', index=False)
blue_house.to_excel(fx_name, encoding='utf-8', index=False)

e_time = time.time() #시간측정 종료
t_time = e_time - s_time #소요시간 계산

#요약정보 출력
print('\n')
print('=' *80)
print('총 소요시간은 {} 초 입니다' .format(round(t_time,1)))
print('파일저장 완료 : txt 파일명 : {}' .format(ff_name))
print('파일저장 완료 : csv 파일명 : {}' .format(fc_name))
print('파일저장 완료 : xlsx 파일명 : {}' .format(fx_name))print('=' *80)

driver.close()

결과 생성

 

 

728x90