본문으로 건너뛰기
실습하기

크롤링으로 자료 조사 자동화하기

과제 또는 자료 조사를 위해 수천개의 회사 정보 찾아야 하는 상황!

인터넷 검색으로 수천개의 회사를 일일히 찾아보는 것은 거의 불가능합니다.

이렇게 반복적인 자료조사 작업에 웹 크롤링을 사용하면, 하루 종일 걸릴 작업을 몇 분 만에 끝낼 수 있습니다.

지금부터 5개의 회사에서 설립연도창업자를 찾는 상황을 코드로 구현해 보겠습니다.

코드가 동작하는 원리를 잘 이해하면 수백, 수천개의 회사 정보를 한 번에 수집하는 파이썬 프로그램을 쉽게 구현할 수 있습니다.


1. CSV 데이터 준비

csv_data라는 문자열에 회사 목록을 저장합니다. 이 데이터는 나중에 프로그램에서 사용할 CSV 파일처럼 동작합니다.

파일을 실제로 저장하지 않고, io.StringIO를 사용해서 메모리 안에서만 이 데이터를 처리합니다.

자료 조사 대상 회사 목록
1,Apple Inc.
2,Microsoft
3,NVIDIA
4,Berkshire Hathaway
5,Samsung

2. CSV 데이터 읽기

CSV 데이터를 csv.DictReader를 사용해 딕셔너리 형태로 읽습니다.

CSV의 각 행은 '번호', '회사명'이라는 키를 가진 딕셔너리로 변환합니다.

CSV 파일 읽기
reader = csv.DictReader(csv_file)

3. 회사명과 위키피디아 URL 매핑

회사명에 따라 위키피디아 페이지의 URL을 자동으로 생성합니다

예를 들어 'Apple Inc.'https://en.wikipedia.org/wiki/Apple_Inc.로 변환됩니다.

회사명과 URL 매핑
companies = {row['회사명']: base_url + row['회사명'] for row in reader}

이러한 과정을 통해 각 회사의 위키피디아 페이지가 companies 딕셔너리에 저장됩니다.

회사명과 URL 매핑 결과
{
'Apple Inc.': 'https://en.wikipedia.org/wiki/Apple_Inc.',
'Microsoft': 'https://en.wikipedia.org/wiki/Microsoft',
'NVIDIA': 'https://en.wikipedia.org/wiki/NVIDIA',
'Berkshire Hathaway': 'https://en.wikipedia.org/wiki/Berkshire_Hathaway',
'Samsung': 'https://en.wikipedia.org/wiki/Samsung'
}

4. 웹페이지에서 데이터 가져오기

각 회사의 위키피디아 페이지에 접근해 창업자와 설립연도 정보를 가져옵니다.

이를 위해 requests.get() 함수를 사용해 URL에 요청을 보내고, BeautifulSoup으로 HTML 데이터를 파싱(Parsing)합니다.

파싱(Parsing)이란, HTML 구조에서 필요한 정보를 추출하는 과정을 의미합니다.

웹페이지에서 데이터 가져오기
response = requests.get(url)

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

5. 창업자와 설립연도 찾기

위키피디아 페이지의 정보 상자(보통 infobox라 불리는 테이블)에 창업자와 설립연도 정보가 들어 있습니다.

이 코드는 테이블에서 'Founder''Founded'라는 텍스트를 찾아 창업자와 설립연도 정보를 추출합니다.

창업자와 설립연도 찾기
# 행의 헤더 정보 추출
header = row.find('th')

# 헤더가 존재하고 'Founder'라는 텍스트가 포함된 경우
if header and 'Founder' in header.text:
founder = row.find('td').text.strip()

# 헤더가 존재하고 'Founded'라는 텍스트가 포함된 경우
if header and 'Founded' in header.text:
founded = row.find('td').text.strip()

6. 결과 출력

수집한 창업자와 설립연도 정보를 company_info 리스트에 저장하고, 마지막에 이 리스트를 출력합니다.

결과 출력
company_info.append({'회사명': company, '창업자': founder, '설립연도': founded})

print(company_info)

다음 내용이 궁금하다면?

코드프렌즈 PLUS 멤버십 가입 or 강의를 등록해 주세요!