• 카테고리

    질문 & 답변
  • 세부 분야

    업무 자동화

  • 해결 여부

    미해결

문의 드립니다.

23.09.12 14:24 작성 조회수 252

1

# 랜덤 패턴 가지고오기
def get_random_pattern(isMobile=True):
    ret_pattern = []
    if isMobile:
        with open("./mobile_scroll.txt","r") as f :
            while True:
                line = f.readline()
                if not line:
                    break
                ret_pattern.append(line.rstrip())

        selected_pattern = random.choice(ret_pattern)
        _,sx,sy,delay = selected_pattern.split("#")
        if abs(int(sy)) < 15 or float(delay) < 0.25: #너무 적은 값
            return get_random_pattern(isMobile)
        return int(sx), int(sy), float(delay)
    else: # PC 패턴 
        with open("./pc_scroll.txt", "r") as f:
            while True:
                line = f.readline()
                if not line:
                    break
                ret_pattern.append(line.rstrip())
        pc_scroll_px = 114 # 100, 114    
        selected_pattern = random.choice(ret_pattern)
        _,dx,dy,delay = selected_pattern.split("#")
        if float(delay) < 0.25:
            return get_random_pattern(isMobile)
        return int(dx),int(pc_scroll_px), float(delay)

 

질문1. 위 패턴에서 pc_scroll_px 를 114로 하는 이유를 잘 모르겠습니다.
저는 모바일 말고 pc로 작업을 해보려고하는데 114씩만 올라갔다 내려갔다 스크롤되는데 전혀 사람처럼 보이지 않고 부자연스러워 보입니다. ㅜ

 

def random_move(driver,direction="down",count=1,isMobile=True):
    for _ in range(count):
        # [O] 사람패턴 ~ 사람이 얼마나 스크롤을 움직였는지
        # randY = random.randrange(200,300)
        randX,randY,_delay = get_random_pattern(isMobile)
        sx = random.randrange(100,270)
        sy = random.randrange(250,500)

        if direction == "up":
            randY = -randY

        if random.random()  > 0.9 : #10%의 확률로
            randY = -randY

        print(f"Scroll 한다 {randY}")
        ActionChains(driver).scroll_by_amount(0, randY).perform()

        # [O] 사람패턴 ~ 스크롤 하는 텀
        prob = random.random()
        if prob < 0.5:
            dt  = random.uniform(_delay*0.1, _delay*0.3)
        elif prob < 0.8:
            dt = random.uniform(_delay*0.2, _delay*0.6)
        else:
            dt = random.uniform(_delay*0.5, _delay*1.2)

        time.sleep(dt)
        time.sleep( 0.5)

 

질문2. 매개변수로 count를 받고있는데 이 부분을 넣은 이유를 정확하게 모르겠네요. ㅜ

그리고
sx = random.randrange(100,270)
sy = random.randrange(250,500)

이렇게 받아둔 변수를 어떻게 활용하는지 강사님께서는 어떻게 사용하는지 궁금합니다.

답변 2

·

답변을 작성해보세요.

1

  1. 모바일의 경우 자연스러운 스크롤 움직임을 위해서 114px를 선택하였지만, 질문 작성자분께서 말씀하신것처럼 PC에서 스크롤하는 경우 더 큰 값으로 작업하시는게 좋을 것 같습니다.

     

  2. count 변수는 random_move(driver,direction="down", count=3) > 아래 방향으로 3번 랜덤 스크롤하기 기능을 사용할 때가 있어서 넣어놓았습니다.

  3.  

  4. selenium 4.10버전 업데이트 이전에는 ActionChains 안에 scroll(sx,sy,dx,dy) 형태로 매개변수를 넣어주는 형태였는데(sx : 스크롤을 시작하는 x 좌표, sy : 스크롤을 시작하는 y 좌표) 해당 함수 deprecated (삭제)되어서 sx, sy값은 함수내에서 사용하지 않는 변수가 되었습니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.09.14

안녕하세요, 인프런 AI 인턴이에요.

질문1에 대한 답변을 드리겠습니다.

pc_scroll_px를 114로 하는 이유는 선택한 패턴에 따라 스크롤을 움직일 때 올라가거나 내려가는 픽셀 수를 결정하기 위해서입니다. 이 코드에서 pc_scroll_px는 스크롤이 한 번 움직일 때 올라가거나 내려가는 픽셀 수를 의미합니다. 따라서 114로 설정된 값은 스크롤이 114픽셀 씩 올라가거나 내려간다는 의미입니다.

이 값을 변경하면 스크롤 동작에 픽셀 수가 변화하게 됩니다. 원하는 대로 스크롤 동작이 되지 않는다면 pc_scroll_px 값을 조정해보세요. 그리고 이 값은 사람의 동작을 모방하고자 할 때 조정되는 값이므로, 부드러운 스크롤 동작을 위해서는 적절한 값을 찾아가는 과정이 필요할 수도 있습니다.

추가적으로, 스크롤 동작이 사람처럼 보이지 않는 문제에 대해서는 다른 요소들, 예를 들어 스크롤 시간 간격(delay)과 스크롤 위치(sx, sy)의 설정도 영향을 줄 수 있으니 해당 부분도 확인해보시면 좋겠습니다.

더 궁금한 점이 있으시면 언제든지 물어보세요. 좋은 하루 되세요!