새소식

반응형
Toy Project/Crawler

[Crawler] 파이썬 웹 크롤링(기본편) 5 - 검색어 변경하기

  • -
반응형

파이썬 로고 이미지입니다.
Python

 

파이썬 웹 크롤링(기본 편) 5  - 검색어 변경하기


파이썬으로 크롤링을 하기에 앞서 기본 개념인 URL에 대한 지식이 있어야 하기 때문에 URL이 무엇인지에 대해 한 번 살펴보자.

 

URL이란?

URL Uniform Resource Locator의 약어로, 인터넷상에서 리소스(자원)의 위치를 지정하는 표준화된 주소체계이다. URL은 웹 브라우저나 웹 클라이언트가 웹 서버에게 어떤 리소스를 요청할지를 결정하는 데 사용된다. 일반적으로 URL은 다음과 같은 구조를 가지고 있다.

scheme://host:port/path?query#fragment
  • scheme - 리소스에 접근하기 위해 사용되는 프로토콜을 나타낸다. 예를 들면 http, https, ftp 등이 있다.
  • host - 리소스가 위치한 서버의 도메인 이름이나 IP 주소를 나타낸다.
  • port - 서버와의 통신에 사용되는 포트 번호를 나타낸다. 생략될 경우 일반적으로 사용되는 포트 번호가 자동으로 지정된다.
  • query - 요청 파라미터를 나타낸다. 주로 검색어나 필터링을 위한 정보를 전달하는 데 사용된다.
  • fragment - 문서나 리소스 내에서 특정 위치를 나타낸다. 주로 웹 페이지 내의 특정 섹션을 가리키는 데 사용된다.
https://www.example.com:8080/path/to/resource?param=value#section

예를 들어, 위와 같은 URL이 있을 때, HTTPS 프로토콜을 사용하며, "www.example.com"이라는 호스트의 8080 포트에 위치한 "path/to/resource/" 경로의 리소스를 요청하고, 쿼리 파라미터 "param"에는 "value"가 전달되며, 페이지 내에서는 "section"이라는 섹션을 가리키고 있다.

 

그럼 지난 시간에 살펴보았던 네이버에서 알파벳 A주를 검색한 URL에 대해 한 번 분석해 보자.

https://search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%95%8C%ED%8C%8C%EB%B2%B3+a%EC%A3%BC

https - 프로토콜, search.naver.com - 도메인, search.naver - 경로,? 이후는 파라미터로 이 루져 있다. 

 

각 파리미터는 keyvalue로 이루어져 있는데 key=value 같은 형식으로 돼있다. 따라서 위의 URL을 기준으로 where=news , sm=tab, query=%EC%95%8C%ED%8C%8C%EB%B2%B3+a%EC%A3%BC 같이 한 쌍의 키와 값으로 이루어져 있는 걸 확인할 수 있다.

 

여기에서 query는 검색어에 해당된다. 따라서 Python에서 사용자에게 검색어를 입력받은 뒤 query 값을 변경해 주면 된다. 

import requests
from bs4 import BeautifulSoup

keyword = input("검색어를 입력하세요 → ")

# 크롤링 하려는 사이트 주소
response = requests.get("https://search.naver.com/search.naver?where=news&sm=tab_jum&query=" + keyword)

# response.text는 해당 페이지의 전체 html 코드를 가져오는 의미이다.
html = response.text

# 따라서 BeautifulSoup를 이용해 해당 text에서 원하는 정보만 가져와야 한다.
soup = BeautifulSoup(html, "html.parser")

# 파라미터로 아까 찾았던 클래스 "news_tit"를 넣어준다.
# 반환값의 형태는 리스트이다.
links = soup.select(".news_tit")  
print(type(links)) # 결과 : <class 'bs4.element.ResultSet'>
print('------------------')
for link in links:
    print(f'type(link) : {type(link)}') # 결과 : <class 'bs4.element.Tag'>
    title = link.text # 각 링크의 텍스트만 가져온다.
    url = link.attrs['href'] # 각 링크의 href 속성 정보만 가져온다.
    print(f'Titile : {title}')
    print(f'URL : {url}')
    print('------------------')

