티스토리 뷰

 

과제내용   1) 2023년 1월 1일부터 1월 15일까지 나라장터에 올라온 입찰공고 목록을 수집한다.

            2) '공동수급' 과 '투찰' 컬럼은 삭제한다.

            3) 상세페이지 링크를 수집하여 '추정금액'과 '재입찰 여부' 컬럼을 추가한다.

            4) 컬럼의 순서를 변경한다.

          (분류 / 업무 / 공고번호-차수 / 공고명 / 공고기관 / 수요기관 / 계약방법 / 추정금액 / 입력일시 / 재입찰여부)

            5) 수집한 데이터를 활용하여 새로운 데이터를 생성해낸다.

            6) 해당 내용을 시각화해본다.

 

과제목표   1) 배웠던 코드를 활용하여 스스로 오류를 해결하며 코드를 작성할 수 있다.

            2) 주어진 환경 안에서 최대한 노력하여 결과물을 얻는다.

               (명절 시골방문, 노트북x, 아이패드 첫 사용 등..)

            3) 본인이 짠 코드와 조원의 코드를 비교하여 더 좋은 코드 작성법을 학습한다.

           

 

 

 

 

1. 필요한 라이브러리 설치하기

import time				# time : 반복 수집 시 사용
import requests	  			# requests : HTTP 요청 시 사용
import pandas as pd			# HTML 태그 수집 시 사용
from bs4 import BeautifulSoup as bs	# 뭐였더라
from tqdm import trange	  		# 반복 수집 시 사용
from tqdm.notebook import tqdm	  	# 일단 넣어봄

∎ time : 반복 수집 시 사용

∎ requests : HTTP 요청 사용

∎ pandas : HTML 태그 수집 시 사용

∎ BeautifulSoup : 인터넷 문서의 구조에서 명확한 데이터를 추출하고 처리하는 가장 쉬운 라이브러리

∎ tqdm : for문이 현재 얼마나 실행되었는지 알려주는 라이브러리

∎ tqdm.notebook : tqdm과 동일하게 진행률과 시간을 보여주는데 시각적으로 다름.

 

 

 

 

 

2. HTTP 요청을 위한 준비 (url 만들기)

def get_url(page_no = 1):
    url = f'https://www.g2b.go.kr:8101/ep/tbid/tbidList.do?searchType=1&bidSearchType=1&taskClCds=&bidNm=&searchDtType=1&fromBidDt=2023%2F01%2F01&toBidDt=2023%2F01%2F15&fromOpenBidDt=&toOpenBidDt=&radOrgan=1&instNm=&instSearchRangeType=&refNo=&area=&areaNm=&strArea=&orgArea=&industry=&industryCd=&upBudget=&downBudget=&budgetCompare=&detailPrdnmNo=&detailPrdnm=&procmntReqNo=&intbidYn=&regYn=Y&recordCountPerPage=30&useTotalCount=Y&currentPageNo={page_no}'
    return url
get_url()

∎ url 주소는 데이터 수집 기간인 '23.01.01 ~ 23.01.15' 로 맞추어 가지고 옴.

∎ url 을 대충 좀 잘라서 가져오는 방법이 있다는데 모르겠음. 너무 긺.

∎ 긴 코드를 아랫줄로 내려서 쓰는 방법을 배웠었는데 까먹음. 

 

 

 

 

 

3. HTTP 요청하기 (나라장터는 'get' 메서드)

url = get_url()
response = requests.get(url)    #괄호 안에 그냥 get_url()을 넣어도 되긴 하지만 보기 편하게 url로 바꿔 넣어줌.
html = bs(response.text)
# BeautifulSoup 적용
temp = pd.read_html(response.text)[0]

∎ 솔직히.. 내가 스스로 쓴거 아니고 강사님하고 했던 코드 보고 따라썼다.

∎ 스스로 쓸 날이 오면 좋겠다.

 

 

 

 

 

4. 마지막 페이지 번호 구하기 (select 구문 사용하기)

#pagination > a.next_end
last_page = html.select('#pagination > a.next_end')[-1]['href'].split('=')[-1]
last_page = int(last_page)
last_page

∎ 해당 기간동안 생성된 페이지는 '489'

 

 

 

 

5. 세부내용 링크 경로 찾아 list에 담아주기 (select 사용)

#resultForm > div.results > table > tbody > tr:nth-child(1) > td:nth-child(2) > div > a
# 처음에 만든 코드
a_href = html.select('div.results > table > tbody > tr > td > div > a')

링크만이 아니라 태그 전체의 내용을 불러온 모습. 틀렸다.

# 다시 만든 코드
a_href = [a['href'] for a in html.select('div.results > table > tbody > tr > td > div > a')]

∎ 링크만 잘 나온다.

그런데 태그로 찾아서 그런가, 링크가 두 개씩 중복된다. 왜냐하면

∎ '공고번호-차수' 내용과 '공고명' 내용 두 곳에 하이퍼 링크가 걸려있기 때문이다.

 

 

 

 

6. 중복되는 링크 제거하기

link_list = []
[link_list.append(x) for x in a_href if x not in link_list]
link_list

∎ 이거는 내 역량 밖의 일이었다. 그래서 타 블로그를 참고했다. 

 

 

 

 

 

7. 목록 데이터 프레임에 '내용링크' 컬럼 추가하기

df_table['내용링크'] = link_list
df_table

∎ 오늘 수업 들을 때까지 나는 여기까지 혼자 올 수 없는 사람이었는데 이제 이정도는 껌이다. 

 

 

 

 

 

8. 'tqdm'으로 반복 수집해오기. (오류발생, 여기까지 오는데 4시간 소요)

page_list = []
for page_no in trange(1, last_page+1):
    result = page_scrapping(page_no)
    page_list.append(result)
    time.sleep(0.001)

페이지당 30개의 목록을 수집해오는데, 27개밖에 없다며 오류가 났다.

페이지에서 직접 확인 결과 3페이지에 내용링크가 걸려있지 않은 게시물이 3개 있었다.

예외 처리가 필요하다. 빈값이어도 처리가 되도록 해야한다.

 

 

 

 

----다음 게시글에서 이어서 작성----

 

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함