2013-07-21 53 views
1

對不起,如果問題很蠢,但我還找不到答案。scrapy中的響應對象不完整

我想編寫腳本提取使用「scrapy殼」命令從網站的數據:

我懷疑Web服務器首先服務於靜態數據,然後填充頁面中的動態數據。我想這是通過在網頁上的JavaScript管理。

如果我的理解是正確的,那麼需要發生的是scrapy需要等一會兒才能返回結果。

有人可以幫我嗎?

謝謝!

+0

Scrapy將給你可以在瀏覽器的「查看源代碼」命令中看到的內容,而不一定是你在瀏覽器窗口中看到的內容。 Scrapy不理解Javascript,所以沒有AJAX調用,沒有jQuery魔法......所以沒有動態數據。您可以從瀏覽器開發人員工具中查看網絡活動,並嘗試使用新的Scrapy Request()來模仿Javascript/AJAX調用以獲取aditional內容,但使用Scrapy模擬真實瀏覽器可能很困難 –

+0

您也可以查看https ://github.com/scrapinghub/scrapyjs –

回答

0

這是一個在下載處理程序中間件中使用selenium和phantomjs headless webdriver的工作示例。

class JsDownload(object): 

@check_spider_middleware 
def process_request(self, request, spider): 
    driver = webdriver.PhantomJS(executable_path='D:\phantomjs.exe') 
    driver.get(request.url) 
    return HtmlResponse(request.url, encoding='utf-8', body=driver.page_source.encode('utf-8')) 

我想能告訴不同蜘蛛要使用的中間件,所以我實現了這個包裝:

def check_spider_middleware(method): 
@functools.wraps(method) 
def wrapper(self, request, spider): 
    msg = '%%s %s middleware step' % (self.__class__.__name__,) 
    if self.__class__ in spider.middleware: 
     spider.log(msg % 'executing', level=log.DEBUG) 
     return method(self, request, spider) 
    else: 
     spider.log(msg % 'skipping', level=log.DEBUG) 
     return None 

return wrapper 

settings.py:

DOWNLOADER_MIDDLEWARES = {'MyProj.middleware.MiddleWareModule.MiddleWareClass': 500} 

用於包裝工作都必須蜘蛛至少有:

middleware = set([]) 

包括中間件:

middleware = set([MyProj.middleware.ModuleName.ClassName]) 

你可以在請求回調(在蜘蛛)已經實現了這一點,但隨後的HTTP請求將發生兩次。這不是一個完整的證明解決方案,但它適用於加載.ready()的東西。如果您花時間閱讀硒,則可以等待特定事件觸發後再保存頁面源代碼。

又如:https://github.com/scrapinghub/scrapyjs

乾杯!