학회&동아리/FORZA

[FORZA STUDY] 스타트 코딩 - 이것이 진짜 크롤링이다 기본편 week2

최연재 2023. 6. 30. 03:14

섹션 3 : 실전 프로젝트 1) 뉴스 데이터 수집하기

(1) 특정 검색어 뉴스의 제목과 링크를 크롤링하기

html 구성 확인하기
mark태그는 중요를 표시하는 태그로, 태그 내 글자를 굵은 글씨로 표현한다!

📌 제목은 a 태그 안쪽 텍스트, 링크는 href 속성값.

가져올 a 태그의 클래스 확인하기

import requests
from bs4 import BeautifulSoup

response =requests.get("https://search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90")
html = response.text
soup = BeautifulSoup(html, 'html.parser')
links = soup.select(".news_tit") # 결과가 리스트
print(links)
print()

for link in links:
    title = link.text # 태그 안의 텍스트 요소를 가져옴
    url = link.attrs['href'] # href의 속성값을 가져옴
    print(title, url)

전체 화면

 

(2) 검색어에 따라 다른 결과를 나타내기 : pyautogui

- url : ex) https://search.naver.com/search.naver?where=news&sm=tab_jum&query=삼성전자

  • 인터넷 주소 형식
  • Protocol - Domain - Path - Parameter 영역으로 구성된다.
  • protocol : http, https
  • domain : IP주소에 이름을 준 것
  • path : 서버에서 해당 페이지의 경로
  • parameter : keyvalue로 구성된다. 서버에 추가적인 정보를 제공하기 위해서 사용. 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)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
links = soup.select(".news_tit") # 결과가 리스트
print(links)
print()

for link in links:
    title = link.text # 태그 안의 텍스트 요소를 가져옴
    url = link.attrs['href'] # href의 속성값을 가져옴
    print(title, url)

- pyautogui 

  • 마우스, 키보드 매크로 라이브러리
  • 간단한 입력 창 띄우기
  • 설치 : 터미널에 pip install pyautogui 입력

  • 입력창 띄우기 : pyautogui.prompt("검색어를 입력하세요!")
import requests
from bs4 import BeautifulSoup
import pyautogui

keyword = pyautogui.prompt("검색어를 입력하세요>>>")
response =requests.get(f"https://search.naver.com/search.naver?where=news&sm=tab_jum&query={keyword}")
html = response.text
soup = BeautifulSoup(html, 'html.parser')
links = soup.select(".news_tit") # 결과가 리스트
print(links)
print()

for link in links:
    title = link.text # 태그 안의 텍스트 요소를 가져옴
    url = link.attrs['href'] # href의 속성값을 가져옴
    print(title, url)

전체 화면

 

(3) 여러 페이지 결과 모두 가져오기 : 반복문

- URL 분석하기 : 페이지를 변경하면 cluster_rankstart 값이 변함.

https://search.naver.com/search.naver?where=news&sm=tab_pge&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&sort=0&photo=0&field=0&pd=0&ds=&de=&cluster_rank=31&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:all,a:all&start=11

 

📌 cluster_rank

교양 과목에서 배웠던 구글의 페이지랭크 알고리즘과 유사한 알고리즘의 결과라고 생각하고 강의를 들었다. 검색 결과로 나오는 내용들 각각에 순위를 매겨서 가장 관련성이 높은 것부터 보여주기 위해 사용하는 값이 아닐까 싶다! 이에 대해서좀 더 찾아봐야 할 것 같다.

 

📌start : 1페이지 start = 1, ... n번째 페이지 start = (n-1)*10+1

import requests
from bs4 import BeautifulSoup
import pyautogui

keyword = pyautogui.prompt("검색어를 입력하세요>>>")
lastpage = pyautogui.prompt("마지막 페이지 번호를 입력해주세요>>>")
pageNum = 1
for i in range(1, int(lastpage)*10, 10): # 1~3 페이지
    print(f"================={pageNum} 페이지 내용 출력=================")
    response =requests.get(f"https://search.naver.com/search.naver?where=news&sm=tab_jum&query={keyword}&start={i}")
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    links = soup.select(".news_tit") # 결과가 리스트
    print(links)

    for link in links:
        title = link.text # 태그 안의 텍스트 요소를 가져옴
        url = link.attrs['href'] # href의 속성값을 가져옴
        print(title, url)
    pageNum += 1


섹션 4 : 실전 프로젝트 2) 주가 정보 데이터 수집하기

; 네이버 증권 웹사이트에서 현재가를 크롤링해서 엑셀에 저장하기

 

(1) 크롤링

- 현재가 : id값이 _nowVal인 태그, 종목 : url에서의 code 파라미터 값

import requests
from bs4 import BeautifulSoup

# 종목 코드 리스트
codes = [
    '005930',
    '000660',
    '035720'
]

for code in codes:
  url = f"https://finance.naver.com/item/sise.naver?code={code}"
  response = requests.get(url)
  html = response.text
  soup = BeautifulSoup(html, 'html.parser')
  price = soup.select_one("#_nowVal").text
  price = price.replace(',', '') # 숫자 내 , 제거
  print(price)

 

(2) 엑셀 사용하기

- openpyxl 

  • 파이썬에서 엑셀을 쉽게 다룰 수 있도록 도와주는 라이브러리
  • 설치 : 터미널에 pip install openpyxl

- ex) 엑셀 파일을 새롭게 만들어서 데이터 추가 후 저장

import openpyxl

# 1. 엑셀 만들기
wb = openpyxl.Workbook()

# 2. 엑셀 워크시트 만들기
ws = wb.create_sheet('오징어게임')

# 3. 데이터 추가하기
ws['A1'] = '참가번호'
ws['B1'] = '성명'

ws['A2'] = 1
ws['B2'] = '오일남'

# 4. 엑셀 저장하기
wb.save(r'C:\startcoding\02_파이썬엑셀다루기\참가자_data.xlsx')

실행 결과

- ex) 존재하는 엑셀 파일을 가져와서 수정 후 저장

- 존재하는 엑셀 파일에 빈칸 채우기 : 특정 종목의 현재가 채우기

실행 결과

- 공식문서

  • 프로그램을 개발한 사람들이 사람들에게 사용법을 알려주는 사이트

📍openpyxl 공식문서 사이트

https://openpyxl.readthedocs.io/en/stable/tutorial.html

 

Tutorial — openpyxl 3.1.2 documentation

There is no need to create a file on the filesystem to get started with openpyxl. Just import the Workbook class and start work: A workbook is always created with at least one worksheet. You can get it by using the Workbook.active property: Sheets are give

openpyxl.readthedocs.io


다음 주면 완강입니다~