AJAX を使用している Web サイトから動的コンテンツをスクレイピングするために scrapy を使用できますか? 質問する

AJAX を使用している Web サイトから動的コンテンツをスクレイピングするために scrapy を使用できますか? 質問する

私は最近 Python を勉強していて、Web スクレイパーの構築に取り組んでいます。これはまったく特別なものではありません。目的は、賭けの Web サイトからデータを取得し、そのデータを Excel に取り込むことだけです。

ほとんどの問題は解決可能で、私はかなり苦労しています。しかし、1 つの問題で大きな障害にぶつかっています。サイトが馬の表を読み込み、現在の賭け金を一覧表示する場合、この情報はどのソース ファイルにも存在しません。手がかりは、このデータが時々ライブであり、数字が明らかにリモート サーバーから更新されていることです。私の PC の HTML には、必要なすべての興味深いデータをサーバーがプッシュする穴があるだけです。

今のところ、動的 Web コンテンツに関する経験は浅いので、この点については理解するのに苦労しています。

Java または Javascript がキーになると思います。これは頻繁に発生します。

スクレイパーは、オッズ比較エンジンです。一部のサイトには API がありますが、そうでないサイトにはこれが必要です。私は Python 2.7 で scrapy ライブラリを使用しています。

この質問があまりにも曖昧な場合はお詫びします。簡単に言うと、私の質問は、この動的なデータをスクレイピングして使用できるようにするために、どのようにスクレイピングを使用すればよいかということです。この賭けのオッズ データをリアルタイムでスクレイピングできるようにするにはどうすればよいでしょうか。


参照:Python で動的コンテンツ (JavaScript で作成) を含むページをスクレイピングするにはどうすればよいですか?一般的なケースの場合。

ベストアンサー1

scrapyこれはAJAXリクエストの簡単な例です。サイトを見てみましょうrubin-kazan.ru

すべてのメッセージは AJAX リクエストで読み込まれます。私の目標は、これらのメッセージをすべての属性 (作成者、日付など) とともに取得することです。

ここに画像の説明を入力してください

ページのソース コードを分析しても、Web ページが AJAX テクノロジを使用しているため、これらのメッセージをすべて確認することはできません。ただし、Mozilla Firefox の Firebug (または他のブラウザーの同等のツール) を使用すると、Web ページでメッセージを生成する HTTP 要求を分析できます。

ここに画像の説明を入力してください

ページ全体をリロードするのではなく、メッセージを含むページ部分のみをリロードします。このために、下部にある任意の数のページをクリックします。

ここに画像の説明を入力してください

そして、メッセージ本文を担当する HTTP リクエストを観察します。

ここに画像の説明を入力してください

終了後、リクエストのヘッダーを分析します (ソース ページの var セクションから抽出したこの URL を引用する必要があります。以下のコードを参照してください)。

ここに画像の説明を入力してください

リクエストのフォーム データの内容 (HTTP メソッドは「Post」) は次のとおりです。

ここに画像の説明を入力してください

応答の内容は JSON ファイルです。

ここに画像の説明を入力してください

私が探している情報がすべて表示されます。

これからは、この知識をすべて scrapy に実装する必要があります。この目的のためにスパイダーを定義しましょう。

class spider(BaseSpider):
    name = 'RubiGuesst'
    start_urls = ['http://www.rubin-kazan.ru/guestbook.html']

    def parse(self, response):
        url_list_gb_messages = re.search(r'url_list_gb_messages="(.*)"', response.body).group(1)
        yield FormRequest('http://www.rubin-kazan.ru' + url_list_gb_messages, callback=self.RubiGuessItem,
                          formdata={'page': str(page + 1), 'uid': ''})

    def RubiGuessItem(self, response):
        json_file = response.body

関数にはparse、最初のリクエストに対する応答があります。 には、RubiGuessItemすべての情報を含む JSON ファイルがあります。

おすすめ記事