티스토리 뷰

TIL

[TIL] 2022-11-06

아몬드통 2022. 11. 7. 01:51

1. javascript 에서 배열의 합을 구하고 싶을때는 reduce!!!! 계속 까먹는다 계속 쓰자.

2. pupeteer 에서 SPA페이지들을 크롤링할때 "Execution context was destroyed, most likely because of a navigation." 이런 에러가 발생하는 경우가 있다.
이유는 SPA라서 주소를 알수 없고 클릭해서 웹페이지를 들어가야하는데 이때 새로운 웹페이지로 로딩이 되는 경우 이전 페이지는 context에서 지워진다.
그래서 다시 goback메서드로 뒤로 돌아가거나 for문을 반복할때 위의 에러가 발생한다. 이 때 해결법은 스택오버플로우에 나와있었다. https://stackoverflow.com/questions/55877263/puppeteer-execution-context-was-destroyed-most-likely-because-of-a-navigation 해결법 1, 2, 3 중에서
1번이 가장 좋은 방법이라고 설명하고 있는데, 그 이유는 goback같은 메서드를 안써도 되고 미리 모든 정보를 읽어서 처리가 가능하기 때문이다.
다만 1번으로 해결이 가능하다면 다른 방법으로도 충분히 가능하다. 난 결론적으로 3번 방법을 사용했는데, 이유는 a페이지에서 다른 페이지를 가는 방법이 주소를 통해서가 아니라 버튼을 누르면 해당 페이지로 가는 방식이고 tag내에도 href라던지 주소가 전혀 입력되어있지 않아서 미리 주소를 입력해두고 하나씩 방문하는 방법을 사용할 수 없었다. 그래서 하나의 페이지를 다 크롤링하고 goback으로 돌아와서 3번방법처럼 다시 element를 읽어주는 방법을 사용했다. 특히 설명해준 방법은 1개의 element만 다시 읽으면 되는데 내 코드는 for문이 중첩이라서 제일 최상위의 element를 읽어야 for문이 정상 작동을 했기 때문에 여러개를 모두 읽어주는 코드로 작성했다.
await page.goBack(); //뒤로가기
        result = await page.$$(motel_area); //최상위 element 다시 읽기
        city = await result[index].$eval("a", (el) => el.textContent); //대도시 이름 출력, 이름도 결국 필요해서 다시 읽고
        await result[index].$eval("a", (el) => el.click()); //spa라서 다시 클릭까지 해준 후
        localButtons = await page.$$(local_area); //클릭해서 나온 결과 중에서 또 읽는다. 그리고 localButtons를 사용하게 된다.

 

3. javascript에서 비동기는, 개념은 이해하긴 했지만, 실제 코드에서 사용하고 그 코드가 흘러가는 흐름이 정말 어려웠다.

그래서 뭔가 목록안의 목록을 뽑는 코드를 짰는데 번호도 이상하고 뭔가 많이 이상한거 같다. 수정을 좀 해보자.

'TIL' 카테고리의 다른 글

[TIL] 2022-11-09  (0) 2022.11.09
[TIL] 2022-11-08  (0) 2022.11.08
[TIL] 2022-11-04  (0) 2022.11.04
[TIL] 2022-11-03  (0) 2022.11.03
[TIL] 2022-11-02  (0) 2022.11.02
댓글