0

正確な例を示しますが、URL が別のページに誘導する 1 つのページをクロールする必要がある一般的な状況では問題になる可能性があると思います。

クロールしたいページは、この URL http://www.oxygenboutique.com/Shoes-All.aspxの下にありますが、このリンクを直接たどったときに表示されるページではありません。私が欲しいのは、「SHOW ALL」をクリックすると表示されるものです。

スパイダーを希望するスパイダーで開始するにはどうすればよいですか?

ありがとう

4

1 に答える 1

2

「すべて表示」リンクは、Web ページ上の Javascript 関数への呼び出しであり、次のように呼び出されます。

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

私の主なブラウザーは Firefox で、使用できる優れたアドオンがあります。「Web Developer」アドオンを使用しました。

ページのあるタブで、次の操作を行います。マウス カーソルを [すべて表示] リンクの上に置きます。次に、右クリックして [Web 開発者] > [情報] > [Javascript を表示] Alt+Shift+J を選択すると、Firefox は、そのページが使用しているすべての Javascript を含む新しいタブを開きます。

タブで - クイック検索により、次のようにコード化された __doPostBack 関数が見つかります。

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

その JavaScipt 関数は、if ステートメントのテストが true と評価され、関数への呼び出しからの引数を使用する場合、以下の JavaScript コードに縮小できます。

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

ここで、「theForm」が何であるかを知る必要があります。

以下のコードは、__doPostBack 関数のすぐ上で見つかりました。

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

このことから、「theForm」は id 属性「aspnetForm」(id=「aspnetForm」) を持つ「form」HTML タグへの参照であることがわかります。これは、HTML ドキュメントで探す必要があることを意味します。次のように始まる何か:

<form id="aspnetForm"

タグがどのように記述されているかを正確に知るために、Firefox ブラウザーを使用して、関心のあるページの変更された HTML を確認します。 ここでは、FireBug アドオンを使用しています。

HTML フォームの開始タグは次のようになります。

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

つまり、アクションは同じ HTML ドキュメントを使用しています。

WebForm_OnSubmit() 関数が何をしているか見てみましょう:

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

}

ValidatorOnSubmit() 関数と、それが使用している興味深い変数を見てみましょう。

var Page_ValidationActive = false;

// ...

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

これは、関数が常に「true」を返すことを意味するため、フォームの開始タグを次のように書き換えることができます。

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

このことから、Web ページを Web サーバーからリロードする必要があると結論付けることができます。

ここで、HTTP POST 要求で使用される変数と値を知る必要があります。

そのために、JavaScript をオンにして Firefox を再び使用しました。また、素晴らしい Firebug Add-On を使用しています。 最初の div タグのフォーム要素には、次のようなものがあります。

<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>

以前の縮小された JavaScript コードを覚えている場合は、フォーム内の 2 つの入力タグの値属性が変更されたため、HTML がその関数によって変更されたので、実際には次のようになります。

<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」の入力タグの値属性の内容をそのままコピーする必要があります。

参考までに、Firefox によると、_VIEWSTATE 入力タグ XPath は次のようになります。

 //*[@id="__VIEWSTATE"]

...そして、そのCSSセレクターは次のとおりです。

form#aspnetForm div input#__VIEWSTATE

Web サーバーからすべてのアイテムをダウンロードしたら、次に nedd を使用して HTML ページを解析します。

興味深いコンテンツがフォームの奥深くに埋め込まれています。HTML表です。

テーブルに関連する XPath は次のとおりです。

//*[@id="ctl00_ContentPlaceHolder1_dlList"]

...そしてCSSセレクターは

table#ctl00_ContentPlaceHolder1_dlList

これには、tbody、tr、td、div、および別のテーブルが含まれています (=もっと悪い設計 - 誰かがテーブルのない設計について学ぶ必要があります。HTML テーブルは、スマートフォンやタブレットでは見栄えが悪くなります。)

この時点で、Beautiful Soup 4 パーサーを稼働させる必要があると思います。

于 2013-07-19T07:48:40.303 に答える