我想使用scrapy來廣泛地使用javascript來操縱文檔,cookies等(但沒有簡單的像JSON響應)。出於某種原因,我無法從網絡流量中確定,當我在瀏覽器中查看時,我需要的頁面會顯示爲錯誤,但不會顯示。所以我想要做的就是使用webkit來呈現瀏覽器中顯示的頁面,然後對其進行刮除。 scrapyjs項目是爲此目的而製作的。Scrapy使用完整的webkit管理會話cookie javascript執行
要訪問我需要的頁面,我必須先登錄並保存了一些會話cookie。我的問題是,當它呈現頁面時,我無法成功向Webkit提供會話cookie。有兩種方式我可以這樣做:
- 獨家使用scrapy頁面請求,直到我到達需要webkit的頁面,然後傳遞必需的cookie。
- 在scrapy中使用webkit(通過scrapyjs的修改版本),從登錄到整個會話,直到我需要的頁面,並允許它根據需要保留cookie。
不幸的是,這兩種方法似乎都沒有奏效。
沿方法1中的線,我嘗試以下: 在settings.py -
DOWNLOADER_MIDDLEWARES = {
'scrapyjs.middleware.WebkitDownloader': 701, #to run after CookiesMiddleware
}
我改性scrapyjs發送cookie:scrapyjs/middleware.py--
import gtk
import webkit
import jswebkit
#import gi.repository import Soup # conflicting static and dynamic includes!?
import ctypes
libsoup = ctypes.CDLL('/usr/lib/i386-linux-gnu/libsoup-2.4.so.1')
libwebkit = ctypes.CDLL('/usr/lib/libwebkitgtk-1.0.so.0')
def process_request(self, request, spider):
if 'renderjs' in request.meta:
cookies = request.headers.getlist('Cookie')
if len(cookies)>0:
cookies = cookies[0].split('; ')
cookiejar = libsoup.soup_cookie_jar_new()
libsoup.soup_cookie_jar_set_accept_policy(cookiejar,0) #0==ALWAYS ACCEPT
up = urlparse(request.url)
for c in cookies:
sp=c.find('=') # find FIRST = as split position
cookiename = c[0:sp]; cookieval = c[sp+1:];
libsoup.soup_cookie_jar_add_cookie(cookiejar, libsoup.soup_cookie_new(cookiename,cookieval,up.hostname,'None',-1))
session = libwebkit.webkit_get_default_session()
libsoup.soup_session_add_feature(session,cookiejar)
webview = self._get_webview()
webview.connect('load-finished', self.stop_gtk)
webview.load_uri(request.url)
...
設置cookiejar的代碼是從this response改編的。問題可能在於進口如何工作;也許這不是我正在修改的正確的webkit - 我對webkit不太熟悉,而python文檔也很差。 (我不能在第二個答案的方法中使用from gi.repository import Soup
,因爲它混合了靜態和動態庫。我也無法在上面導入的webkit中找到任何get_default_session())。
第二種方法失敗,因爲跨請求不保留會話,並且我對webkit知之甚少,無法知道如何使其保留在此框架中。
任何幫助表示讚賞!