Solicitudes de Python: usar el sitio de navegación por los servidores IP

Quiero rastrear un sitio, sin embargo cloudflare se estaba interponiendo en el camino. Pude obtener los servidores IP, por lo que cloudflare no me molesta.

¿Cómo puedo utilizar esto en la biblioteca de solicitudes?

Por ejemplo, quiero ir directamente a www.example.com/foo.php , pero en las solicitudes resolverá la IP en la red cloudflare en lugar de la que quiero que use. ¿Cómo puedo hacer que use el que quiero que use?

Me gustaría enviar una solicitud para que la IP real con el host configurado como www.example.com, pero eso solo me dará la página de inicio. ¿Cómo puedo visitar otros enlaces en el sitio?

Tendrá que configurar un host encabezado personalizado con el valor de example.com , algo como:

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

debe hacer el truco Si desea verificar eso, escriba el siguiente comando (requiere netcat): nc -l -p 80 y luego ejecute el comando anterior. Producirá salida en la ventana 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 

Tendría que indicar las requests para falsificar el encabezado del Host y reemplazar el nombre de host en la URL con la dirección IP:

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

La URL ‘parcheo’ se puede hacer con la biblioteca 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}) 

Demo contra Stack Overflow:

 >>> 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  

En este caso busqué dinámicamente la dirección ip.