Python请求-使用按服务器导航站点IP

2024-05-18 14:50:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想抓取一个站点,但是cloudflare挡住了我的路。我可以获得服务器IP,所以cloudflare不会打扰我。

如何在请求库中利用此功能?

例如,我想直接转到 www.example.com/foo.php,但在请求中,它将解析cloudflare网络上的IP,而不是我希望它使用的IP。我怎么能用我想要的那个?

我希望发送一个请求,这样主机设置为www.example.com的真实IP,但这只会给我主页。如何访问网站上的其他链接?


Tags: 功能ip网络服务器com利用foo站点
3条回答

支持HTTPS/SNI的答案:使用requests_toolbelt module中的HostHeaderSSLAdapter

上述解决方案适用于非加密HTTP连接的virtualhost。对于HTTPS,还需要在TLS头中传递SNI(服务器名称标识),因为有些服务器将根据通过SNI传递的内容呈现不同的SSL证书。另外,python ssl库默认情况下不会查看Host:头来匹配连接时的服务器连接。

上面提供了一个直接的方法,将传输适配器添加到为您处理此问题的请求中。

示例

import requests

from requests_toolbelt.adapters import host_header_ssl

# Create a new requests session
s = requests.Session()

# Mount the adapter for https URLs
s.mount('https://', host_header_ssl.HostHeaderSSLAdapter())

# Send your request
s.get("https://198.51.100.50", headers={"Host": "example.org"})

您必须设置一个值为example.com的自定义头host,如下所示:

requests.get('http://127.0.0.1/foo.php', headers={'host': 'example.com'})

应该会成功的。如果要验证,请键入以下命令(需要netcat):nc -l -p 80,然后运行以上命令。它将在netcat窗口中生成输出:

GET /foo.php HTTP/1.1
Host: example.com
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.6.2 CPython/3.4.3 Windows/8

你必须告诉requests伪造Host头,并用IP地址替换URL中的主机名:

requests.get('http://123.45.67.89/foo.php', headers={'Host': 'www.example.com'})

URL“修补”可以使用urlparse库完成:

parsed = urlparse.urlparse(url)
hostname = parsed.hostname
parsed = parsed._replace(netloc=ipaddress)
ip_url = parsed.geturl()

response = requests.get(ip_url, headers={'Host': hostname})

防堆栈溢出演示:

>>> import urlparse
>>> import socket
>>> url = 'http://stackoverflow.com/help/privileges'
>>> parsed = urlparse.urlparse(url)
>>> hostname = parsed.hostname
>>> hostname
'stackoverflow.com'
>>> ipaddress = socket.gethostbyname(hostname)
>>> ipaddress
'198.252.206.16'
>>> parsed = parsed._replace(netloc=ipaddress)
>>> ip_url = parsed.geturl()
>>> ip_url
'http://198.252.206.16/help/privileges'
>>> response = requests.get(ip_url, headers={'Host': hostname})
>>> response
<Response [200]>

在这种情况下,我动态地查找ip地址。

相关问题 更多 >

    热门问题