我有一个网站指纹的情况下关闭头顺序和 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
必须出现在正确的位置。在本例中,它介于CC
和dD
之间。
我会很感激任何朝着正确方向的步骤。谢谢你,谢谢
1条答案
按热度按时间t98cgbkg1#
我能够排序(按字母顺序),并使大小写敏感的标题(包括内容长度):
1.区分大小写:修改内部Twisted
Headers
类的_caseMappings
以允许区分大小写的头文件1.两个“Content-Length”头:修改Twisted
web/_newClient.py
_writeToBodyProducerContentLength
方法(在此处找到)以从字符串
我的github仓库代码可以找到here