티스토리 뷰

728x90
반응형

가끔 크롤링을 할 때 현재 날짜 기준으로 6개월치의 데이터만 가져오고 싶을 때가 있습니다.

이럴 때 날짜를 다룰 때는 일반적으로 사칙연산(더하기, 빼기 등)을 통해서 연도, 월, 일에 대해 연산이 어렵습니다.

따라서 기준 날짜에 대한 연산이 필요할 때는 dateutil.relativedelta 모듈의 relativedelta 함수를 이용하면 편리합니다.

 

기준 날짜 월(month) 연산

  • 2022년 1월 25일 6개월 전/후 날짜 구하기
import datetime
from dateutil.relativedelta import relativedelta

now_date = datetime.datetime.now()
after_six_month = now_date + relativedelta(months=6)
before_six_month = now_date + relativedelta(months=-6)

print(str(after_six_month))
print(str(before_six_month))
  • 위 코드 실행 결과
2022-07-25 02:10:30.975269
2021-07-25 02:10:30.975269

 

기준 날짜 일(Day) 연산

  • 2022년 1월 25일의 100일 전/후 날짜 구하기
import datetime
from dateutil.relativedelta import relativedelta

now_date = datetime.datetime.now()
after_hundred_days = now_date + relativedelta(days=100)
before_hundred_days = now_date + relativedelta(days=-100)

print(str(after_hundred_days))
print(str(before_hundred_days))
  • 위 코드 실행 결과
2022-05-05 02:13:01.048934
2021-10-17 02:13:01.048934

 

기준 날짜 연도(Year) 연산

  • 2022년 1월 25일의 5년 전/후 날짜 구하기
import datetime
from dateutil.relativedelta import relativedelta

now_date = datetime.datetime.now()
after_five_years = now_date + relativedelta(years=5)
before_five_years = now_date + relativedelta(years=-5)

print(str(after_five_years))
print(str(before_five_years))

 

실습 예제

  • 크롤링 할 때 수많은 데이터들 중에서 기준 날짜 전까지 데이터를 모두 가져오게 할 때 위와 같은 날짜 데이터 연산을 활용하면 매우 편리할 거라고 생각됩니다. 이제 위를 사용해서 돔돔이블로그 게시글을 스크래핑 해볼 건데요.
  • 가져올 데이터는 제목, URL 링크, 날짜 데이터 입니다.
  • 그리고 오늘 날짜로부터 2개월 전까지의 게시글 제목, URL 링크, 날짜 데이터를 가져올 것입니다.

  • 소스코드
import json
import requests
import datetime
from bs4 import BeautifulSoup
from dateutil.relativedelta import relativedelta

url = 'https://domdom.tistory.com'
headers = {
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'
}

response = requests.get(url=url, headers=headers)

soup = BeautifulSoup(response.text, 'lxml')

boards = []
page = 1
loop = True
while loop:
	_url = url + '?page=' + str(page)
	# print(_url)
	res = requests.get(url=_url, headers=headers)
	soup = BeautifulSoup(res.text, 'lxml')

	posts = soup.select('.post-item')
	now_date = datetime.datetime.now()
	before_two_month = now_date + relativedelta(months=-2)
	for post in posts:
		post_title = post.select_one('.title').text
		post_url = url + post.select_one('a').attrs.get('href')
		post_date = datetime.datetime.strptime(post.select_one('.date').text, '%Y. %m. %d.')

		if post_date < before_two_month: # 현재 시점 2개월보다 더 지난 게시글이면 종료
			loop = False
			# print(page, str(post_date), post_title)
			break

		board = {
			"title": post_title,
			"url": post_url,
			"date": str(post_date)
		}
		boards.append(board)
	page = page + 1

data = {
	"before_two_month": str(before_two_month),
	"boards": boards
}
json_date = json.dumps(data)

