Day 7

TIL - HTTP

๐Ÿ“‹ย ๊ณต๋ถ€ ๋‚ด์šฉ

์›น

์›น ํŽ˜์ด์ง€์™€ HTML

์›น ํŽ˜์ด์ง€

  • ์›น ์†์˜ ๋ฌธ์„œ ํ•˜๋‚˜
  • ex) ๋„ค์ด๋ฒ„ ๋ฉ”์ธ ํŽ˜์ด์ง€
  • HTML์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์Œ

์›น ์‚ฌ์ดํŠธ

  • ์—ฌ๋Ÿฌ ์›น ํŽ˜์ด์ง€์˜ ๋ชจ์Œ
  • ex) ๋„ค์ด๋ฒ„๋ผ๋Š” ์›น ์‚ฌ์ดํŠธ

์›น ๋ธŒ๋ผ์šฐ์ €

  • HTTP์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„, HTTP์‘๋‹ต์— ๋‹ด๊ธด HTML๋ฌธ์„œ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํ™”๋ฉด์œผ๋กœ ๊ทธ๋ ค์ฃผ๋Š” (๋ Œ๋”๋ง) ์—ญํ• 

HTML(๊ฐœ๋… ์ •๋ฆฌ ๊ธ€ ๋งํฌ)

  • ์ด์ „ ๊ฐ•์˜์—์„œ ๋‹ค๋ฃฌ ๋‚ด์šฉ ์ฐธ๊ณ 
  • ์›น ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ์ง€์›ํ•˜๋Š” ํƒœ๊ทธ์™€ ์†์„ฑ์ด ๋‹ฌ๋ผ์ง

์›น ์Šคํฌ๋ž˜ํ•‘ / ์›น ํฌ๋กค๋ง

์›น ์Šคํฌ๋ž˜ํ•‘

  • ํŠน์ • ๋ชฉ์ ์— ๋”ฐ๋ผ ์›น ํŽ˜์ด์ง€์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ “์ถ”์ถœ”
  • ex) ๋‚ ์”จ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ, ์ฃผ์‹ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, …

์›น ํฌ๋กค๋ง

  • ํฌ๋กค๋Ÿฌ๋ฅผ ์ด์šฉํ•ด URL์„ ํƒ€๊ณ  ์ด๋™ํ•˜๋ฉฐ ๋ฐ˜๋ณต์ ์œผ๋กœ ์›น ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ “์ธ๋ฑ์‹ฑ”(๋ฐ์ดํ„ฐ ์ƒ‰์ธ)
  • ๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„ ๋“ฑ ๊ฒ€์ƒ‰ ์—”์ง„์˜ ์›น ํฌ๋กค๋Ÿฌ

์˜ฌ๋ฐ”๋ฅธ HTTP Request

์˜ฌ๋ฐ”๋ฅธ HTTP Request๋ฅผ ์œ„ํ•ด์„ ..

  • ์–ด๋–ค ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•˜๋ ค ํ•˜๋Š”๊ฐ€?
  • ์„œ๋ฒ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€?

๋กœ๋ด‡ ๋ฐฐ์ œ ํ”„๋กœํ† ์ฝœ(REP)

  • ์›น ํฌ๋กค๋ง, ์Šคํฌ๋ž˜ํ•‘์€ ๋กœ๋ด‡์— ์˜ํ•ด ์‹คํ–‰ ๊ฐ€๋Šฅ
  • ์‚ฌ์ดํŠธ์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ทจ๋“ํ•˜๋Š”๊ฒƒ์ด ์ •๋‹นํ•œ๊ฐ€? ์˜๋ฌธ์—์„œ ์‹œ์ž‘
  • robots.txt
    • ๊ฐ ์‚ฌ์ดํŠธ๋งˆ๋‹ค ํ—ˆ์šฉํ•˜๋Š” ํฌ๋กค๋Ÿฌ ์ •๋ณด์™€ ํ—ˆ์šฉ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Œ
    • User-agent, Disallow, Allow

