sourcetip

AJAX 페이지는 어떻게 스크래핑합니까?

fileupload 2023. 2. 17. 21:33
반응형

AJAX 페이지는 어떻게 스크래핑합니까?

AJAX 페이지 스크래핑 방법을 알려주세요.

개요:

먼저 모든 화면을 스크랩하려면 리소스를 추출할 페이지를 수동으로 검토해야 합니다.AJAX를 취급할 때는 보통 단순한 HTML 이상의 분석을 필요로 합니다.

AJAX를 취급할 때 이것은 단지 당신이 요구한 초기 HTML 문서에 당신이 원하는 값이 없다는 것을 의미하지만, 당신이 원하는 추가 정보를 서버에 요구하는 Javascript가 추출된다는 것을 의미합니다.

따라서 보통 javascript를 분석하여 javascript가 어떤 요청을 하는지 확인하고 처음부터 이 URL을 호출할 수 있습니다.


예:

예를 들어 스크랩할 페이지에 다음 스크립트가 있다고 가정합니다.

<script type="text/javascript">
function ajaxFunction()
{
var xmlHttp;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    try
      {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    catch (e)
      {
      alert("Your browser does not support AJAX!");
      return false;
      }
    }
  }
  xmlHttp.onreadystatechange=function()
    {
    if(xmlHttp.readyState==4)
      {
      document.myForm.time.value=xmlHttp.responseText;
      }
    }
  xmlHttp.open("GET","time.asp",true);
  xmlHttp.send(null);
  }
</script>

그런 다음 대신 같은 서버의 time.asp에 대한 HTTP 요청을 수행하면 됩니다.w3schools의 예.


C++를 사용한 고도의 스크래핑:

복잡한 사용법이나 C++를 사용하는 경우에는 Javascript 엔진 SpiderMonkey를 사용하여 페이지에서 Javascript를 실행하는 것도 고려할 수 있습니다.

Java를 사용한 고급 스크랩:

복잡한 용도와 Java를 사용하는 경우 Java Rhino용 Firefox javascript 엔진을 사용하는 것도 고려할 수 있습니다.

와의 고도의 스크래핑.네트워크:

를 사용하고 있는 경우는, 을 참조해 주세요.Net Microsoft.vsa 어셈블리를 사용할 수도 있습니다.최근 ICode Compiler/Code DOM으로 대체.

내 생각에 가장 간단한 해결책은 WebKit 헤드리스 브라우저 pantomjs에 기반한 프레임워크인 Casperjs를 사용하는 것이다.

페이지 전체가 로드되어 Ajax 관련 데이터를 쉽게 스크랩할 수 있습니다.이 기본 튜토리얼에서는 팬텀을 사용한 자동화와 스크래핑에 대해 배울 수 있습니다.JS 및 캐스퍼JS

또한 구글 제안 키워드를 스크래핑하는 방법에 대해서도 이 코드 예를 참조할 수 있습니다.

/*global casper:true*/
var casper = require('casper').create();
var suggestions = [];
var word = casper.cli.get(0);

if (!word) {
    casper.echo('please provide a word').exit(1);
}

casper.start('http://www.google.com/', function() {
    this.sendKeys('input[name=q]', word);
});

casper.waitFor(function() {
  return this.fetchText('.gsq_a table span').indexOf(word) === 0
}, function() {
  suggestions = this.evaluate(function() {
      var nodes = document.querySelectorAll('.gsq_a table span');
      return [].map.call(nodes, function(node){
          return node.textContent;
      });
  });
});

casper.run(function() {
  this.echo(suggestions.join('\n')).exit();
});

가능하면 DOM 트리를 조사해 보십시오.Selenium은 페이지 테스트의 일부로 이 작업을 수행합니다.버튼을 클릭하거나 링크를 팔로우 하는 기능도 있어 편리할 수 있습니다.

Ajax를 사용하거나 Javascript를 사용하여 일반 페이지에서 웹 페이지를 스크랩하는 가장 좋은 방법은 브라우저 자체 또는 헤드리스 브라우저(GUI가 없는 브라우저)를 사용하는 것입니다.현재 phantomjs는 WebKit을 사용하여 잘 홍보된 헤드리스 브라우저입니다.제가 성공한 대안으로 HtmlUnit(Java 또는 )을 사용하였습니다.IKVM 경유 NET (시뮬레이션브라우저)또 다른 알려진 대안은 셀레니엄과 같은 웹 자동화 도구를 사용하는 것이다.

Ajax나 Javascript 사이트 웹 스크랩, Twitter용 브라우저리스 OAuth 자동 인증 등 이 주제에 대한 기사를 많이 썼습니다.첫 번째 기사의 말미에 2011년부터 편집하고 있는 많은 추가 자료가 있습니다.

PhearJs를 좋아하긴 하지만, 그건 내가 만든 것 때문일 수도 있어.

즉, 백그라운드에서 실행하는 서비스로 HTTP(S)를 말하고 페이지를 JSON으로 렌더링합니다.필요한 메타데이터도 포함됩니다.

