티스토리 뷰
과제내용 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=®Yn=Y&recordCountPerPage=30&useTotalCount=Y¤tPageNo={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개 있었다.
∎ 예외 처리가 필요하다. 빈값이어도 처리가 되도록 해야한다.
----다음 게시글에서 이어서 작성----
'으쌰으쌰! 팀 프로젝트 > MINI 1 (스크래핑, API)' 카테고리의 다른 글
[1차 팀프로젝트] '나라장터' 웹스크래핑 하기 (3) (0) | 2023.01.24 |
---|---|
[1차 팀프로젝트] '나라장터' 웹스크래핑 하기 (2) (0) | 2023.01.21 |