HTTP

HTTP?

HyterText Transfer Protocol
์›น ์ƒ์—์„œ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ์•ฝ์†

HTTP RequestHTTP Response
๋ฐฉํ–ฅClient -> ServerClient <- Server
์—ญํ• ์ •๋ณด ์š”์ฒญ์š”์ฒญ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ด์€ ์‘๋‹ต
HEADmethod, path, …content-type, date, …
BODYdocument

ํ†ต์‹ ํ•˜๊ธฐ

requests

  • Python์œผ๋กœ HTTP ํ†ต์‹ ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

GET

  • naver ๋ฉ”์ธ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜๋Š” ์ฝ”๋“œ
1
2
3
4
import requests
res = requests.get("https://www.naver.com") # HTTP Response
res.headers # Header ํ™•์ธ
res.text # Body(document) text ํ˜•ํƒœ๋กœ ํ™•์ธ

POST

  • https://webhook.site ๋ฅผ ํ†ตํ•ด POST ํ†ต์‹ ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
1
2
3
4
payload = {"name": "Hello", "age": 13}
url = "https://webhook.site/<๊ฐœ์ธ ์ฃผ์†Œ>"
res = requests.post(url, payload)
res.status_code # ์ƒํƒœ ์ฝ”๋“œ ํ™•์ธ

DOM

DOM?

Document Object Model
HTML์„ ํŒŒ์‹ฑํ•˜์—ฌ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•˜๋„๋ก ๋งŒ๋“  Treeํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ

  • DOM์˜ ๊ฐ ๋…ธ๋“œ๋ฅผ ๊ฐ์ฒด๋กœ ์ƒ๊ฐํ•˜์—ฌ, ๋ฌธ์„œ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

  • ์›ํ•˜๋Š” ์š”์†Œ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ

  • ์›ํ•˜๋Š” ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ

  • python์œผ๋กœ HTML์„ ์ง์ ‘ ๋ถ„์„ํ•˜๋ ค๋ฉด DOM์„ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ง์ ‘ HTML์„ ๋ถ„์„ํ•˜๋Š” HTML Parser๊ฐ€ ํ•„์š”

๐Ÿ‘€ย CHECK

(์–ด๋ ต๊ฑฐ๋‚˜ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋œ ๊ฒƒ ๋“ฑ ๋‹ค์‹œ ํ™•์ธํ•  ๊ฒƒ๋“ค)

  • Jupyter lab

    • Jupyter notebook์ด๋‚˜ Colab์€ ์จ ๋ดค๋Š”๋ฐ Jupyter lab์€ ์ฒ˜์Œ ์ ‘ํ•ด๋ด„
    • Jupyter notebook๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ๋” ๊ฐœ์„ ๋œ ๋ฒ„์ „(?)
  • DOM์— ๋Œ€ํ•œ ์„ค๋ช… ๋ฐ ํ™œ์šฉ : ๋ณต์Šต ํ›„ ๋‹ค๋ฅธ ์˜ˆ์‹œ๋“ค์„ ๋” ์ฐพ์•„๋ณผ ๊ฒƒ

โ—ย ๋Š๋‚€ ์ 

HTML ์Šคํฌ๋ž˜ํ•‘์„ ํ•ด๋ณธ์ ์ด ์žˆ์–ด์„œ ์ด๋ก ์ด๋‚˜ ์‹ค์Šต ๋ชจ๋‘ ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰ํ–ˆ๋‹ค. 5์‹œ๊ฐ„ ๋ถ„๋Ÿ‰์˜ ๊ฐ•์˜์ธ๋ฐ 3์‹œ๊ฐ„ ๋‚ด๋กœ ๋๋‚œ ๊ฒƒ ๊ฐ™๋‹ค. TIL์„ ์ž˜ ์ ๊ณ  ์‹ถ์–ด์„œ ๊ณ ๋ฏผ์„ ์ข€ ํ–ˆ๊ณ  ๊ทธ ์™ธ์˜ ์‹œ๊ฐ„์€ ํ‰์†Œ๋ณด๋‹ค๋Š” ๋„๋„ํ•˜๊ฒŒ ํ˜๋ ค๋ณด๋ƒˆ๋‹ค.