Ajax 페이지에 따라 다릅니다.스크린 스크랩의 첫 번째 부분은 페이지가 어떻게 동작하는지를 결정하는 것입니다.페이지에서 모든 데이터를 요청하기 위해 반복할 수 있는 변수가 있습니까?개인적으로 저는 Web Scraper Plus를 많은 스크린 스크래핑 관련 태스크에 사용해 왔습니다.그것은 저렴하고 시작하기 어렵지 않기 때문에, 프로그래머가 아닌 사람도 비교적 빨리 실행할 수 있기 때문입니다.

사이드 노트:이용약관은 확인하시기 바랍니다.사이트에 따라서는 모든 것을 반복하면 플래그가 표시될 수 있습니다.

Brian R인 것 같아요.Bondy의 대답은 소스코드가 읽기 쉬울 때 유용하다.Wireshark 또는 HttpAnalyzer와 같은 도구를 사용하여 패킷을 캡처하고 "Host" 필드와 "GET" 필드에서 URL을 가져오는 쉬운 방법을 선호합니다.

예를 들어 다음과 같은 패킷을 캡처합니다.

GET /hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330 
 HTTP/1.1
Accept: */*
Referer: http://quote.hexun.com/stock/default.aspx
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: quote.tool.hexun.com
Connection: Keep-Alive

다음으로 URL은 다음과 같습니다.

http://quote.tool.hexun.com/hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330

저비용 솔루션으로서 SWExplorer를 시험해 볼 수도 있습니다.자동화(SWEA).이 프로그램은 HTML, DHTML 또는 AJAX로 개발된 웹 응용 프로그램을 위한 자동화 API를 생성합니다.

Selenium Web Driver는 좋은 솔루션입니다.브라우저를 프로그래밍하여 필요한 작업을 자동화할 수 있습니다.브라우저(Chrome, Firefox 등)는 Selenium에서 작동하는 자체 드라이버를 제공합니다.자동 REAL 브라우저로 동작하기 때문에 페이지(javascript, Ajax 포함)는 그 브라우저를 사용하는 사람과 마찬가지로 로딩됩니다.

단점은 속도가 느리다는 것입니다(모든 이미지와 스크립트가 로드될 때까지 기다린 후 1페이지에서 스크래핑을 하는 것이 가장 좋기 때문입니다.

저는 이전에 Ajax 페이지를 스크랩하기 위한 답변으로 MIT의 solvent와 EnvJs에 링크한 적이 있습니다.이 프로젝트들은 더 이상 접근할 수 없을 것 같다.

필연적으로 Ajax 페이지를 실제로 긁어낼 수 있는 또 다른 방법을 고안했고, 헤드리스 Javascript 엔진을 찾아 데이터를 표시하지 않는 방법을 가진 회사를 찾는 것과 같은 어려운 사이트에서도 효과가 있었습니다.

크롬 익스텐션을 사용하여 스크래핑을 하는 기술입니다.크롬 확장 기능은 실제로 자바스크립트 수정 DOM에 액세스할 수 있도록 하기 때문에 Ajax 페이지를 긁어내기에 최적의 장소입니다.기술은 다음과 같으며, 조만간 반드시 오픈 소스 코드를 만들겠습니다.크롬 확장을 만듭니다(작성 방법과 아키텍처 및 기능을 알고 있다고 가정).샘플이 많기 때문에 쉽게 배우고 실천할 수 있습니다.)

  1. 컨텐츠 스크립트를 사용하여 xpath를 사용하여 DOM에 액세스합니다.거의 모든 목록 또는 테이블 또는 xpath를 사용하여 동적으로 렌더링된 콘텐츠를 문자열 HTML 노드로 변수에 가져옵니다.(콘텐츠 스크립트만 DOM에 액세스할 수 있지만 XMLHTTP를 사용하여 URL에 연결할 수 없습니다.)
  2. 콘텐츠 스크립트에서 메시지 전달을 사용하여 제거된 전체 DOM을 문자열로 메시지합니다(백그라운드 스크립트는 URL과 통신할 수 있지만 DOM은 터치할 수 없습니다). 메시지 전달을 사용하여 대화합니다.
  3. 다양한 이벤트를 사용하여 웹 페이지를 루프하고 제거된 각 HTML 노드 컨텐츠를 백그라운드 스크립트에 전달할 수 있습니다.
  4. 이제 백그라운드스크립트를 사용하여 Nodejs/python을 사용하여 작성된 단순한 외부 서버(로컬호스트)와 통신합니다.HTML 노드 전체를 문자열로 서버로 전송하면 서버는 페이지 번호 또는 URL을 식별하기 위한 적절한 변수를 사용하여 게시된 내용을 파일에 보존합니다.
  5. 이것으로 AJAX 콘텐츠(문자열로서의 HTML 노드)를 스크랩했습니다만, 이것들은 부분적인 HTML 노드입니다.이제 즐겨찾는 XPATH 라이브러리를 사용하여 이러한 라이브러리를 메모리에 로드하고 XPATH를 사용하여 정보를 표 또는 텍스트에 스크램핑할 수 있습니다.

이해가 안 되고 제가 더 잘 쓸 수 있다면 댓글로 남겨주세요.( 첫 번째 시도).또한 최대한 빨리 샘플 코드를 공개하려고 합니다.

언급URL : https://stackoverflow.com/questions/260540/how-do-you-scrape-ajax-pages

반응형