2024. 12. 18. 23:01ㆍDevelopers 공간 [Shorts]/Software Basic
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew,
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter
- Module Bundler : React, Webpack, Parcel
B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS
C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight
1. What? (현상)
이번 글에서는 간단하게 크롤링(Crawling)하는 Python코드를 살펴보겠습니다.
웹에서 원하는 이미지, 텍스트 등을 얻는 과정을 크롤링이라고 하고, 아래와 같이 두가지가 있습니다.
- Static(정적) 크롤링
- 주로 Static Web Page를 타겟으로 합니다.
- 빠르고, 쉽고, 수집 할 수 있는 한계가 존재합니다.
- 사용 가능 라이브러리 : requests, urllib
- Dynamic(동적) 크롤링
- Static & Dynamic Web Page 모두를 타겟으로 합니다.
- 느리고, 어렵고, 수집 대상에 한계가 거의 존재하지 않습니다.
- 어려운 이유는 url로 접속 한뒤, 원하는 정보가 있는 페이지 까지 도달하는 과정이 필요하기 때문입니다.
- 사용 가능 라이브러리 : selenium
이번 글에서는 가장 간단한 Static 크롤링만 살펴보겠습니다.
2. Why? (원인)
- X
3. How? (해결책)
제 블로그가 아래와 같을 때, 각 게시물의 제목들을 한번 크롤링해보겠습니다.
먼저 필요한 패키지를 설치할 것입니다. beautifulsoup4는 "복잡한 html 문서"를 잘 분류 및 정리 하여 다루기 쉽게 바꾸는 "Parsing 작업"을 담당합니다.
pip3 install beautifulsoup4
url을 통해 페이지를 얻어 parsing을 마치는 과정에 필요한 코드는 아래와 같습니다.
from urllib.request import Request
from urllib.request import urlopen
from bs4 import BeautifulSoup
import urllib.request
url = "https://tkayyoo.tistory.com/"
req = Request(url,headers={'User-Agent':'Mozila/5.0'})
webbyte = urlopen(req).read()
webpage = webbyte.decode('utf-8')
soup = BeautifulSoup(webpage, features='html.parser')
이제 find 함수를 통해 해당 태그를 찾아냅니다. 아래는 class를 활용해 찾아내는 방법입니다. find함수를 활용하면 가장 첫번째의 element가 return됩니다.
objects = soup.find('strong', attrs={'class':'name'})
print(objects)
이번엔 find_all 함수를 통해 return하면 모든 element들이 리스트로 아래와 같이 return됩니다.
objects = soup.find_all('strong', attrs={'class':'name'})
print(objects)
근데 위가 아닌 다른 페이지를 크롤링하다 보면 아래와 같은 에러가 날때가 있습니다.
urllib.error.HTTPError: HTTP Error 403: Forbidden
먼저 403 Error의 의미는 아래와 같습니다.
HTTP 403 is returned when the client is not permitted access to the resource despite providing authentication such as insufficient permissions of the authenticated account.
즉, 웹 페이지를 얻기 위해 서버에 접근은 가능했는데, 권한 문제로 인해 거절됐다는 것입니다.
이는 mod_security나 서버의 security 등에 의해 spider / bot 유저를 block하기 때문이라고 합니다.
그래서 "크롤링 하려고 했던 페이지"에 실제로 들어가보니 아래와 같이 "reCAPTCHA" 체크박스가 웹페이지에 걸려있네요.
정적 크롤링의 경우는 이런 상황을 극복하기 위한 도덕적인(ethical)한 방법은 없습니다.
Crawling
https://velog.io/@changhtun1/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9B%B9-%ED%81%AC%EB%A1%A4%EB%A7%81
https://wikidocs.net/224751
urllib.error.HTTPError: HTTP Error 403: Forbidden
https://blog.naver.com/naturelove87/221908009605
'Developers 공간 [Shorts] > Software Basic' 카테고리의 다른 글
[Git] Feature 브랜치에서 master 관리자의 작업파일로 대체하기 (0) | 2025.03.17 |
---|---|
[Python] 객체 데이터 저장하고 불러오기 (0) | 2024.11.20 |
[Ubuntu] Ubuntu로 멀티부팅 만들기 (0) | 2024.11.18 |
[Python] HTTP GET으로 request 보내 받기 (0) | 2024.11.11 |
[Git] master 관리자가 MR 요청한 브랜치의 conflict 해결하기 (0) | 2024.11.07 |