2017-04-22 223 views
0

我需要以某種方式從Scrapy中的Request對象中提取純HTTP請求消息(以便我可以複製/粘貼此請求並從Burp運行)。從Scrapy中的請求對象獲取HTTP請求消息

因此,如果給定scrapy.http.Request對象,我希望得到相應的請求消息,例如,

POST /test/demo_form.php HTTP/1.1 
Host: w3schools.com 

name1=value1&name2=value2 

顯然,我有我需要在Request對象的所有信息,但試圖重構消息手動是容易出錯的,因爲我可能會錯過一些邊緣情況。我的理解是,Scrapy首先將這個Request轉換爲Twisted對象,然後將對象寫入到TCP傳輸中。所以也許有些事情要做類似的事情,但是寫一個字符串呢?

UPDATE

我可以使用下面的代碼獲取HTTP 1.0請求消息,這是基於http.py。有沒有辦法做類似HTTP 1.1請求/ http11.py,這是實際發送的內容?我顯然希望儘可能避免從Scrapy/Twisted框架中複製代碼。

factory = webclient.ScrapyHTTPClientFactory(request) 
transport = StringTransport() 
protocol = webclient.ScrapyHTTPPageGetter() 
protocol.factory = factory protocol.makeConnection(transport) 
request_message = transport.value() 
print(request_message.decode("utf-8")) 

回答

1

由於scrapy是開源的,也有很多擴展點,所以這應該是可行的。

的請求被最終組裝和ScrapyAgent.download_requesthttps://github.com/scrapy/scrapy/blob/master/scrapy/core/downloader/handlers/http11.py#L270

在scrapy /核心/下載/處理器送出/ http11.py如果你把你的鉤子那裏你可以轉儲請求類型,請求頭,並請求正文。

要放置你的代碼中有你可以嘗試猴子修補ScrapyAgent.download_request或子類ScrapyAgent做請求記錄,然後繼承HTTP11DownloadHandler使用您的Scrapy代理,然後設置HTTP11DownloadHandler新DOWNLOAD_HANDLER在項目的設置HTTP/HTTPS請求.py(有關詳細信息,請參閱:https://doc.scrapy.org/en/latest/topics/settings.html#download-handlers

在我看來,這是最接近日誌記錄的請求,而不使用數據包嗅探器或日誌記錄代理(可能對您的方案有點矯枉過正)。

+0

嗯,是的,但問題是'download_request'中所做的任何事情都離得到的請求還有很遠的距離。在很多情況下,「Twisted」修改/增加了標題下的標題,例如,添加'主機',如果失蹤等。我想知道是否有可能欺騙'扭曲'寫入字符串中的結果請求,而不是複製粘貼所有的代碼? –

+0

讀一下'Twisted',我想我想要的是使用一個真正的'Agent',但用一個像'twisted.test.proto_helpers.StringTransport'這樣的虛擬傳輸器來提供它,它只會將請求緩存在內存中。然後,我將複製粘貼'download_request'中的代碼,但將'Agent'與'StringTransport'一起使用。我在正確的軌道上嗎?似乎無法找到任何做同樣事情的例子。 –

+0

其實,它似乎比我想象的要容易得多..簡單地做這件事的任何缺點? protocol = webclient.ScrapyHTTPPageGetter() protocol.factory = factory protocol。makeConnection(transport) htmlRequest = transport.value() print(htmlRequest.decode(「utf-8」))' –