파이썬

셀레니움 스크롤 반복문...

귀신이보인다 2022. 11. 19. 10:34
728x90
반응형

개인적으로 스크롤을 써야 되는 반복문이 필요했다.

여러 검색을 해보니 무한 반복문이거나 혹은 한번만 하는 스크롤하는 방법이 있었다.

물론 몇번의 스크롤을 하는 내용의 글은 있었다. 하지만 나에겐 필요없는 반복문이다.

그래서 여러방안을 생각해본결과 무한 반복문에다가 몇 코드를 집어넣는것이다.

크롤링을 하게 되면 최상단의 제목이라던지 기타등등의 내용을 크롤링 하면서 저장하였다

이후 실행하면 저장된 내용과 대조해보면서 스크롤을 한다.

물론 시간이 걸리는건 예외 ㅋㅋㅋ

일단 코드는 이렇다.

def scroll_to(drv,url,scrool_check):
	check_list = []
	#스크롤이 마지막까지 위치한뒤 첫 게시물의 내용을 불러와서 비교후 스크롤이 넘어가게 되면 스크롤을 진행함
	if 'clazzes' in url:
		check_file = mydir + "/class_room.json"
	elif 'schools' in url:
		check_file = mydir + "/school_room.json"
	if not os.path.isfile(check_file):
		scrool_check = 'False'
	else:
		with open(check_file, 'r') as file:
			data = json.load(file)
			list = data[0]
			date_check = list["DATE"]
			title_check = list['TITLE']
			category_check = list['CATEGORY']
	naga = False
	scroll_location = drv.execute_script("return document.body.scrollHeight")
	while True:
		#현재 스크롤의 가장 아래로 내림
		drv.execute_script("window.scrollTo(0,document.body.scrollHeight)")
		#전체 스크롤이 늘어날 때까지 대기
		time.sleep(2)
		#늘어난 스크롤 높이
		scroll_height = drv.execute_script("return document.body.scrollHeight")
		
		#늘어난 스크롤 위치와 이동 전 위치 같으면(더 이상 스크롤이 늘어나지 않으면) 종료
		if scroll_location == scroll_height:
			break
		elif (naga == True):
			break
		#실행후 맨처음의 게시물이 넘어가면 스크롤 함
		elif scrool_check == 'True':
			time.sleep(10)
			html = drv.page_source
			soup = bs(html, 'html.parser')
			check = soup.findAll("div",{"class":"board__header"})
			for ii in check:
				title = ii.find("strong",{"class":"heading"}).text.strip()
				write_date = ii.find("span",{"class":"date"}).text.strip()
				category = ii.find("span",{"class":"category"}).text.strip()
				if title_check in title and date_check in write_date and category_check in category:
					naga = True
					print('있다')
					break
				else:
					#스크롤 위치값을 수정
					scroll_location = drv.execute_script("return document.body.scrollHeight")
				print(naga)
			if (naga == True):
				break
		#같지 않으면 스크롤 위치 값을 수정하여 같아질 때까지 반복
		else:
			#스크롤 위치값을 수정
			scroll_location = drv.execute_script("return document.body.scrollHeight")

일단 급한대로 대충 코드는 이렇게 만들었다.

스크롤도중 크롤링까지 해야 되기에 시간이 걸린다.

일단 이 코드는 수정을 해서 사용해야 된다.

복붙으로 어제 했다가 가만이 생각하니 해당 사이트에 게시물이 쌓이면 스크롤해야 되니 코드를 미리 만들어서 사용하여 본다.

본인에게 맞게 수정하고 사용한다.

while 문 안의 if 문과 else 문은 검색하면서 얻은 코드이다.

elif 문은 내가 코드 추가한부분이다.

고로 elif 문을 적절하게 수정하면 스크롤을 무한 반복 하지않고 한번 스크롤을 진행뒤에 과거 크로링을 했던 결과물과 현재 실행한 결과가 같은 값이 나올때까지 반복 스크롤 하는 코드입니다.

쉽게 설명하자면 2021-01-10 게시물을 마지막으로 실행을 했었고 2022-02-10 이라는 게시물이 않보이면 보일때까지 스크롤 진행하는겁니다.

더 쉬운 방법도 있을겁니다. 하지만 해당 사이트가 이상하게 url 도 않보이고 xpath 도 잘 맥히지 않음...

과거 키즈노트와 비슷한거 같음... 아이선택시에 코드가 않맥힘...

잘되다가 않되다가 하는 코드 ;;;; 고로 전 셀레니움과 Bs 를 이용함...

해당 사이트가 XPATH 같은 코드가 잘 맥히면 좀 쉬운 방법을 저장하고 저장한 내용과 비교 대조 하는 코드를 집어넣으면 간단함....

급하게 만드느라 코드가 지저분 하겠지만 코드를 더 간소화 할수가 있을거다.

참고로 이쪽 계통의 JOB 을 가진게 아님을 밝힘니다.

 

728x90
반응형