📌 HTTP 요청 헤더(HEADERS
) 설명
웹 크롤링을 할 때, 서버가 요청을 정상적인 브라우저 요청인지, 아니면 봇(자동화 프로그램)인지 구별하기 위해 여러 정보를 확인합니다.
따라서, 정상적인 브라우저처럼 보이게 하려면 HEADERS
값을 적절히 설정해야 합니다.
아래는 크롤링에 필요한 주요 헤더들의 역할과 필요성에 대한 상세 설명입니다.
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "ko-KR,ko;q=0.9,en-US,en;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Referer": "https://www.google.com/",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1"
}
🔹 1. User-Agent
(사용자 에이전트)
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36
✅ 역할:
- 브라우저의 정보를 웹 서버에 전달하는 역할을 합니다.
- "나는 Chrome 브라우저에서 보낸 요청이야!"라고 서버에 알립니다.
✅ 필요한 이유:
- 기본적으로
requests
라이브러리의 User-Agent는"python-requests/..."
입니다. - 이를 그대로 사용하면 봇(자동화 프로그램)으로 의심받아 차단될 가능성이 높습니다.
- "Mozilla/5.0" → 구형 넷스케이프 기반 웹사이트와 호환되도록 설정됨
- "Windows NT 10.0; Win64; x64" → OS가 Windows 10이며 64비트 아키텍처임을 알림.
- "AppleWebKit/537.36" → WebKit 엔진을 사용하는 브라우저로 인식됨. (Safari, Chrome과 같은 엔진 사용)
- "(KHTML, like Gecko)" → 웹사이트가 Firefox의 Gecko 엔진과 호환되도록 속여줌.
- "Chrome/115.0.0.0" → "나는 Chrome 115 버전을 사용하고 있어!"
- "Safari/537.36" → Safari에서도 호환 가능함을 나타냄.
🔹 2. Accept
(수락 가능한 콘텐츠 타입)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
✅ 역할:
- 클라이언트(크롤러)가 받을 수 있는 데이터 타입을 웹 서버에 알립니다.
✅ 필요한 이유:
text/html
→ HTML 문서를 요청 (기본적인 웹페이지를 가져오기 위해 필수)application/xhtml+xml
→ XHTML 문서 요청 (XML 기반 HTML)application/xml;q=0.9
→ XML 응답을 받을 수 있음 (q=0.9는 우선순위 설정)image/avif, image/webp
→ 최신 이미지 포맷을 요청하여 웹 페이지에서 최적화된 이미지 데이터를 받을 수 있음*/*;q=0.8
→ 위의 포맷이 없으면 다른 형식도 받을 수 있도록 설정- 이 설정이 없으면, 웹 서버가 JSON이나 XML 응답을 줄 수도 있어 HTML 페이지를 받지 못할 수도 있습니다.
🔹 3. Accept-Language
(선호하는 언어)
Accept-Language: ko-KR,ko;q=0.9,en-US,en;q=0.8
✅ 역할:
- 웹 서버에 사용자가 선호하는 언어를 전달합니다.
✅ 필요한 이유:
ko-KR
→ 한국어(KR) 웹페이지를 우선 요청ko;q=0.9
→ 한국어(일반)도 받을 수 있음 (q=0.9는 우선순위 설정)en-US
→ 영어(미국) 웹페이지도 요청 가능en;q=0.8
→ 일반 영어 페이지도 받을 수 있음 (q=0.8은 우선순위 설정)- 한국어 웹사이트를 크롤링할 때 필수! 없으면 영어 또는 다른 언어 페이지가 반환될 수도 있음.
🔹 4. Accept-Encoding
(지원하는 데이터 압축 방식)
Accept-Encoding: gzip, deflate, br
✅ 역할:
- 클라이언트가 지원하는 데이터 압축 방식을 웹 서버에 전달합니다.
✅ 필요한 이유:
gzip
,deflate
,br (Brotli)
을 사용하면 서버가 데이터를 압축해서 전송하여 크롤링 속도가 빨라지고 데이터 사용량이 줄어듦.Brotli(br)
는 Google이 개발한 압축 방식으로, gzip보다 더 높은 압축률을 제공하여 데이터 다운로드 속도를 향상시킵니다.- 이 설정이 없으면, 서버가 압축하지 않은 원본 데이터를 보낼 수도 있어 속도가 느려질 수 있습니다.
🔹 5. Referer
(이전 페이지 정보)
Referer: https://www.google.com/
✅ 역할:
- 요청의 출처를 서버에 전달합니다.
✅ 필요한 이유:
- 웹 서버가 "이 요청이 어디서 왔는가?"를 확인하는 용도입니다.
"https://www.google.com/"
을 넣으면, 웹 서버가 이 요청이 Google 검색에서 온 것처럼 보이게 됩니다.- 일부 웹사이트는 직접 접근(Direct Access)을 차단하지만, Google 검색을 통해 들어온 요청은 허용하는 경우가 많습니다.
- 크롤링 차단을 우회할 때 매우 유용합니다.
🔹 6. Connection
(연결 유지)
Connection: keep-alive
✅ 역할:
- 웹 서버와의 연결을 유지할지 여부를 결정합니다.
✅ 필요한 이유:
"keep-alive"
설정 시, 서버와의 연결을 유지하여 여러 개의 요청을 보낼 때 속도를 빠르게 합니다."close"
로 설정하면, 요청을 보낸 후 연결을 닫아야 하므로 속도가 느려질 수 있습니다.- 크롤링 시 여러 개의 페이지를 연속해서 가져와야 할 경우,
"keep-alive"
를 사용하면 속도가 향상됩니다.
🔹 7. Upgrade-Insecure-Requests
(보안 강화 요청)
Upgrade-Insecure-Requests: 1
✅ 역할:
- HTTP 요청을 HTTPS로 업그레이드할 수 있도록 요청합니다.
✅ 필요한 이유:
- 서버가 HTTP와 HTTPS를 둘 다 지원하는 경우, HTTPS를 우선적으로 요청하도록 설정합니다.
- HTTPS는 데이터 암호화 및 보안성이 강화된 연결을 제공합니다.
- 일부 웹사이트는 HTTPS를 기본 요구할 수도 있으므로, 이 설정을 추가하면 보안이 강화된 데이터를 받을 수 있습니다.
📌 결론
✔ "나는 크롬 브라우저 사용자야!" → User-Agent
추가
✔ "나는 한국어 페이지를 원해!" → Accept-Language
추가
✔ "HTML과 이미지 데이터를 받을 수 있어!" → Accept
추가
✔ "압축된 데이터를 받으면 더 빨리 처리할 수 있어!" → Accept-Encoding
추가
✔ "Google에서 검색해서 들어온 것처럼 보이게 해!" → Referer
추가
✔ "한 번 연결하면 계속 유지해서 빠르게 크롤링할래!" → Connection
추가
✔ "HTTPS를 사용하여 더 안전한 데이터를 받을게!" → Upgrade-Insecure-Requests
추가