크롤링으로 자료 조사 자동화하기
과제 또는 자료 조사를 위해 수천개의 회사 정보 찾아야 하는 상황!
인터넷 검색으로 수천개의 회사를 일일히 찾아보는 것은 거의 불가능합니다.
이렇게 반복적인 자료조사 작업에 웹 크롤링을 사용하면, 하루 종일 걸릴 작업을 몇 분 만에 끝낼 수 있습니다.
지금부터 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의 각 행은 '번호', '회사명'이라는 키를 가진 딕셔너리로 변환합니다.
reader = csv.DictReader(csv_file)
3. 회사명과 위키피디아 URL 매핑
회사명에 따라 위키피디아 페이지의 URL을 자동으로 생성합니다
예를 들어 'Apple Inc.'
는 https://en.wikipedia.org/wiki/Apple_Inc.
로 변환됩니다.
companies = {row['회사명']: base_url + row['회사명'] for row in reader}
이러한 과정을 통해 각 회사의 위키피디아 페이지가 companies
딕셔너리에 저장됩니다.
{
'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 강의를 등록해 주세요!