2017-04-22 9 views
0

Scrapy의 Request 객체에서 일반 HTTP 요청 메시지를 추출해야합니다 (예 :이 요청을 복사/붙여 넣기와 Burp에서 실행할 수 있도록).Scream에서 Request 객체로부터 HTTP 요청 메시지 받기

주어진 scrapy.http.Request 개체가 주어지면, 예를 들어, 다음과 같은 해당 요청 메시지를 얻고 싶습니다.

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

name1=value1&name2=value2 

은 분명히 내가 어떤 가장자리 케이스를 놓칠 수 있기 때문에 수동으로 오류가 발생하기 쉬운입니다 그러나 메시지를 재구성하려고, 나는 Request 객체에 필요한 모든 정보가 있습니다. 제 이해는 Scrapy가 먼저 RequestTwisted 개체로 변환 한 다음 헤더와 본문을 TCP 전송에 씁니다. 그래서 어쩌면 비슷한 것을 할 수 있지만 대신에 문자열을 써야할까요?

UPDATE

내가 http.py을 기반으로 HTTP 1.0 요청 메시지를 얻기 위해 다음 코드를 사용할 수 있습니다. 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

치료 도구는 오픈 소스이며 확장 점도 많기 때문에이 방법을 사용할 수 있습니다.

요청은 최종적으로 조립하고, 요청 헤더를 당신이 당신의 후크를 배치하면 요청 유형을 덤프 할 수있는 경우 ScrapyAgent.download_request (https://github.com/scrapy/scrapy/blob/master/scrapy/core/downloader/handlers/http11.py#L270)

에/scrapy/코어/다운/핸들러에 http11.py을 발송하고 있습니다 요청 본문.

ScrapyAgent.download_request 패치 원숭이를 시도 할 수 있습니다 또는 요청 로깅을 할 ScrapyAgent을 하위 클래스, 다음 Scrapy 에이전트를 사용하는 HTTP11DownloadHandler를 서브 클래스 다음 프로젝트의 설정에서 HTTP/HTTPS 요청에 대해 새로운 DOWNLOAD_HANDLER로 HTTP11DownloadHandler 설정이 코드를 배치하려면 .py (자세한 내용은 참조 : https://doc.scrapy.org/en/latest/topics/settings.html#download-handlers)

제 의견으로는 패킷 스니퍼 또는 로깅 프록시 (시나리오에 다소 과장 될 수 있음)를 사용하지 않고 요청을 로깅 할 수있는 가장 가까운 곳입니다.

+0

글쎄, 네,하지만 문제는'download_request'에서 행해진 모든 것이 여전히 결과 요청과는 거리가 멀다는 것입니다. 'Twisted'가 머리글을 더 줄이거 나 늘리는 경우가 많이 있습니다. 만약'Twisted'를 문자열에 결과를 쓰는 대신 모든 코드를 복사하여 붙여 넣기하는 것만 가능하다면 궁금합니다. –

+0

'Twisted'에 대해 좀 더 자세히 읽고 싶습니다. 실제 에이전트를 사용하고 싶지만 메모리에 요청을 버퍼링하는'twisted.test.proto_helpers.StringTransport'와 같은 더미 전송 물로 피드하는 것이 좋습니다. . 나는'StringTransport'와 함께'Agent'를 사용하는 것을 제외하고'download_request'에서 코드를 복사하여 붙여 넣을 것입니다. 나는 올바른 길을 가고 있는가? 같은 일을하는 예를 찾을 수없는 것 같습니다. –

+0

사실, 생각보다 훨씬 쉬워 보입니다. 단순히이 작업을 수행 할 때 단점이 있습니까? 'factory = webclient.ScrapyHTTPClientFactory (response.request) transport = StringTransport() protocol = webclient.ScrapyHTTPPageGetter() protocol.factory = factory 프로토콜입니다. –