웹 크롤링 기본 개념
웹 크롤링은 웹사이트에서 필요한 데이터를 추출하는 기술입니다. 이를 위해 requests 모듈을 사용하여 HTTP 요청을 보내고 HTML 문서를 가져올 수 있습니다.
import requests
url = 'http://www.redbull.com.cn/about/branch'
response = requests.get(url)
# 응답 객체 확인
print(response) # <Response [200]>
# HTML 내용 출력
html_content = response.text
print(html_content)
HTML 문서는 웹 페이지의 구조와 내용을 포함하고 있으며, 정규 표현식(Regex)을 통해 원하는 정보를 추출할 수 있습니다. 단, 개인정보나 불법적인 데이터 수집은 절대 피해야 합니다.
실전 크롤링 예제: 부동산 정보 수집
이번에는 상하이 랴지아(Lianjia) 사이트에서 주택 매물 정보를 수집해보겠습니다. 각 항목별로 제목, 위치, 가격 등의 데이터를 추출합니다.
제목 추출하기
import re
response = requests.get('https://sh.lianjia.com/ershoufang/pudong/')
titles = re.findall(r'<div class="title"><a.*?>(.*?)</a>', response.text)
print(titles)
다양한 정보 통합하기
다음 코드는 각 항목에 대한 자세한 정보를 추출하고 하나의 리스트로 묶습니다.
positions = re.findall(r'<a href=".*?" target="_blank" data-el="region">(.*?)</a>', response.text)
details = re.findall(r'<span class="houseInfo">(.*?)</span>', response.text)
prices = re.findall(r'<i></i><span>(.*?)</span>', response.text)
data_list = list(zip(titles, positions, details, prices))
for item in data_list:
print(item)
다중 페이지 처리
여러 페이지를 순회하며 데이터를 수집할 수도 있습니다.
base_url = 'https://sh.lianjia.com/ershoufang/pudong/pg{}'
all_data = []
for page in range(1, 101):
url = base_url.format(page)
response = requests.get(url)
titles = re.findall(r'<div class="title"><a.*?>(.*?)</a>', response.text)
positions = re.findall(r'<a href=".*?" target="_blank" data-el="region">(.*?)</a>', response.text)
details = re.findall(r'<span class="houseInfo">(.*?)</span>', response.text)
prices = re.findall(r'<i></i><span>(.*?)</span>', response.text)
all_data.extend(list(zip(titles, positions, details, prices)))
print(len(all_data), "개의 항목을 수집했습니다.")
엑셀 저장하기
수집된 데이터를 엑셀 파일로 저장하면 분석이나 보관이 용이합니다. 이를 위해 openpyxl 모듈을 사용합니다.
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "부동산 정보"
# 헤더 작성
ws.append(["제목", "위치", "상세 정보", "가격"])
# 데이터 추가
for row in all_data:
ws.append(row)
# 파일 저장
wb.save("부동산_정보_목록.xlsx")
고급 엑셀 작업 예시
엑셀 파일에 더 복잡한 데이터를 작성하거나 서식을 적용할 수도 있습니다.
ws["A1"] = "샘플 데이터"
ws.cell(row=2, column=1, value=100)
ws.append([1, "John Doe", 25, "Engineer"])
ws["D5"] = "=SUM(D2:D4)"
wb.save("고급_샘플.xlsx")