2013-07-18 2 views
0

정확한 예를 보여 드리 겠지만 URL을 통해 다른 페이지로 연결되는 한 페이지를 크롤링해야하는 일반적인 상황에서는 문제가 될 수 있습니다.동일한 URL을 가진 두 페이지. 크롤링하는 방법?

크롤링하려는 페이지는이 URL http://www.oxygenboutique.com/Shoes-All.aspx에 있지만이 링크를 직접 따라 가면 얻을 수있는 페이지가 아닙니다. 내가 원하는 것은 "모두보기"를 클릭하면 보게되는 것입니다.

거미를 내가 원하는대로 시작할 수있게하려면 어떻게해야합니까?

감사

답변

2

링크가 웹 페이지에 자바 스크립트 함수를 호출이며,이 같은이라고 "모두 표시"

__doPostBack('ctl00$ContentPlaceHolder1$PGN01','') 

내 기본 브라우저는 파이어 폭스이며, 우수한있다 추가 기능을 사용할 수 있습니다. "웹 개발자"부가 기능을 사용했습니다.

페이지가있는 탭에서 다음을 수행하십시오. 마우스 커서를 모두 표시 링크 위로 가져갑니다. 그런 다음 마우스 오른쪽 버튼을 클릭하고 "웹 개발자"> "정보"> "자바 스크립트보기 Alt + Shift + J"를 선택하십시오. 그러면 Firefox는 페이지가 사용하는 모든 자바 스크립트가있는 새 탭을 엽니 다. - 탭에서

는 빠른 검색은 다음과 같이 코딩되어있는 __doPostBack 함수를 찾습니다 경우 JavaScipt 기능이 아래의 자바 스크립트 코드로 감소 할 수

function __doPostBack(eventTarget, eventArgument) { 
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
     theForm.__EVENTTARGET.value = eventTarget; 
     theForm.__EVENTARGUMENT.value = eventArgument; 
     theForm.submit(); 
    } 
} 

은 if-statemment들을 평가에서 테스트 함수를 호출하는 인수를 사용합니다.

theForm.__EVENTTARGET.value = 'ctl00$ContentPlaceHolder1$PGN01'; 
theForm.__EVENTARGUMENT.value = ''; 
theForm.submit(); 

이제 우리는 'theForm'이 무엇인지 알아야합니다.

아래 바로 __doPostBack 기능 이상 발견 된 코드 : 우리가 지금 'theForm은'id 속성을 가진 '형태'HTML 태그에 대한 참조 점이다 알고에서

var theForm = document.forms['aspnetForm']; 
if (!theForm) { 
    theForm = document.aspnetForm; 
} 

'aspnetForm'(ID = 'aspnetForm') HTML 문서에서 우리는 다음과 같이 시작 무언가를 찾아 놈이야 것을 의미 :

<form id="aspnetForm" 

그 태그는 I가 파이어 폭스 브라우저를 사용 작성하는 방법을 정확히 알고 관심있는 페이지의 수정 된 HTML을보십시오. 여기 FireBug 애드온을 사용하고 있습니다.

HTML 양식의 시작 태그는 다음과 같습니다

<form id="aspnetForm" onsubmit="javascript:return WebForm_OnSubmit();" 
action="/Shoes-All.aspx" method="post" name="aspnetForm"> 

그래서 액션이 같은 HTML 문서를 사용합니다!

function WebForm_OnSubmit() { 
    if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) 
     return false; 
    return true; 

}

은 우리가 ValidatorOnSubmit() 함수를 살펴 그것을 사용하고 흥미로운 변수를 보자 :

은 우리가 WebForm_OnSubmit() 함수가 무엇을하고 있는지 보자

var Page_ValidationActive = false; 

// ... 

function ValidatorOnSubmit() { 
    if (Page_ValidationActive) { 
     return ValidatorCommonOnSubmit(); 
    } 
    else { 
     return true; 
    } 
} 

즉,이 함수는 항상 'true'를 반환하므로 양식 시작 태그를

