[Python] 웹 크롤링 (2)

소영·2022년 11월 24일
0
  1. 세팅하기
import requests
from bs4 import BeautifulSoup
import openpyxl		# 파이썬에서 엑셀을 다룰 수 있는 패키지
  1. url 설정하기
url = "https://www.~/"
qp = "Query Parameter 부분 curPage="
  1. 필요한 변수 선언해주기
postNum = []	# 주소 사이에 있는 포스트 번호를 담는 배열
count = 1		# 글 개수
  1. 1) WorkBook 생성
wb = openpyxl.Workbook()

2) Sheet 활성

sheet = wb.active

3) 데이터프레임 내 header(변수명) 생성

sheet.append(["글번호", "제목", "날짜", "담당부서", "담당자", "연락처", "내용"])
  1. 글 목록 자체만 크롤링하는 것이 아닌, 글 리스트 각각의 자세한 컨텐츠 내용(제목, 글쓴이, 날짜 등)을 크롤링하는 것이 목적이기 때문에 중첩for문을 사용했다.
for page in reversed(range(1, 68)) :

1페이지부터 67페이지까지 역순으로 for문 돌아감
(역순으로 한 이유 : 제일 끝(67페이지)에 있는 글이 제일 처음 올라온 글이라서 엑셀 파일 상에서는 제일 첫 글이 맨 위로 올라와야 한다)

hrefs = [ div.find('a')['href'] for div in linkItems	# <a href="">

for i in reversed(hrefs) :
	postNum.append(i[9:15])

a 태그의 href 주소를 hrefs 배열에 리스트 형태로 넣는다

그 다음 hrefs 배열에 대한 반복문을 돌려준다
그리고 9번째부터 14번째의 문자를 각 주소에서 추출해 빈 배열인 postNum에 추가해준다.

  • hrefs를 reversed 한 이유
    : 위에서 페이지 번호를 역순으로 돌려줬기 때문에
    만약 페이지 번호만 역순으로 돌린 채 hrefs는 역순으로 돌리지 않으면
    각 페이지에 나와있는 글 목록 리스트 순서는 그대로 담긴 채 페이지 자체만 뒤에서부터 시작한다.
for page in reversed(range(1, 68)) :
	req = requests.get(url + qp + "{}".format(page))
    bsObject = BeautifulSoup(req.content, 'html.parser')
    linkItems = bsObject.find_all('div', {'class':'subject'})
    hrefs = [ div.find('a')['href'] for div in linkItems
    
    postNum = []
    
    for i in reversed(hrefs) :
    	postNum.append(i[9:15])
        
    for num in postNum :
    	req = requests.get(url + num + qp + "{}".format(page))
        bsObject = BeautifulSoup(req.content, 'html.parser')
        
        subject = bsObject.find('div', {'class':'subject'}).text
        day = bsObject.find('div, {'class':'day'}).select_one('span').string
        department = bsObject.find('div', {'class':'info'}).select_one('span:nth-child(1)').text[4:]
        person = bsObject.find('div', {'class':'info'}).select_one('span:nth-child(2)').text[3:]
        phone = bsObject.find('div', {'class':'info'}).select_one('span:nth-child(3)').text[3:]
        
        content = bsObject.find('div', {'class':'cont'}).text
        
        sheet.append([count, subject, day, department, person, phone, content])
        
        count += 1
        
	wb.save("data.xlsx")

0개의 댓글