name27 / flutter

0 stars 0 forks source link

크롤링 정의와 원리 #56

Open name27 opened 1 year ago

name27 commented 1 year ago

크롤링 (Crawling) 정의

크롤링하는 프로그램을 크롤러(Crawler)

크롤링은 여러 웹페이지를 기계적으로 탐색하는 일이면, 스크래핑은 특정한 하나의 웹 페이지를 탐색하고, 소스코드 작성자가 원하는 정보를 콕 집어 추출한다는 점에서 다르다. 쉽게 말해서 웹 크롤링은 그냥 돌아만 다니는 거고 스크래핑은 긁어 오는 것이다.

하지만, 크롤링과 스크래핑은 구현방법이 거의 같기때문에 실무에서는 구분없이 많이 불림

간단한 예제) image

크롤링 원리

웹페이지의 구성 image [HTML 문서작성] [CSS 디자인 활용] [JavaScript 참조하면 상호작용 가능] 크롤러를 만들 때 HRML 태그 등을 찾아서 원하는 데이터 추출 가능

웹페이지 해석 순서

  1. 클라이언트가 서버에게 contents를 요청
  2. 서버는 요청 받은 contents를 클라이언트에게 줌
  3. 브라우저는 서버에게 받은 HTML를 해석하여 화면에 보여줌

서버: 요청에 대해 응답을 해주는 프로그램 클라이언트: 서비스를 요청하는 프로그램 image 웹페이지는 클라이언트와 서버 사이에 요청과 응답을 통해 작동하고 있다 그래서 요청과 응답 등 정보를 주고 받을 때 서버와 클라이언트 사이에 특정한 규약이 있는데 그것이 HTTP이다.

REST API는 HTTP를 사용하여 통신할 때 더 체계적인 관리를 위해 통일된 메서드를 만든 것이다. 즉, REST API는 HTTP를 사용하는 통신에서 클라이언트가 서버에게 요청을 할때 사용하는 메서드이다

대표적으로 CRUD 를 통해 대표적인 요청메서드 4가지를 분류할 수 있다. image Create = POST Read = GET Update = PUT, PATCH Delete = DETELE

[python] HTTP Client 모듈 중 request module 사용법 기본 사용 방식 - 사용 예시

import requests

requests.get(...)            #get요청 (주로 html조회요청)
requests.post(...)           #post요청 (주로 추가/수정/삭제요청)
# get과 post의 차이 : 
# get은 데이터를 가져오는데 사용되고, 
# post는 서버의 데이터를 수정하는데 사용된다. 
requests.put(...)            #put요청
requests.delete(...)         #delete요청

r = requests.get(url 주소) #url주소에 데이터 요청

r.content                 # 응답 데이터(binary형식 내용,이미지파일 등) 
r.text                    # 응답 데이터(텍스트형식 내용, 텍스트 파일에 씀)
r.json                    # 응답 데이터 JSON형태
r.url                     # 해당 url 반환
r.status_code             # 응답 상태코드 (200 이면 성공)
r.headers                 # 응답 헤더의 {K:V} 형식의 딕셔너리 자료반환
r.encoding = 'utf-8'      # 응답 객체에 인코딩 지정
  1. 요청시 header에서 User-Agent 정보를 크롬으로 지정하여 요청
    
    import requests

요청시 헤더정보를 크롬으로 지정

request_headers = { 'User-Agent' : ('Mozilla/5.0 (Windows NT 10.0;Win64; x64)\ AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98\ Safari/537.36'), }

url = "https://search.naver.com/search.naver" response = requests.get(url,headers = request_headers)

print(response)

해당 url 요청할 때 headers를 임의로 설정하여 요청한 케이스

2. 요청시 headers에 Referer 정보를 바꾸어 웹에서 접속한 것으로 요청.

월요웹툰 페이지에서 접속한 것으로 요청하여, 웹툰 이미지 파일 가져오기

import os import requests

image_url = 'https://image-comic.pstatic.net/webtoon/626907/237\ /20190115192015_d9f2b6e9d878a372dfa6f07ebfc5f14a_IMAG01_1.jpg'

Referer을 지정하여 수요웹툰 복학왕 페이지를 통해서 요청

headers = {'Referer': 'https://comic.naver.com/webtoon/list.nhn?\ titleId=626907&weekday=wed'}

response = requests.get(image_url, headers = headers) print(response) # 접속 확인 (200 = 성공) image_data = response.content # binary형식 imgfile = os.path.basename(image_url) # url을 이름으로 하는 비어있는 데이터생성

파일에 이미지 데이터를 넣기

with open(imgfile, 'wb') as f: f.write(image_data)

3. 요청시 params지정을 활용한 뉴스기사 웹 크롤링

import requests

데이터를 요청하고자 하는 url = https://news.naver.com/main/read.nhn?\

mode=LS2D&mid=shm&sid1=101&sid2=259&oid=009&aid=0004299807

params를 지정하여 요청하는 것은 url뒤에 자동으로 ?와 &연산자로 묶어주는역할

url = "https://news.naver.com/main/read.nhn"

get_params = { 'mode': 'LS2D', 'mid': 'shm', 'sid1': '101', 'sid2': '259', 'oid': '029', 'aid': '0002506893' }

r = requests.get(url,params=get_params) print(r.text)

해당 뉴스기사 데이터 가져오는 것 확인