2013-05-06 53 views
5

料理とJavaスクリプトを有効にする必要があるScrapyを使用してウェブサイトをスクラップしています。私は実際にjavascriptを処理しなければならないとは思わない。私が必要とするのは、javascriptが有効になっているかのように見せかけることだけです。ここでScrapyで有効になっているJavaScriptとCookieを送信するには?

は、私が試したものです: 1)クッキー

DOWNLOADER_MIDDLEWARES = { 
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 400, 
    'scrapy.contrib.downloadermiddleware.cookies.CookiesMiddleware':700 
} 

3のダウンロードミドルウェアを使用して)設定

COOKIES_ENABLED = True 
COOKIES_DEBUG = True 

2に、次の経由クッキーを有効にします)X-JavaScript対応の」送信':' True '

DEFAULT_REQUEST_HEADERS={ 
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
    'Accept-Language': 'en', 
    'X-JAVASCRIPT-ENABLED': 'True' 
} 

いずれも私と一緒に働いていません。あなたはどんなアイデアを提案したり、私に何か方向を教えてもらえますか

返信いただきありがとうございます。

答えて

1

治療はJavaスクリプトをサポートしていません。

あなたはWebkitの、セレンなどのように、JSを実行するためのScrapyでいくつかの他のライブラリを使用することができます

しかし

とクッキー(COOKIES_ENABLED = True)を有効にする必要はありませんが、でもDOWNLOADER_MIDDLEWARESを追加する必要はありませんあなたのsettings.pyにはすでに利用可能であるため、default scrapy settings

+0

Akhter、返事をありがとう:

次に、このようなあなたのクモにSplashRequest代わりのRequestをもたらします。私が言ったように、私はJavaScriptを処理する必要はありません。サーバーは、要求元でjavascriptが有効になっていない場合、実際のページを表示しません。私はちょうどジャバスクリプトとクッキーが有効になっているという信号をサーバーに送信する必要があります。 –

4

AFAIKという汎用ソリューションはありません。 Javascriptがクライアントによってサポートされていない/有効になっていないと判断する方法を確認するには、サイトをデバッグする必要があります。

私はサーバがX-JAVASCRIPT-ENABLEDヘッダーを見ているとは思わない。実際のjavascript対応ブラウザでページが読み込まれたときに、Javascriptによって設定されたCookieがある可能性がありますか?おそらくサーバーはuser-agentヘッダーを見ていますか?

this responseも参照してください。

+0

まあ、はい...それは私がうまくいく方向であるかもしれません... –

4

scrapyjsSplash JSエンジンを試してみてください。 Scrapyの背後にある同じ会社である

SPLASH_URL = 'http://192.168.59.103:8050' 
DOWNLOADER_MIDDLEWARES = { 
    'scrapyjs.SplashMiddleware': 725, 
} 

Scraping hub、有効スプラッシュであなたのクモを実行するためにspecial instancesがあります。ここにあなたのクモのプロジェクトでそれを設定する方法の例があります。

import scrapy 
from scrapy_splash import SplashRequest 

class MySpider(scrapy.Spider): 
    start_urls = ["http://example.com", "http://example.com/foo"] 

    def start_requests(self): 
     for url in self.start_urls: 
      yield SplashRequest(url, self.parse, 
       endpoint='render.html', 
       args={'wait': 0.5}, 
      ) 

    def parse(self, response): 
     # response.body is a result of render.html call; it 
     # contains HTML processed by a browser. 
     # … 
関連する問題