지난 시간에 작성했던 코드에서 변경된 것은 사용자로부터 검색어를 받기 위해 input() 함수를 사용한 것과 입력받은 키워드 값을 keyword 변수에 담아 URL 주소 중에 query 앞에 추가해 준 것뿐이다. 위의 코드를 실행하게 되면 사용자로부터 검색 키워드를 입력받아 해당 키워드에 대한 뉴스글을 네이버에서 가져올 수 있다.

 

검색어를 입력하세요 → 코카콜라 주식
<class 'bs4.element.ResultSet'>
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 워런 버핏 '영혼의 파트너' 찰리 멍거, 향년 99세에 별세
URL : https://www.hankyung.com/article/202311290036i
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : [미국주식] 꾸준한 고수익이 매력.. '하이퀄리티' 주식 20선
URL : https://www.itooza.com/common/iview.php?no=2023112812453422917
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : [미국주식] 배당킹이 2개나? 12월 대표 배당주 5선 - 월배당(3)
URL : https://www.itooza.com/common/iview.php?no=2023112214530784509
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 코카콜라 유로퍼시픽, 18억 달러에 필리핀 코카콜라 음료 주식회사 인수 합의
URL : http://www.wowtv.co.kr/NewsCenter/News/Read?articleId=A202311200230&t=NN   
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 브리지워터, 中 주식 팔고 브로드컴·넷플 샀다
URL : https://www.hankyung.com/article/2023112640851
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 버핏 가치투자 전략 완성한 '영혼의 단짝' 멍거 떠났다
URL : https://www.hankyung.com/article/2023112924351
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 버핏, 3분기 주식 비중 줄였다…GM 지분 청산
URL : https://view.asiae.co.kr/article/2023111518112845347
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 콜라 주가 떨어뜨렸다..."체중 20% 감소" 전세계 뒤흔든 이 약
URL : https://www.joongang.co.kr/article/25207358
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 코카콜라 주식 사는 서학개미… 배당주에 주목
URL : https://www.seoul.co.kr/news/newsView.php?id=20231102018004&wlog_tag3=naver
------------------
type(link) : <class 'bs4.element.Tag'>
Titile : 서학개미, 10월 '배당왕' 코카콜라 450억 넘게 사모았다
URL : http://moneys.mt.co.kr/news/mwView.php?no=2023103017050640295
------------------

실행 결과

 

 

pyautogui

pyautogui 라이브러리는 간단하게 설명하면 마우스랑 키보드 매크로 라이브러리이다. 이번 시간에 해당 라이브러리에 대해 자세히 다루진 않고, 앞서 보았던 예제 코드에서 input() 함수 대신 간단한 GUI에서 사용자로부터 검색어를 입력받아 크롤링을 해오는 실습을 한 번 해보기 위함이다.

 

먼저 pyautogui 라이브러리가 설치되어 있지 않으면 터미널창에서 아래의 명령어를 통해 라이브러리를 설치하자.

pip install pyautogui

 

설치가 완료되었다면 pyautogui에서 제공하는 prompt() 함수를 이용하여 간단하게 사용자로부터 입력을 GUI로 받을 수 있다. 앞에서 실습했던 예제 코드에서 다음과 같은 부분을 추가하고 변경하자.

import pyautogui

keyword = pyautogui.prompt("검색어를 입력하세요 → ")
# 생략

실습했던 예제 코드에서 pyautogui를 import 해준 뒤 input() 함수였던 부분을 위와 같이만 변경해 주면 된다.

 

pyautogui 라이브러리를 이용하여 prompt 창을 생성하는 이미지입니다.
실행 화면

 

propmt 창에서 검색 키워드를 입력한 뒤 OK 버튼을 누르면 처음 실습했던 예제의 실행결과와 같은 값을 출력하게 된다.

 
728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.