자바 파충류 데이터 비동기 로드 어떻게 해결
현재 많은 것 이 앞 뒤 분리 항목 입 니 다.이 는 데이터 비동기 로드 문 제 를 더욱 두 드 러 지게 할 수 있 습 니 다.따라서 파충류 에 게 이런 문 제 를 만 났 을 때 놀 랄 필요 가 없습니다.당황 할 필요 가 없습니다.이런 문제 의 해결 방법 은 전체적으로 다음 과 같은 두 가지 가 있다.
1.브 라 우 저 커 널 내장
내 장 된 브 라 우 저 는 캡 처 된 프로그램 에서 브 라 우 저 커 널 을 시작 하여 js 렌 더 링 된 페이지 를 가 져 오 는 것 입 니 다.그러면 우 리 는 정적 페이지 를 수집 하 는 것 과 같 습 니 다.이런 도구 가 자주 사용 하 는 것 은 다음 과 같은 세 가지 가 있다.
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/
입 니 다.다음 과 같은 결 과 를 얻 었 습 니 다.두 가지 방법 모두 네트워크 에서 비동기 로 불 러 오 는 뉴스 목록 을 성공 적 으로 얻 었 습 니 다.이 두 가지 방법 에 대한 선택 에 있어 저 는 개인 적 으로 역방향 해석 법 을 사용 하 는 경향 이 있 습 니 다.왜냐하면 그의 성능 과 안정 은 내 장 된 브 라 우 저 커 널 보다 믿 을 수 있 지만 자바 스 크 립 트 세 션 을 사용 하여 렌 더 링 하 는 페이지 에 대해 내 장 된 브 라 우 저 는 더욱 믿 을 수 있 기 때 문 입 니 다.그 러 니까 구체 적 인 상황 에 따라 선택 하 세 요.
소스 코드:소스 코드
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.