자바 파충류 데이터 비동기 로드 어떻게 해결

자바 파충류 시리즈 박문 의 세 번 째 편 입 니 다.전편자바 파충 류 는 로그 인 이 필요 한 사 이 트 를 어떻게 기어 갑 니까?에 서 는 어떻게 해 야 합 니까?이 글 에서 우 리 는 파충류 가 로그 인 문 제 를 만 났 을 때 해결 방법 을 간단하게 설명 했다.이 글 에서 우 리 는 파충류 가 데이터 비동기 로 로드 되 는 문 제 를 함께 이야기 했다.이것 도 파충류 에서 흔히 볼 수 있 는 문제 이다.
현재 많은 것 이 앞 뒤 분리 항목 입 니 다.이 는 데이터 비동기 로드 문 제 를 더욱 두 드 러 지게 할 수 있 습 니 다.따라서 파충류 에 게 이런 문 제 를 만 났 을 때 놀 랄 필요 가 없습니다.당황 할 필요 가 없습니다.이런 문제 의 해결 방법 은 전체적으로 다음 과 같은 두 가지 가 있다.
1.브 라 우 저 커 널 내장
내 장 된 브 라 우 저 는 캡 처 된 프로그램 에서 브 라 우 저 커 널 을 시작 하여 js 렌 더 링 된 페이지 를 가 져 오 는 것 입 니 다.그러면 우 리 는 정적 페이지 를 수집 하 는 것 과 같 습 니 다.이런 도구 가 자주 사용 하 는 것 은 다음 과 같은 세 가지 가 있다.
  • Selenium
  • HtmlUnit
  • PhantomJs
  • 이 도구 들 은 모두 우리 가 데이터 비동기 로드 문 제 를 해결 하 는 데 도움 을 줄 수 있 지만,그들 은 모두 결함 이 존재 한다.그것 은 효율 이 높 지 않 고 불안정 하 다 는 것 이다.
    2.역방향 해석 법
    역방향 해석 법 은 무엇 입 니까?우리 js 렌 더 링 페이지 의 데 이 터 는 Ajax 방식 으로 백 엔 드 에서 얻 은 것 입 니 다.우 리 는 해당 하 는 Ajax 요청 연결 만 찾 으 면 됩 니 다.그러면 우 리 는 우리 가 필요 로 하 는 데 이 터 를 얻 을 수 있 습 니 다.역방향 분석 법의 장점 은 바로 이런 방식 으로 얻 은 데 이 터 는 모두 json 형식의 데이터 이 고 분석 하기에 도 편리 합 니 다.또 다른 장점 은 페이지 에 비해인터페이스의 변화 확률 이 더 적다.마찬가지 로 두 가지 부족 한 점 이 있 습 니 다.하 나 는 Ajax 일 때 인내심 과 기술 이 필요 합 니 다.큰 푸 시 요청 에서 원 하 는 것 을 찾 아야 하기 때 문 입 니 다.다른 부족 한 점 은 JavaScript 가 보 여 주 는 페이지 에 속수무책 입 니 다.
    위 는 바로 비동기 데이터 로 불 러 오 는 두 가지 해결 방법 입 니 다.여러분 의 이해 와 프로젝트 에서 어떻게 사용 하 는 지 깊이 있 게 하기 위해 저 는 인터넷 의 중요 한 소식 을 수집 하 는 것 을 예 로 들 어 인터넷 뉴스 주소 입 니 다.https://news.163.com/ 。항소 의 두 가지 방식 을 이용 하여 인터넷 에서 쉽게 들 을 수 있 는 뉴스 목록 을 얻다.왕 이 요 구 는 다음 과 같다.

    내장 브 라 우 저 Selenium 방식
    Selenium 은 아 날로 그 브 라 우 저 로 자동화 테스트 를 하 는 도구 로 API 를 제공 하여 실제 브 라 우 저 커 널 과 상호작용 을 할 수 있 습 니 다.자동화 테스트 에 사용 되 는 것 이 비교적 많 습 니 다.파충 류 는 비동기 로드 를 해결 할 때 도 자주 사용 합 니 다.우 리 는 프로젝트 에서 Selenium 을 사용 하려 면 두 가지 일 을 해 야 합 니 다.
    1.Selenium 의존 패 키 지 를 도입 하여 pom.xml 에 추가 합 니 다.
    
    <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
    <dependency>
     <groupId>org.seleniumhq.selenium</groupId>
     <artifactId>selenium-java</artifactId>
     <version>3.141.59</version>
    </dependency>
    2.해당 하 는 driver 를 다운로드 합 니 다.예 를 들 어 제 가 다운로드 한 chromedriver 는 다운로드 주 소 는:https://npm.taobao.org/mirrors/chromedriver/입 니 다.다운로드 한 후에 driver 의 위 치 를 자바 의 환경 변수 에 기록 해 야 합 니 다.예 를 들 어 제 가 프로젝트 에 직접 놓 아야 하기 때문에 제 코드 는:
    
    System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
    위의 두 단 계 를 완성 한 후에 우 리 는 Selenium 채집 망 을 사용 하여 쉽게 들 을 수 있 습 니 다.구체 적 인 코드 는 다음 과 같다.
    
    /**
     * selenium           
     * https://npm.taobao.org/mirrors/chromedriver/
     *
     * @param url
     */
    public void selenium(String url) {
     //    chromedirver      
     System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
     //        ,            
     ChromeOptions chromeOptions = new ChromeOptions();
     chromeOptions.addArguments("--headless");
    
     WebDriver webDriver = new ChromeDriver(chromeOptions);
     webDriver.get(url);
     //          
     List<WebElement> webElements = webDriver.findElements(By.xpath("//div[@class='news_title']/h3/a"));
     for (WebElement webElement : webElements) {
     //       
     String article_url = webElement.getAttribute("href");
     //       
     String title = webElement.getText();
     if (article_url.contains("https://news.163.com/")) {
      System.out.println("    :" + title + " ,    :" + article_url);
     }
     }
     webDriver.close();
    }
    이 방법 을 실행 하면 다음 과 같은 결 과 를 얻 을 수 있 습 니 다.

    우 리 는 셀 레 니 움 을 사용 하여 왕 이 중요 한 목록 뉴스 를 정확하게 추출 했다.
    역방향 해석 법
    역방향 해석 법 은 Ajax 비동기 로 데 이 터 를 가 져 오 는 링크 로 뉴스 데 이 터 를 직접 가 져 오 는 것 입 니 다.기술 이 없 으 면 Ajax 를 찾 는 과정 이 매우 고 통 스 러 울 것 입 니 다.한 페이지 에 불 러 온 링크 가 너무 많 기 때문에 네트워크 에서 쉽게 들 을 수 있 는 network 를 보 세 요.

    몇 백 가지 요청 이 있 습 니 다.어떤 요청 으로 얻 은 중요 한 데 이 터 를 어떻게 찾 아야 합 니까?귀 찮 지 않 으 시다 면 한 명 씩 가 셔 도 됩 니 다.분명 찾 을 수 있 을 겁 니 다.다른 빠 른 방법 은 network 의 검색 기능 을 이용 하 는 것 입 니 다.만약 에 검색 단 추 를 모 르 신다 면 저 는 위의 그림 에서 이미 동 그 라 미 를 쳤 습 니 다.우 리 는 중요 한 뉴스 제목 을 마음대로 복사 한 다음 에 검색 하면 결 과 를 얻 을 수 있 습 니 다.아래 그림 과 같 습 니 다.

    이렇게 하면 우 리 는 중요 한 데이터 의 요청 링크 를 신속하게 얻 을 수 있 습 니 다.링크 는 다음 과 같 습 니 다.https://temp.163.com/special/00804KVA/cm_yaowen.js?callback=data_callback이 링크 를 방문 하여 이 링크 가 되 돌아 오 는 데 이 터 를 볼 수 있 습 니 다.다음 그림 과 같 습 니 다.

    데 이 터 를 통 해 알 수 있 듯 이 우리 가 필요 로 하 는 데 이 터 는 모두 여기에 있 습 니 다.그래서 우 리 는 이 데 이 터 를 분석 해서 연결 하면 됩 니 다.이 데이터 에서 뉴스 제목 과 뉴스 링크 를 분석 하려 면 두 가지 방식 이 있 습 니 다.하 나 는 정규 표현 식 이 고 다른 하 나 는 이 데 이 터 를 json 이나 list 로 바 꾸 는 것 입 니 다.여기 서 나 는 두 번 째 방식 을 선택 했다.fastjson 을 이용 하여 돌아 온 데 이 터 를 JSONarray 로 변환 했다.그래서 우 리 는 fastjson 을 도입 하고 pom.xml 에 fastjson 의존 도 를 도입 해 야 합 니 다.
    
    <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.2.59</version>
    </dependency>
    fastjson 의존 도 를 도입 하 는 것 외 에 우 리 는 변환 하기 전에 데 이 터 를 간단하게 처리 해 야 합 니 다.현재 데이터 가 list 형식 에 부합 되 지 않 기 때문에 data 를 제거 해 야 합 니 다.콜백.구체 적 인 역방향 분석 으로 쉽게 들 을 수 있 는 코드 는 다음 과 같 습 니 다.
    
    /**
     *                    
     *
     * @param url
     */
    public void httpclientMethod(String url) throws IOException {
    
     CloseableHttpClient httpclient = HttpClients.createDefault();
     HttpGet httpGet = new HttpGet(url);
     CloseableHttpResponse response = httpclient.execute(httpGet);
     if (response.getStatusLine().getStatusCode() == 200) {
     HttpEntity entity = response.getEntity();
     String body = EntityUtils.toString(entity, "GBK");
     //          data_callback(
     body = body.replace("data_callback(", "");
     //          )   
     body = body.substring(0, body.lastIndexOf(")"));
     //   body     JSONArray
     JSONArray jsonArray = JSON.parseArray(body);
     for (int i = 0; i < jsonArray.size(); i++) {
      JSONObject data = jsonArray.getJSONObject(i);
      System.out.println("    :" + data.getString("title") + " ,    :" + data.getString("docurl"));
     }
     } else {
     System.out.println("    !!!     :" + response.getStatusLine().getStatusCode());
     }
    
    }
    main 방법 을 작성 하고 위의 방법 을 실행 합 니 다.주의해 야 할 점 은:이때 들 어 오 는 링크 는https://temp.163.com/special/00804KVA/cm_yaowen.js?callback=data_callback 이 아니 라https://news.163.com/입 니 다.다음 과 같은 결 과 를 얻 었 습 니 다.

    두 가지 방법 모두 네트워크 에서 비동기 로 불 러 오 는 뉴스 목록 을 성공 적 으로 얻 었 습 니 다.이 두 가지 방법 에 대한 선택 에 있어 저 는 개인 적 으로 역방향 해석 법 을 사용 하 는 경향 이 있 습 니 다.왜냐하면 그의 성능 과 안정 은 내 장 된 브 라 우 저 커 널 보다 믿 을 수 있 지만 자바 스 크 립 트 세 션 을 사용 하여 렌 더 링 하 는 페이지 에 대해 내 장 된 브 라 우 저 는 더욱 믿 을 수 있 기 때 문 입 니 다.그 러 니까 구체 적 인 상황 에 따라 선택 하 세 요.
    소스 코드:소스 코드
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기