2017-11-18 302 views
0

我遇到了一些麻煩,試圖構建一個python機器人來檢查應用程序的狀態。對於解釋,這裏是這個過程的一個例子:如何使用Python請求,會話或dryscrape維護會話cookie(在退出時過期)?

1)訪問網站(https://examplewebsite.com/checkinfo.do?a=sample

2)假設查詢字符串是否正確,網站將下降一個cookie。這個cookie是一個'會話cookie',因此在退出關閉或離開網頁時立即過期。一旦餅乾已獲得訪問https://examplewebsite.com/step2.do?a=sample

4)請求的解析結果https://examplewebsite.com/step2.do?a=sample

雖然這看似簡單,我無法發送第二請求https://examplewebsite.com/step2.do?a=sample

3)和我經常遇到一個頁面說「會話過期」。

我試圖用Python請求,Python requests.session以及dryscrape重現這個過程。但我無法實現它 - 我的直覺是,因爲cookie是一個「會話cookie」,當第二次請求https://examplewebsite.com/step2.do?a=sample啓動但頁面加載之前,它會立即生效。

也許有更好的方式來解釋的問題是與瀏覽器的行爲,使用Firefox和IE的網站的行爲類似於下面:

1)訪問網站(https://examplewebsite.com/checkinfo.do?a=sample

  • Cookie是成功獲得

2.)與替換URL https://examplewebsite.com/step2.do?a=sample

  • 「會話過期」 的警告提出

然而,這並不工作:

1)

  • 成功獲得一個cookie訪問網站(鏈接同上)

2.)在保持第一個選項卡打開的同時,創建第二個選項卡並將 https://examplewebsite.com/step2.do?a=sample粘貼到瀏覽器中

  • 信息已正確加載,並且未出現「會話過期」警告。

所以我的問題是,如何在Python中重現「創建新選項卡」的行爲,同時保持請求之間共享會話cookie。

這是我嘗試做它在dryscrape

import dryscrape 

a = dryscrape.Session() 
a.set_header("User-Agent", "Firefox") 
a.visit('checkinfo.do URL') 

b = dryscrape.Session() 
b.set_header("User-Agent", "Firefox") 
b.set_cookie(a.cookies()) #This is my attempt to share the session cookies in a seperate dryscrape object to simulate putting the URL in a second tab. 
b.visit('step2.do URL') 

不幸的是,上述不工作,和一個。在第二次請求之前和之後,cookie與b.cookies不匹配。

注意:網站頁面的代碼會在頁面卸載時結束會話。因此,如果dryscrape執行與卸載頁面相同的任何操作,會話cookie將被服務器標記爲無效。

+0

我試圖重新創造dryscrape一個新的標籤相同的效果不工作,有人可以確認,如果我傳遞的cookies正確嗎?是否有特殊的方式來傳遞「會話cookie」,因爲它看起來好像沒有傳遞完整的cookie。請參閱上面的編輯。 –

+0

我曾嘗試通過set_header設置Cookie信息,但仍未能使其正常工作。 我相信由於某種原因,當我通過dryscrape獲取cookie時,它即將過期,可能是因爲dryscrape的行爲導致cookie在客戶端或服務器端過期。 –

+0

仍然在這個: 我發現我可以通過dryscrape貸款第二頁,如果我: 1.)訪問firefox的第一頁; 2.)訪問firefox中的第二頁: 3.)使用set_headers將第二個firefox頁面加載的請求標題複製到dryscrape對象中,然後使用visit加載第二個頁面。 –

回答

0

現在我也遇到了類似的問題。

您的代碼存在的問題是,a.cookies()返回一個Cookie列表。您需要分別設置每個Cookie。

嘗試是這樣的:

b = dryscrape.Session() 
b.set_header("User-Agent", "Firefox") 
for cookie in a.cookies(): 
    b.set_cookie(cookie) 

希望它能幫助:)