requests VS urllib.request
웹페이지를 간단하게 크롤링 한다면 Python 패키지인 requests와 urllib를 사용할 수 있습니다.
결론적으로 두 패키지간의 기능은 거의 유사하며 간단한 웹페이지 크롤링이 필요하다면 requests를 사용하는게 간편합니다.
request
먼저 두 패키지를 사용하여 결과를 확인해보자.
import requests
import urllib.request
from bs4 import BeautifulSoup ## html parsing을 위한 패키지
만약 위의 코드를 실행하는데 에러가 발생한다면 터미널 또는 쥬피터노트북에서 아래의 코드를 실행시켜 bs4를 설치할 수 있습니다.
!pip install beautifulsoup4
두 패키지를 비교하기 위해 네이버에서 무작위로 뉴스의 링크를 가져왔습니다.
url ='https://n.news.naver.com/mnews/article/023/0003808490?sid=100'
requests의 사용법은 매우 직관적입니다. URL을 문자열로 직접 전달하고 GET 요청을 보낼 때는 requests.get()함수를 사용합니다. 다른 HTTP 메서드를 사용하려면 다른 함수를 사용할 수 있으나 간단한 크롤링을 한다면 GET 요청으로도 충분합니다.
아래의 코드를 통해 크롤링하려는 웹페이지의 html을 추출할 수 있습니다.
response = requests.get(url)
html_requests = response.text
print(html_requests)
BeautifulSoup는 파이썬의 HTML 및 XML 문서를 파싱하고 검색하는 데 사용되는 라이브러리입니다. 주로 웹 스크래핑(웹 페이지에서 데이터 추출)에 활용되며, HTML 및 XML 문서를 트리 구조로 변환하여 데이터를 추출하거나 조작할 수 있게 해줍니다.
아래는 requests와 bs4를 사용하여 웹페이지의 html을 추출한 결과입니다.
soup_urllib = BeautifulSoup(html_urllib,'html.parser')
print(soup_request)
urllib.requests
위의 뉴스와 동일한 url을 사용하여 진행합니다. urllib.request는 requests와 달리 객체를 생성하여 URL을 전달한 후 urllib.request.urlopen()함수를 사용하여 실제 요청을 보냅니다. request보다 덜 직관적입니다. 다만 bot임을 숨기고 크롤링을 해야할 때와 같이 복잡한 HTTP 메서드를 사용하할 때 urllib을 사용하는게 유리할 수 있습니다.
response = urllib.request.Request(url)
html_urllib = urllib.request.urlopen(response).read()
print(html_urllib)
웹페이지의 HTML을 크롤링하고자 할 때, requests와 urllib의 결과는 동일합니다.
soup_urllib = BeautifulSoup(html_urllib,'html.parser')
print(soup_request)
requests VS urllib.request
따라서 간단한 웹페이지를 크롤링하여 원하는 정보를 추출하기 위해선 requests 또는 urllib.request를 사용하는 것은 차이가 없습니다. requests는 요청하는 url이 잘못된 url일 경우 아래와 같이 404 error가 발생한 페이지를 가져옵니다. 그러나 urllib.request는 파이썬 자체에서 HTTPError가 발생합니다.
간단하게 설명하자면 requests는 잘못된 페이지를 전달해도 에러가 발생하지 않으며 urllib는 잘못된 페이지를 전달하면 코드가 중단된다는 단점이 있습니다. 물론 이는 예외처리로 처리한다면 간단하게 해결될 문제입니다.
url ='https://n.news.naver.com/mnews/wrong_article/023/0003808490?sid=100'
response = requests.get(url)
html_requests = response.text
print(html_requests)
soup_request = BeautifulSoup(html_requests,'html.parser')
print(soup_request)
response = urllib.request.Request(url)
html_urllib = urllib.request.urlopen(response).read()
print(html_urllib)
soup_urllib = BeautifulSoup(html_urllib,'html.parser')
print(soup_request)
결론
간단한 웹페이지 크롤링에선 requests를 사용하는걸 추천합니다. urllib를 사용하는건 좀 더 복잡한 크롤링(Ex 봇우회)이 필요할 때 사용하는게 좋습니다. 아래의 코드를 사용하면 간단한 웹사이트 html 추출이 가능합니다.
import requests
import urllib
from bs4 import BeautifulSoup
url ='' ## 원하는 웹사이트 Url로 변경
response = requests.get(url)
html_requests = response.text
print(html_requests)
soup_request = BeautifulSoup(html_requests,'html.parser')
print(soup_request)