문제

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>

그런 다음 대신 동일한 서버의 시간에 HTTP 요청을 수행하기 만하면됩니다. W3Schools의 예.


C ++로 고급 스크래핑 :

복잡한 사용을 위해 C ++를 사용하는 경우 Firefox JavaScript 엔진 사용을 고려할 수도 있습니다. 거미 원숭이 페이지에서 JavaScript를 실행합니다.

Java와의 고급 스크래핑 :

복잡한 사용을 위해서는 Java를 사용하는 경우 Java 용 Firefox JavaScript 엔진 사용을 고려할 수도 있습니다. 코뿔소

.NET을 사용한 고급 스크래핑 :

복잡한 사용을 위해서는 .NET을 사용하는 경우 Microsoft.VSA 어셈블리를 사용하는 것을 고려할 수도 있습니다. 최근 ICODECOMPILER/CODEDOM으로 교체했습니다.

다른 팁

제 생각에는 가장 간단한 솔루션은 사용하는 것입니다 Casperjs, WebKit 헤드리스 브라우저 Phantomjs를 기반으로 한 프레임 워크.

전체 페이지가로드되었으며 AJAX 관련 데이터를 긁어 내기가 매우 쉽습니다. 이 기본 튜토리얼을 확인하여 학습 할 수 있습니다 Phantomjs 및 Casperjs로 자동화 및 스크래핑

Google을 긁어내는 방법에 대한이 예제 코드를 살펴볼 수도 있습니다. 키워드를 제안합니다.

/*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 tree를 검사해보십시오. 셀렌 이것은 페이지 테스트의 일부로 수행합니다. 또한 버튼을 클릭하고 링크를 팔로우하는 기능도 있습니다.

Ajax를 사용하거나 JavaScript를 사용하여 웹 페이지를 긁어내는 가장 좋은 방법은 브라우저 자체 또는 헤드리스 브라우저 (GUI없는 브라우저)입니다. 현재 Phantomjs WebKit을 사용하여 잘 홍보 된 헤드리스 브라우저입니다. 내가 성공으로 사용한 대안은입니다 htmlunit (Java 또는 .net을 통해 IKVM, 이는 시뮬레이션 브라우저입니다. 또 다른 알려진 대안은 다음과 같은 웹 자동화 도구를 사용하는 것입니다. 셀렌.

나는이 주제에 관한 많은 기사를 썼다 웹 스크래핑 Ajax 및 JavaScript 사이트 그리고 트위터 용 자동 브라우저리스 OAUTH 인증. 첫 번째 기사가 끝날 무렵 2011 년 이후로 컴파일 한 추가 리소스가 많이 있습니다.

Ajax 페이지에 따라 다릅니다. 화면 스크래핑의 첫 번째 부분은 페이지 작동 방식을 결정하는 것입니다. 페이지에서 모든 데이터를 요청하기 위해 반복 할 수있는 변수가 있습니까? 개인적으로 내가 사용했습니다 웹 스크레이퍼 플러스 많은 화면 스크래핑 관련 작업이 저렴하고 시작하기가 어렵지 않기 때문에 비 프로그래머는 비교적 빠르게 작동 할 수 있습니다.

참고 : 이용 약관은 아마도이 작업을 수행하기 전에 확인하고 싶은 곳일 것입니다. 모든 것을 통해 반복되는 사이트에 따라 일부 깃발이 발생할 수 있습니다.

좋아요 PHEARJS, 그러나 그것은 내가 그것을 만들었 기 때문에 부분적으로 일 수 있습니다.

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

저렴한 솔루션으로 시도 할 수도 있습니다 Swexplorerautomation (Swea). 이 프로그램은 HTML, DHTML 또는 AJAX로 개발 된 모든 웹 응용 프로그램에 대한 자동화 API를 만듭니다.

Brian R. Bondy의 답변은 소스 코드를 쉽게 읽을 수있을 때 유용하다고 생각합니다. Wireshark 또는 Httpanalyzer와 같은 도구를 사용하여 패킷을 캡처하고 "호스트"필드 및 "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

Selenium Webdriver는 좋은 솔루션입니다. 브라우저를 프로그래밍하고 브라우저에서 수행해야 할 작업을 자동화합니다. 브라우저 (Chrome, Firefox 등)는 셀레늄과 함께 작동하는 자체 드라이버를 제공합니다. 자동화 된 것으로 작동하기 때문입니다 실제 브라우저, 페이지 (JavaScript 및 Ajax 포함)는 해당 브라우저를 사용하는 사람과 마찬가지로로드됩니다.

단점은 느린다는 것입니다.

나는 이전에 Ajax 페이지를 긁어내는 나의 답으로 MIT의 용매 및 ENVJ에 연결했습니다. 이 프로젝트는 더 이상 접근 할 수없는 것 같습니다.

필연적으로, 나는 실제로 Ajax 페이지를 긁어내는 또 다른 방법을 발명했으며, 헤드리스 자바 스크립트 엔진을 찾고 데이터를 표시 할 수있는 방법이있는 FindeTecompany와 같은 거친 사이트에서 일했습니다.

이 기술은 크롬 확장을 사용하여 스크래핑을 수행하는 것입니다. Chrome Extensions는 실제로 JavaScript Modified DOM에 액세스 할 수 있기 때문에 Ajax 페이지를 긁을 수있는 가장 좋은 장소입니다. 이 기술은 다음과 같습니다. 나는 언젠가 코드를 개방 할 것입니다. 크롬 확장을 만듭니다.

  1. xpath를 사용하여 컨텐츠 스크립트를 사용하여 DOM에 액세스하십시오. XPath를 사용하여 전체 목록 또는 테이블 또는 동적으로 렌더링 된 컨텐츠를 변수로 String HTML 노드로 가져옵니다. (콘텐츠 스크립트 만 DOM에 액세스 할 수 있지만 XMLHTTP를 사용하여 URL에 연락 할 수는 없습니다).
  2. 컨텐츠 스크립트에서 메시지 전달을 사용하여 전체 박탈 DOM을 문자열로 메시지를 배경 스크립트로 메시지로 보내십시오. (배경 스크립트는 URL과 대화 할 수 있지만 DOM을 만질 수는 없습니다). 우리는 메시지를 전달하기 위해 전달되는 메시지를 사용합니다.
  3. 다양한 이벤트를 사용하여 웹 페이지를 통해 반복하고 각 박리 된 HTML 노드 컨텐츠를 백그라운드 스크립트로 전달할 수 있습니다.
  4. 이제 백그라운드 스크립트를 사용하여 Nodejs/Python을 사용하여 만든 간단한 서버 인 외부 서버 (LocalHost)와 대화하십시오. 전체 HTML 노드를 문자열로 보내기 만하면 서버가 서버가 게시 된 컨텐츠를 파일로 유지하고 페이지 번호 또는 URL을 식별하기 위해 적절한 변수로 파일에 유지합니다.
  5. 이제 ajax 컨텐츠를 긁어 냈지만 (HTML 노드를 문자열로)했지만 부분 HTML 노드입니다. 이제 좋아하는 XPath 라이브러리를 사용하여이를 메모리에로드하고 XPath를 사용하여 정보를 테이블이나 텍스트로 긁습니다.

이해할 수 없다면 댓글을 달고 더 잘 쓸 수 있습니다. ( 첫번째 시도 ). 또한 가능한 빨리 샘플 코드를 출시하려고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top