【问题标题】:'\n' in proxies in requests module of pythonpython的请求模块中的代理中的'\ n'
【发布时间】:2021-06-12 11:56:33
【问题描述】:

我在请求 python 中使用代理,我遇到了这个问题。

proxy = '159.197.128.8:3128'
response = s.get('http://ipv4.icanhazip.com', 
                 timeout=10,
                 proxies={"http": f"http://{proxy}", "https": f"http://{proxy}"},
                 headers={'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/37.0.2062.94 Chrome/37.0.2062.94 Safari/537.36'})
print(response.content)

这段代码工作得很好..当我在代理的末尾添加一个'\n'时..即

proxy=proxy+'\n'

它仍然有效,但添加两个 '\n' 会返回错误“解析失败” 我不知道请求如何解析代理以及为什么最后的 '\n' 没有任何区别..请帮助我理解这一点

【问题讨论】:

    标签: python proxy python-requests


    【解决方案1】:

    只需按照回溯并查看用于解析代理 URL 的内容。

    requestsHTTPAdapter.get_connection() urllib3parse_url 方法中使用。
    但是,正则表达式用于匹配 url(使用re.match())。正则表达式以 $ 结尾。

    来自related python docs

    $
    匹配字符串的结尾或正好在字符串结尾的换行符之前,并且在 MULTILINE 模式下也匹配换行符之前。 foo 匹配“foo”和“foobar”,而正则表达式 foo$ 只匹配“foo”。更有趣的是,在 'foo1\nfoo2\n' 中搜索 foo.$ 通常匹配 'foo2',但在 MULTILINE 模式下搜索 'foo1';在 'foo\n' 中搜索单个 $ 将找到两个(空)匹配项:一个在换行符之前,一个在字符串末尾。

    所以正则表达式匹配字符串直到结尾或换行。因此, re 或多或少会忽略最后一个新行。
    但是,如果您现在在您的代理 url 中有两个换行符,那么您就有一个多行字符串,即使它忽略了最后一个换行符,仍然有一个换行符与正则表达式不匹配。


    这是一个具有相同行为的最小示例:

    >>> import re
    >>> regex = re.compile(r'^\d$')  # matches exactly one digit
    >>> print(re.match(regex, '1'))
    <re.Match object; span=(0, 1), match='1'>
    >>> print(re.match(regex, '1\n'))
    <re.Match object; span=(0, 1), match='1'>
    >>> print(re.match(regex, '1\n\n'))
    None
    

    【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多