문제
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 페이지를 긁을 수있는 가장 좋은 장소입니다. 이 기술은 다음과 같습니다. 나는 언젠가 코드를 개방 할 것입니다. 크롬 확장을 만듭니다.
- xpath를 사용하여 컨텐츠 스크립트를 사용하여 DOM에 액세스하십시오. XPath를 사용하여 전체 목록 또는 테이블 또는 동적으로 렌더링 된 컨텐츠를 변수로 String HTML 노드로 가져옵니다. (콘텐츠 스크립트 만 DOM에 액세스 할 수 있지만 XMLHTTP를 사용하여 URL에 연락 할 수는 없습니다).
- 컨텐츠 스크립트에서 메시지 전달을 사용하여 전체 박탈 DOM을 문자열로 메시지를 배경 스크립트로 메시지로 보내십시오. (배경 스크립트는 URL과 대화 할 수 있지만 DOM을 만질 수는 없습니다). 우리는 메시지를 전달하기 위해 전달되는 메시지를 사용합니다.
- 다양한 이벤트를 사용하여 웹 페이지를 통해 반복하고 각 박리 된 HTML 노드 컨텐츠를 백그라운드 스크립트로 전달할 수 있습니다.
- 이제 백그라운드 스크립트를 사용하여 Nodejs/Python을 사용하여 만든 간단한 서버 인 외부 서버 (LocalHost)와 대화하십시오. 전체 HTML 노드를 문자열로 보내기 만하면 서버가 서버가 게시 된 컨텐츠를 파일로 유지하고 페이지 번호 또는 URL을 식별하기 위해 적절한 변수로 파일에 유지합니다.
- 이제 ajax 컨텐츠를 긁어 냈지만 (HTML 노드를 문자열로)했지만 부분 HTML 노드입니다. 이제 좋아하는 XPath 라이브러리를 사용하여이를 메모리에로드하고 XPath를 사용하여 정보를 테이블이나 텍스트로 긁습니다.
이해할 수 없다면 댓글을 달고 더 잘 쓸 수 있습니다. ( 첫번째 시도 ). 또한 가능한 빨리 샘플 코드를 출시하려고합니다.