~ 2024.06.25 Team Project
Web Crawling

1. Web 에서 DNS(domain name server)으로 접속을 하면, DNS에서 Web으로 IP로 응답함
2. Web에서 Web Server에 IP를 가지고 html 요청
3. Web Server에서 바로 Web으로 응답할 수도있고, 로그인 등 정보(비번/ 아이디/ 회원정보 등)가 필요할 때 Was/ DB로 요청 후 Web Client에 응답
용어정리
- RDB(Relational Database)
- 관계형 데이터베이스를 의미
- 데이터를 테이블의 형태로 저장하며, 각 테이블은 행과 열로 구성됨
- RDBMS(Relational Database Management System)는 이러한 데이터베이스를 관리하는 시스템
- Web page
- web 상에서 정보를 제공하는 문서
- 주로 HTML(Hyper markup language)로 작성
- Web site
- Web brower
- 사용자가 웹 서핑(검색)을 위해 사용하는 software
- HTML 문서를 해석(파싱)하여 사용자에게 시각적으로 표시
- Web server
- web page, site, app 등을 hosting, 사용자의 요청에 따라 이들을 web browser로 전송하는 program server
- p.s. 물리적 서버 = 장비
- URL(uniform resource locator)
- 인터넷 상의 자원(web page, image, video 등)의 위치를 지정하는 표준화된 주소 체계
- e.g. http://www.naver.com
- HTTP(hypertext transfer protocol)
- client와 server간에 web page 및 기타 콘텐츠를 전송하기 위해 사용되는 protocol
- e.g. protocol 개념의 암호 = 암호화폐
- FTP(file transfer protocol)
- 네트워크를 통해 파일을 전송하기 위해 사용되는 프로토콜
- FTP는 클라이언트와 서버 사이에서 파일을 업로드하거나 다운로드할 수 있게 해주는 표준 네트워크 프로토콜
- HTML(HyperText Markup Language)
- 웹 페이지를 작성하기 위한 표준 마크업 언어
- HTML은 웹 브라우저가 웹 페이지의 구조와 콘텐츠를 해석하고 표시할 수 있도록 도와주는 기능
- 기본 구성
- div가 포함된 구성
- <div> 태그를 사용하여 페이지를 container, header, content, footer와 같은 영역나
- <div> 태그는 "division"의 약자로, 문서 내의 섹션이나 블록 레벨의 컨테이너를 나타냄.
- 콘텐츠를 그룹화하는 데 사용되며, 주로 레이아웃을 구성하고 스타일을 적용하는 데 매우 유용

URL 구조
e.g.
https://user:pass@www.example.com:8080/path/to/page?query=example#section
- Scheme(스킴):
- URL의 첫 부분으로, 리소스에 접근하기 위해 사용되는 프로토콜을 정의
- 예: http, https, ftp, mailto, file
- 예시: https://
- Username(사용자 이름과 비밀번호) [옵션]:
- 인증이 필요한 경우 사용자 이름과 비밀번호를 포함할 수 있음
- 일반적으로 잘 사용되지 않으며, 보안상의 이유로 URL에 포함하는 것은 권장되지 않음
- 예시: user:pass@
- Hostname(호스트 이름):
- 리소스가 위치한 서버의 도메인 이름 또는 IP 주소를 나타냄
- 예: www.example.com, 192.168.1.1
- 예시: www.example.com
- Port(포트) [옵션]:
- 서버의 특정 네트워크 포트를 지정합니다. 생략되면 기본 포트가 사용됨
- 예: HTTP의 기본 포트는 80, HTTPS의 기본 포트는 443
- 예시: :8080
- Path(경로):
- 서버 내에서 리소스의 위치를 나타내는 경로
- 일반적으로 디렉토리와 파일 이름으로 구성됨
- 예: /path/to/resource
- 예시: /index.html
- Query(쿼리) [옵션]:
- 리소스에 대한 추가 매개변수를 제공하는 쿼리 문자열
- ?로 시작하고, &로 구분된 키-값 쌍으로 구성됨
- 예: ?key1=value1&key2=value2
- 예: ?id=1234&sort=asc
- 예: ?topic=pizza
- Fragment(프래그먼트) [옵션]:
- 리소스 내에서 특정 부분으로 이동할 수 있도록 하는 앵커
- #로 시작
- 예: #section2
- 예시: #top
- client에서 server로 보내야하는 정보들
- browser 종류
- ip주소
실습) URL에서 HTML 파싱하여 원하는 정보찾기
- URL에서 HTML 파일 받아오기
import requestsfrom google.colab import files
# URL 설정
# 요청 보내기response = requests.get(url)
# 응답 상태 코드 확인if response.status_code == 200:# HTML 콘텐츠 저장with open('html_test.html', 'w', encoding='utf-8') as file:file.write(response.text)print("HTML 파일이 성공적으로 저장되었습니다.")# 파일 다운로드files.download('html_test.html')else:print(f"HTTP 요청 실패: {response.status_code}") - HTML 파일 로딩
with open('/content/html_yes24.html', 'r', encoding = 'utf-8') as f: # 'r' 읽기 모드로 오픈html = f.read() # f.read()는 파일의 전체 내용을 문자열로 읽어오는 메서드# 소스 코드 출력print(html) - BeautifulSoup 라이브러리를 사용하여 HTML 문서를 파싱하고 처리
# BeautifulSoup: HTML, XML 문서를 파싱하고 탐색하는 기능 제공from bs4 import BeautifulSoup
# html 문자열을 BeautifulSoup 객체로 변환# lxml은 파서(parser)soup=BeautifulSoup(html, 'lxml')- 파싱(parsing)이란, HTML 코드를 분석하여 이해할 수 있는 구조로 변환하는 것을 의미
- BeautifulSoup은 여러 파서를 지원하며, 그 중 lxml은 속도가 빠르고 유연한 파서
- HTML 내 보고자하는 요소들 찾기
#모든 요소(division의 요소값)을 찾기d1= soup.find_all('div')
classes = []ids = []
# for문을 이용하여 d1에 있는 div 값을 가져와서 안에있는 id/ class 값을 추출for element in d1:# class의 속성은 여러개를 가질 수 있기때문에 여러개의 class를 extend로 추가 (e.g.div class = class1, class2)if 'class' in element.attrs:classes.extend(element['class'])# id 속성은 단일 값을 가지기에 append 사용 (e.g.id = uniqueID)if 'id' in element.attrs:ids.append(element['id'])
print('classes:', classes)print('IDs:', ids)
