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가 먼저 Request
을 Twisted
개체로 변환 한 다음 헤더와 본문을 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"))
글쎄, 네,하지만 문제는'download_request'에서 행해진 모든 것이 여전히 결과 요청과는 거리가 멀다는 것입니다. 'Twisted'가 머리글을 더 줄이거 나 늘리는 경우가 많이 있습니다. 만약'Twisted'를 문자열에 결과를 쓰는 대신 모든 코드를 복사하여 붙여 넣기하는 것만 가능하다면 궁금합니다. –
'Twisted'에 대해 좀 더 자세히 읽고 싶습니다. 실제 에이전트를 사용하고 싶지만 메모리에 요청을 버퍼링하는'twisted.test.proto_helpers.StringTransport'와 같은 더미 전송 물로 피드하는 것이 좋습니다. . 나는'StringTransport'와 함께'Agent'를 사용하는 것을 제외하고'download_request'에서 코드를 복사하여 붙여 넣을 것입니다. 나는 올바른 길을 가고 있는가? 같은 일을하는 예를 찾을 수없는 것 같습니다. –
사실, 생각보다 훨씬 쉬워 보입니다. 단순히이 작업을 수행 할 때 단점이 있습니까? 'factory = webclient.ScrapyHTTPClientFactory (response.request) transport = StringTransport() protocol = webclient.ScrapyHTTPPageGetter() protocol.factory = factory 프로토콜입니다. –