指示Scrapy不自动添加`Content-Length`头(如果已经存在)

vlurs2pr  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(137)

我有一个网站指纹的情况下关闭头顺序和 shell 的基础上。
我已经能够指定标题顺序与正确的情况下:

import json
from scrapy.spiders import Spider
from scrapy.http import Request

from twisted.web.http_headers import Headers as TwistedHeaders

class Test(Spider):
    name = 'test'
    custom_settings = {
        'DEFAULT_REQUEST_HEADERS': {
            'aA': 'a',
            'Bb': 'b',
            'CC': 'c',
            'Content-Length': '14',
            'dD': 'd',
        },
    }
    
    # Preserve casing of headers
    TwistedHeaders._caseMappings[b'aa'] = b'aA'
    TwistedHeaders._caseMappings[b'bb'] = b'Bb'
    TwistedHeaders._caseMappings[b'cc'] = b'CC'
    TwistedHeaders._caseMappings[b'dd'] = b'dD'

    def start_requests(self):
        yield Request(
            'https://httpbin.org/post',
            body=json.dumps({'foo': 'bar'}),
            method='POST',
            # Sniff with Fiddler
            # meta={'proxy': 'https://127.0.0.1:8866'}
        )
    
    def parse(self, response): pass

字符串
我在Fiddler中注意到,当我运行spider时,另一个Content-Length出现在请求头的开头:
x1c 0d1x的数据
我试着在Scrapy/Twisted中找到这个设置的位置,但是因为我是新来的,所以需要通读很多东西。因此,我很难理解为什么会发生这种情况。
如果Content-Length已经存在,是否可以指示它不自动添加?或者,如果它是自动添加的,Content-Length是否遵守标题顺序?

我知道如果我删除Content-Length,请求就可以工作;然而,它仍然是无序的(Content-Length作为头中的第一个键出现)。对于我的用例,我认为Content-Length必须出现在正确的位置。在本例中,它介于CCdD之间。

我会很感激任何朝着正确方向的步骤。谢谢你,谢谢

t98cgbkg

t98cgbkg1#

我能够排序(按字母顺序),并使大小写敏感的标题(包括内容长度):

  1. ORDER:创建一个自定义下载器,它将标题设置为按字母顺序排序
    1.区分大小写:修改内部Twisted Headers类的_caseMappings以允许区分大小写的头文件
    1.两个“Content-Length”头:修改Twisted web/_newClient.py_writeToBodyProducerContentLength方法(在此处找到)以从
def _writeToBodyProducerContentLength(self, transport):
-    self._writeHeaders(
-         transport,
-         networkString("Content-Length: %d\r\n" % (self.bodyProducer.length,)),
-     )
+    self._writeHeaders(transport, None)

字符串
我的github仓库代码可以找到here

相关问题