01로 다시 쓸 수 있습니다.
<form id="aspnetForm" onsubmit="javascript:return true;" 
action="/Shoes-All.aspx" method="post" name="aspnetForm"> 

웹 페이지가 웹 서버에서 다시로드되어야한다고 결론 지을 수 있습니다.

이제 우리는 HTTP POST 요청에 사용되는 변수와 값을 알아야합니다.

자바 스크립트를 사용하여 Firefox를 다시 사용했습니다. 또한 멋진 Firebug 애드온을 사용하고 있습니다. 첫 번째 div 태그의 양식 요소에서 우리는이 발견 : 당신이 우리의 이전 감소 자바 스크립트 코드를 기억한다면, 그것은 형태로이 입력 태그의 value 속성 때문에, HTML을 수정

<div> 
    <input id="__EVENTTARGET" type="hidden" 
     value="" name="__EVENTTARGET"> 
    <input id="__EVENTARGUMENT" type="hidden" value="" name="__EVENTARGUMENT"> 
    <input id="__LASTFOCUS" type="hidden" value="" name="__LASTFOCUS"> 
    <input id="__VIEWSTATE" type="hidden" 
     value="(lots of data here)" name="__VIEWSTATE"> 
</div> 

그 함수에 의해 modfied되어 있었다, 그래서 정말 :

<div> 
    <input id="__EVENTTARGET" type="hidden" 
     value="ctl00$ContentPlaceHolder1$PGN01" name="__EVENTTARGET"> 
    <input id="__EVENTARGUMENT" type="hidden" value="" name="__EVENTARGUMENT"> 
    <input id="__LASTFOCUS" type="hidden" value="" name="__LASTFOCUS"> 
    <input id="__VIEWSTATE" type="hidden" 
     value="(lots of binary data here)" name="__VIEWSTATE"> 
</div> 

당신은 물론 ID가 "_VIEWSTATE"로 입력 태그의 값 속성의 콘텐츠를 그대로 복사 할 필요가있을 것이다. ,

form#aspnetForm div input#__VIEWSTATE 

웹 서버에서 모든 항목을 다운로드 한 후 다음의 CSS 선택기가

//*[@id="__VIEWSTATE"] 

... 것을 :

참고로, 파이어 폭스는 _VIEWSTATE 입력 - 태그의 XPath는 말 그런 다음 HTML 페이지를 파싱합니다.

흥미로운 콘텐츠는 내부 깊숙이 형태로 포함되어 있습니다. HTML 표입니다. =

//*[@id="ctl00_ContentPlaceHolder1_dlList"] 

... 그리고 CSS 선택기

table#ctl00_ContentPlaceHolder1_dlList 

는 그것은 TBODY, TR, TD, DIV, 다른 테이블 (이 포함되어 있습니다 :

테이블에 대한 관련 XPath는이다 더 나쁜 디자인 - 누군가가 테이블이없는 디자인에 대해 배울 필요가 있습니다. 스마트 폰과 태블릿에서 HTML 표가 끔찍하게 보일 것입니다.)이 시점에서 Beautiful Soup 4 파서를 작업에 적용해야한다고 생각합니다.

+0

당신이 썼던 것을 "공부하다"가 끝나자, 버튼이 모두 "aspnetForm"형식의 hte input __EVENTTARGET의 속성 "value"를 수정했다는 것을 알았습니다. 그리고 나서 html이 바뀌 었습니다. 하지만 왜 나는 "__VIEWSTATE"입력의 속성 값의 내용을 복사해야하는지 이해하지 못합니다. 왜 서버에서 일부 항목을 다운로드해야합니까? 기본적으로 링크가 아니기 때문에 스파이더가이 수정 된 HTML을 구문 분석하게 만드는 방법을 모르겠습니다. (나는이 모든 것에 매우 익숙하며 새로운 URL 대신 수정 된 HTML을 크롤링하는 방법이 있는지 전혀 모른다.) – 700z

+0

고마워요! – 700z

관련 문제