TIL์„ ์ ์„ ๋•Œ ๊ธฐ์กด์—๋Š” ๊ฐ•์˜ ๋ฐ›์•„์“ฐ๊ธฐ์ฒ˜๋Ÿผ ์ ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๋‚˜์ค‘์— ๋‹ค์‹œ ์ฝ์–ด๋ณด๋‹ˆ ์ดํ•ดํ•˜๊ณ  ์“ด ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ์ „ํ˜€ ๋“ค์ง€ ์•Š์•˜๋‹ค. ์–ด์ œ HTML์ด๋ก ์— ๋Œ€ํ•œ TIL์€ ์‹ค์Šต ๋ถ€๋ถ„ ์™ธ์—๋„ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ํ•˜๋ฉด์„œ ์ ์€๊ฑฐ๋ผ, ‘๋‚ด๊ฐ€ ์ง์ ‘ ์จ๋ณด๊ณ  ์ดํ•ดํ•œ ๋‚ด์šฉ’์ž„์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ดˆ๋ฐ˜์— ์ ์€ TIL์„ ๋‹ค์‹œ ๋ณด๋‹ˆ๊นŒ ๊ทธ๋ƒฅ ๋ฐ›์•„์ ์€๊ฒŒ ํ‹ฐ๊ฐ€ ๋‚˜๊ธฐ๋„ ํ•˜๊ณ  ์ž˜ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์•˜๋‹ค.

์˜ค๋Š˜์€ ๊ฐ•์˜๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋“ค์€ ํ›„ ํ‚ค์›Œ๋“œ๋งŒ ์ฒดํฌํ•ด ํ•„๊ธฐํ•œ ๋‹ค์Œ, TIL์„ ์ ์œผ๋ฉด์„œ ์ค‘๊ฐ„์ค‘๊ฐ„ ๋‹ค์‹œ ๋“ฃ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด ๋ฐฉ์‹์œผ๋กœ ๋” ์ž˜ ์ฝํžˆ๊ณ  ์งœ์ž„์ƒˆ ์žˆ๋Š” ๊ตฌ์„ฑ์˜ ๊ธ€์„ ์“ฐ๊ฒŒ ๋˜์–ด์„œ ๋งŒ์กฑ์Šค๋Ÿฌ์› ๋‹ค. TIL ์“ฐ๋Š” ์‹œ๊ฐ„์€ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€๋งŒ ์ต์ˆ™ํ•ด์ง€๋ฉด ์ค„์–ด๋“ค ๊ฒƒ ๊ฐ™์•„์„œ ๊ฑฑ์ •์€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ปค๋ฆฌํ˜๋Ÿผ์„ ๋ณด๋‹ˆ ๋‚ด์ผ๋ถ€ํ„ฐ๋Š” BeautifulSoup๋ฅผ ์‚ฌ์šฉํ•ด ์Šคํฌ๋ž˜ํ•‘์„ ์‹œ์ž‘ํ•˜๋Š”๋ฐ, ๋ชจ๋ฅด๋Š” ๋ถ€๋ถ„์ด ๋งŽ์„ ๊ฒƒ ๊ฐ™์•„ ๋ฒŒ์จ๋ถ€ํ„ฐ ๊ธฐ๋Œ€๊ฐ€ ๋œ๋‹ค. :>

Hugo๋กœ ๋งŒ๋“ฆ
Jimmy์˜ Stack ํ…Œ๋งˆ ์‚ฌ์šฉ ์ค‘