2017-05-18 26 views
2

私はPython、Scrapy、Splash、およびscrapy_splashパッケージを使用してWebサイトをスクラップしています。scrapy_splashパッケージを使用してフォーム投稿後にリダイレクトする方法は?

私はscrapy_splashのSplashRequestオブジェクトを使用してログインできます。 ログインすると、ポータルページにアクセスできるCookieが作成されます。この時点ですべての作品。

ポータルページには、いくつかのボタンをラップするフォーム要素があります。クリックすると、アクションURLが更新され、フォーム提出がトリガーされます。フォームの提出により、302リダイレクトが発生します。

私はSplashRequestで同じアプローチを試みましたが、リダイレクトで返されるSSOクエリパラメータを取得できません。私は成功せずにヘッダのLocationパラメータを読み込もうとしました。

また、SplashRequestオブジェクトと組み合わせてluaスクリプトを使用しようとしましたが、まだリダイレクトLocationオブジェクトにアクセスできません。

ご指摘いただければ幸いです。

上記のテクニックは多数の他のスクリプトで使用されていますが、私はこの特定のユースケースに新しい技術を追加することを躊躇していますが、他のソリューション(セレン)もあります。

# Lua script to capture cookies and SSO query parameter from 302 Redirect 
lua_script = """ 
    function main(splash) 
     if splash.args.cookies then 
      splash:init_cookies(splash.args.cookies) 
     end 
     assert(splash:go{ 
      splash.args.url, 
      headers=splash.args.headers, 
      http_method=splash.args.http_method, 
      body=splash.args.body, 
      formdata=splash.args.formdata 
     }) 
     assert(splash:wait(0)) 

     local entries = splash:history() 
     local last_response = entries[#entries].response 

     return { 
      url = splash:url(), 
      headers = last_response.headers, 
      http_status = last_response.status, 
      cookies = splash:get_cookies(), 
      html = splash:html(), 
     } 
    end 
    """ 

def parse(self, response): 
    yield SplashRequest(
    url='https://members.example.com/login', 
    callback=self.portal_page, 
    method='POST', 
    endpoint='execute', 
    args={ 
     'wait': 0.5, 
     'lua_source': self.lua_script, 
     'formdata': { 
      'username': self.login, 
      'password': self.password 
     }, 
    } 
) 

def portal_page(self, response): 
    yield SplashRequest(
    url='https://data.example.com/portal' 
    callback=self.data_download, 
    args={ 
     'wait': 0.5, 
     'lua_source': self.lua_script, 
     'formdata': {} 
    }, 
) 

def data_download(self, response): 
    print(response.body.decode('utf8') 
+1

ねえ、ログイン後にクッキーを取得しています。 scrapy-splashはそれらをScrapyに渡す必要があります(正しく設定されている場合、つまり必要なオプションがすべて設定されている場合)。しかし、あなたのLuaスクリプトはクッキーを初期化しないので、各スプラッシュリクエストはあなたの例では認証されません。クッキーを最初に作ってみることができますか? https://github.com/scrap-plugins/scrapy-splash#session-handlingと最後の例を参照してください。https://github.com/scrapy-plugins/scrapy-splash#examples –

+0

あなたの返事Mikhailに感謝します。私の理解では、SplashFormRequest.from_responseメソッドを呼び出して応答オブジェクトを渡すと、クッキーとヘッダーが初期化されます。代わりにSplashRequestオブジェクトを使用し、手動でluaスクリプトでヘッダとクッキーを自分で設定する必要がありますか? –

+1

問題はLuaコードです:クッキーとヘッダーはLuaスクリプトに渡されますが(SplashRequest/SplashFormRequestが処理します)、これらの値はこのスクリプトでは使用されません。スプラッシュはありません:init_cookesコール。私がリンクしている例を確認してください。このすべてのものを有効にするために必要な部分がすべてあります。 –

答えて

1

上記の質問を実際の例で更新しました。

私はいくつか変更しましたが、私が抱えていた問題はsplash:init_cookies(splash.args.cookies)の参照を紛失していました。

また、SplashFormRequestからSplashRequestに変換し、splash:goブロックをリファクタリングし、特定の形式への参照を削除しました。

@MikhailKorobovもう一度おねがいします。

+0

何らかの理由で、スクリプトの5行目に 'LUA_ERROR'が表示されていますが、正しいと思います。ダブルチェックできますか?私は 'Scrapy == 1.4.0'と' scrapy-splash == 0.7.2' –

+0

@GianfrancoPを使っています。メッセージをありがとう。問題を解決するためにsplash.args.cookies割り当てのnullチェックでコードを更新しました。 –

+0

こんにちは、お返事ありがとうございます。この問題は 'go:{...}'関数の周りの 'assert()'にあるようです。完全な形式の関数を持っている何らかの理由で、アサーションは機能しません。 –

関連する問題