with open('./two_month_latest_boards.json', 'w') as f:
	f.write(json_date)
  • two_month_latest_boards.json 파일 내용
{
  "before_two_month": "2021-11-25 02:57:49.808520",
  "boards": [
    {
      "title": "[갤럭시 버즈 프로] 갤럭시버즈프로를 선물받았어요!!",
      "url": "https://domdom.tistory.com/327",
      "date": "2022-01-21 00:00:00"
    },
    {
      "title": "[2022년 정보처리기사 필기] 1. 소프트웨어설계: Cp3. 애플리케이션 설계",
      "url": "https://domdom.tistory.com/326",
      "date": "2022-01-21 00:00:00"
    },
    {
      "title": "[2022년 정보처리기사 필기] 1. 소프트웨어설계: Cp2. 화면 설계2",
      "url": "https://domdom.tistory.com/325",
      "date": "2022-01-20 00:00:00"
    },
    {
      "title": "[2022년 정보처리기사 필기] 1. 소프트웨어설계: Cp2. 화면 설계",
      "url": "https://domdom.tistory.com/324",
      "date": "2022-01-14 00:00:00"
    },
    {
      "title": "[dreamhack] [web] xss-1 문제풀이(비밀번호:FLAG)",
      "url": "https://domdom.tistory.com/323",
      "date": "2022-01-14 00:00:00"
    },
    {
      "title": "[dreamhack] [web] file-download-1 문제풀이(비밀번호:FLAG)",
      "url": "https://domdom.tistory.com/322",
      "date": "2022-01-14 00:00:00"
    },
    {
      "title": "[dreamhack] [web] simple_sqli 문제풀이(비밀번호:FLAG)",
      "url": "https://domdom.tistory.com/321",
      "date": "2022-01-13 00:00:00"
    },
    {
      "title": "[2022년 정보처리기사 필기] 1. 소프트웨어설계: Cp1. 요구사항 확인3",
      "url": "https://domdom.tistory.com/320",
      "date": "2022-01-13 00:00:00"
    },
    {
      "title": "[dreamhack] [web] pathtraversal 문제풀이(비밀번호:FLAG)",
      "url": "https://domdom.tistory.com/319",
      "date": "2022-01-12 00:00:00"
    },
    {
      "title": "[2022년 정보처리기사 필기] 1. 소프트웨어설계: Cp1. 요구사항 확인2",
      "url": "https://domdom.tistory.com/318",
      "date": "2022-01-12 00:00:00"
    },
    {
      "title": "[dreamhack] [web] cookie 문제풀이(비밀번호:FLAG)",
      "url": "https://domdom.tistory.com/317",
      "date": "2022-01-12 00:00:00"
    },
    {
      "title": "[2022년 정보처리기사 필기] 1. 소프트웨어설계: Cp1. 요구사항확인",
      "url": "https://domdom.tistory.com/316",
      "date": "2022-01-10 00:00:00"
    },
    {
      "title": "[정보처리기사] 2022년 정보처리기사 시험일정",
      "url": "https://domdom.tistory.com/315",
      "date": "2022-01-09 00:00:00"
    },
    {
      "title": "[FTZ] level10 문제풀이/Writeup - 해커스쿨(Hackerschool)",
      "url": "https://domdom.tistory.com/314",
      "date": "2022-01-07 00:00:00"
    },
    {
      "title": "[크롤링] Selenium 으로 네이버 로그인 하기 + 캡챠 우회",
      "url": "https://domdom.tistory.com/313",
      "date": "2022-01-06 00:00:00"
    },
    {
      "title": "[Hackthebox] - baby BoneChewerCon Writeup(문제풀이)",
      "url": "https://domdom.tistory.com/312",
      "date": "2022-01-04 00:00:00"
    },
    {
      "title": "[flutter] 플러터 카카오 로그인 구현하기",
      "url": "https://domdom.tistory.com/311",
      "date": "2022-01-04 00:00:00"
    },
    {
      "title": "[Hackthebox] - Full Stack Conf Writeup(문제풀이)",
      "url": "https://domdom.tistory.com/310",
      "date": "2022-01-03 00:00:00"
    },
    {
      "title": "[Hackthebox] - baby auth Writeup(문제풀이)",
      "url": "https://domdom.tistory.com/309",
      "date": "2022-01-03 00:00:00"
    },
    {
      "title": "[Hackthebox] - sanitize Writeup(문제풀이)",
      "url": "https://domdom.tistory.com/308",
      "date": "2022-01-03 00:00:00"
    },
    {
      "title": "[Hackthebox] - looking glass Writeup(문제풀이)",
      "url": "https://domdom.tistory.com/307",
      "date": "2022-01-03 00:00:00"
    },
    {
      "title": "[Hackthebox] - Interdimensional Internet Writeup(문제풀이)",
      "url": "https://domdom.tistory.com/306",
      "date": "2021-12-28 00:00:00"
    },
    {
      "title": "[python] 특정 좌표가 특정 polygon boundary 안에 있는지 확인하는 방법!",
      "url": "https://domdom.tistory.com/305",
      "date": "2021-12-27 00:00:00"
    },
    {
      "title": "[Django] URL 분리하기(urls.py)",
      "url": "https://domdom.tistory.com/303",
      "date": "2021-12-23 00:00:00"
    },
    {
      "title": "[Django] 장고 앱 생성하기",
      "url": "https://domdom.tistory.com/302",
      "date": "2021-12-22 00:00:00"
    },
    {
      "title": "[라이즈 오토그래프 컬렉션 바이 메리어트] 4성급 라이즈호텔 숙박후기💗",
      "url": "https://domdom.tistory.com/301",
      "date": "2021-12-22 00:00:00"
    },
    {
      "title": "[Django] 장고 프로젝트 생성하기",
      "url": "https://domdom.tistory.com/300",
      "date": "2021-12-21 00:00:00"
    },
    {
      "title": "[Python] 파이썬 가상 환경 사용하기(venv)",
      "url": "https://domdom.tistory.com/299",
      "date": "2021-12-20 00:00:00"
    },
    {
      "title": "[Excel] 엑셀파일 만든 날짜/콘텐츠 작성 날짜 수정하는 방법",
      "url": "https://domdom.tistory.com/298",
      "date": "2021-12-20 00:00:00"
    },
    {
      "title": "리눅스에서 파일/디렉토리 권한을 재귀적으로 변경하는 방법(chmod)",
      "url": "https://domdom.tistory.com/297",
      "date": "2021-12-15 00:00:00"
    },
    {
      "title": "[🍁메이플스토리] 제로의 토벤머리 용사와 특별 과외 이벤트!!",
      "url": "https://domdom.tistory.com/296",
      "date": "2021-12-14 00:00:00"
    },
    {
      "title": "[Research] Crack Flask Cookies (Secret Key)",
      "url": "https://domdom.tistory.com/295",
      "date": "2021-12-12 00:00:00"
    },
    {
      "title": "[Hackthebox] - Manager(Mobile) Writeup(문제풀이)",
      "url": "https://domdom.tistory.com/294",
      "date": "2021-12-09 00:00:00"
    },
    {
      "title": "[Hackthebox] - Diogenes' Rage Writeup(문제풀이)",
      "url": "https://domdom.tistory.com/293",
      "date": "2021-12-08 00:00:00"
    },
    {
      "title": "[Research] Unicode Case Mapping Collisions",
      "url": "https://domdom.tistory.com/292",
      "date": "2021-12-08 00:00:00"
    },
    {
      "title": "[전시회] 2222 EARTH MARKET 전시회를 다녀왔어요! (관람후기)",
      "url": "https://domdom.tistory.com/291",
      "date": "2021-12-06 00:00:00"
    },
    {
      "title": "[오류해결] Uncaught SyntaxError: Function statements require a function name",
      "url": "https://domdom.tistory.com/290",
      "date": "2021-12-03 00:00:00"
    },
    {
      "title": "[Hackthebox] - APKey Writeup(문제풀이)",
      "url": "https://domdom.tistory.com/289",
      "date": "2021-12-03 00:00:00"
    },
    {
      "title": "[🍁메이플스토리] 하이퍼확성기를 사용해봤어요",
      "url": "https://domdom.tistory.com/288",
      "date": "2021-12-03 00:00:00"
    },
    {
      "title": "[Android] APK 파일 리패키징(repackaging)하는 방법",
      "url": "https://domdom.tistory.com/287",
      "date": "2021-12-03 00:00:00"
    },
    {
      "title": "[🍁메이플스토리] 제로의 코어젬스톤 획득기",
      "url": "https://domdom.tistory.com/286",
      "date": "2021-12-02 00:00:00"
    },
    {
      "title": "[Hackthebox] - Don't Overreact Writeup(문제풀이)",
      "url": "https://domdom.tistory.com/285",
      "date": "2021-12-01 00:00:00"
    },
    {
      "title": "[크롤링] Selenium 으로 네이버 검색 결과 가져오기",
      "url": "https://domdom.tistory.com/284",
      "date": "2021-12-01 00:00:00"
    },
    {
      "title": "[크롤링] Selenium 사용 시 Chromedriver 다운로드하는 방법",
      "url": "https://domdom.tistory.com/283",
      "date": "2021-12-01 00:00:00"
    },
    {
      "title": "[Hackthebox] - Slippy Writeup(문제풀이)",
      "url": "https://domdom.tistory.com/282",
      "date": "2021-11-30 00:00:00"
    },
    {
      "title": "[크롤링] BeautifulSoup 으로 가져온 데이터 CSV(엑셀)파일로 저장하기",
      "url": "https://domdom.tistory.com/281",
      "date": "2021-11-30 00:00:00"
    },
    {
      "title": "[Hackthebox] - Cat(Mobile)  Writeup(문제풀이)",
      "url": "https://domdom.tistory.com/280",
      "date": "2021-11-29 00:00:00"
    },
    {
      "title": "[Android] 안드로이드 API Levels 별 버전/SDK/이름",
      "url": "https://domdom.tistory.com/279",
      "date": "2021-11-29 00:00:00"
    },
    {
      "title": "[Android] 안드로이드에서 adb 로 apk 추출하기",
      "url": "https://domdom.tistory.com/278",
      "date": "2021-11-29 00:00:00"
    },
    {
      "title": "[인감증명서] 인감도장 만들고 인감증명서 발급받는 방법",
      "url": "https://domdom.tistory.com/277",
      "date": "2021-11-27 00:00:00"
    }
  ]
}

 

- 끝 -

728x90
반응형
댓글