페이지를 "찾아보기"하고 Java로 양식을 제출하는 가장 쉬운 방법



html web-scraping (4)

로그인 페이지에서 양식의 HTML을보고 URL과 URL 매개 변수를 표시하십시오. 그런 다음 올바른 매개 변수로 채워진 동일한 매개 변수로 url을 요청하고 모든 쿠키 헤더를 저장하여 두 번째 페이지로 보내십시오. 그런 다음 html 파서를 사용하여 링크를 찾으십시오. 몇 가지 HTML 파서가 소스 포지 (sourceforge)에서 사용 가능하며, 사이트에 작은 html 오류가 있어도 결함이있을지라도 xml 파서로 작성된 자바를 사용해 볼 수도 있습니다.

EDIT는 그것이 정상 링크가 아니라는 사실을 알아 채지 못했습니다. 이 경우 링크가 연결되는 위치를 확인하려면 사이트의 자바 스크립트를 봐야합니다. 링크를 실행하려면 자바 스크립트가 필요한 경우 더 복잡해집니다. 자바는 브라우저 자바 스크립트를 실행할 수 없지만 jframes에 추가 할 수있는 웹 브라우저 클래스를 포함하는 DJ 네이티브 스윙이라는 라이브러리를 발견했습니다. 네이티브 브라우저를 사용하여 자바 스크립트를 렌더링하고 실행합니다.

내가해야 할 일은 웹 페이지를 탐색하고 로그인 한 다음 로그인해야하는 사이트의 다른 웹 페이지를 탐색하여 쿠키를 저장해야합니다. 그 후, 해당 페이지의 요소를 클릭해야합니다.이 양식에서 양식을 작성하고 웹 페이지가 나에게 반환한다는 메시지를 받게됩니다. 내가 페이지에 가서 버튼을 클릭해야만하는 이유는 로그인 할 때마다 세션 ID가 할당되고 링크가 항상 달라지기 때문입니다. 버튼은 다음과 같이 보입니다. 정상적인 href 링크가 아닙니다.

<span id=":tv" idlink="" class="sA" tabindex="0" role="link">Next</span>

어쨌든이 일을하는 가장 쉬운 방법은 무엇일까요? 감사.

업데이트 : HTMLunit과 다른 헤드리스 브라우저 라이브러리를 사용한 후에는 "헤드리스"를 사용하여 그 일이 발생하지 않는 것 같습니다. 내가 최근에이 페이지에 대해 알아 낸 또 다른 점은 모든 HTML이 이상한 형식이라는 것입니다 ... 모든 것이 스크립트 태그 안에 있습니다. 다음은 샘플입니다.

"?ui\x3d2\x26view\x3dss\x26mset\x3dmain\x26ver\x3d-68igm85d1771\x26am\x3d!Zsl-0RZ-XLv0BO3aNKsL0sgMg3nH10t5WrPgJSU8CYS-KNWlyrLmiW3HvC5ykER_n_5dDw\x26fri"],"http://example.com/?ctx\x3d%67mail\x26hl\x3den",,0,"Gmail","Gmail",[["us","c130f0854ca2c2bb",[["n"],["m","New features!"],["u"],["k","0"],["p","1000:500000,10,200000,5,100000,3,75000,2,0,1"],["h","https://survey.googleratings.com/wix/p1679258.aspx?l\x3d1033"],["at","query,5,contacts,5,adv,5,cf,5,default,20"],["v","https://www.youtube.com/embed/Ra8HG6MkOXY?showinfo\x3d0"],

버튼의 요소를 검사 할 때, 버튼 위에 위에 게시 한 HTML 코드가 표시되지만보기 소스를 수행 할 때는 표시되지 않습니다. 기본적으로, 내가해야 할 일은 일종의 GUI를 사용하고 사용자가 링크로 이동 한 다음 프로그램에 정보를 입력하게하십시오. 아무도 내가 이것을 어떻게 할 수 있는지 안다? 감사.



HTMLUnit은 JavaScript를 처리하는 데 매우 좋지 않습니다. Rhino JS 라이브러리는 종종 오류를 생성합니다 (실제로 예외는 거의 없습니다). 기본적으로 헤드리스 브라우저 (크롬, 파이어 폭스 기반)를 제어하기위한 프레임 워크 인 Selenium 을 사용할 것을 권장합니다.

귀하의 질문에, 다음 코드는 작업을 수행 할 것입니다

selenium.open(myurl);
selenium.click("id=:tv");

그런 다음 페이지가로드 될 때까지 기다려야합니다.

selenium.waitForPageToLoad(someTime);

나는 어떤 날 htmlunit을 권하고 싶습니다. 훌륭한 도서관입니다.

먼저 htmlunit을 실행하려면 해당 웹 페이지 ( http://htmlunit.sourceforge.net/ )를 확인 하십시오 . 최신 스냅 샷 (2.12)을 사용하십시오.

거의 모든 장애물을 무시하려면 다음 설정을 시도하십시오.

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);
webClient.getOptions().setRedirectEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getCookieManager().setCookiesEnabled(true);

그런 다음 페이지를 가져올 때 페이지에서 로그인 양식 게시와 같은 작업을 수행하기 전에 백그라운드 자바 스크립트를 기다리는 지 확인하십시오.

//Get Page
HtmlPage page1 = webClient.getPage("https://login-url/");

//Wait for background Javascript
webClient.waitForBackgroundJavaScript(10000);

//Get first form on page
HtmlForm form = page1.getForms().get(0);

//Get login input fields using input field name
HtmlTextInput userName = form.getInputByName("UserName");
HtmlPasswordInput password = form.getInputByName("Password");

//Set input values
userName.setValueAttribute("MyUserName"); 
password.setValueAttribute("MyPassword"); 

//Find the first button in form using name, id or xpath
HtmlElement button = (HtmlElement) form.getFirstByXPath("//button");

//Post by clicking the button and cast the result, login arrival url, to a new page and repeat what you did with page1 or something else :) 
HtmlPage page2 = (HtmlPage) button.click(); 

//Profit
System.out.println(page2.asXml());    

이 기본 예제가 도움이되기를 바랍니다.





headless-browser