Создание необработанного HTTP-запроса с сокетами

Я хотел бы иметь возможность построить необработанный HTTP-запрос и отправить его с помощью сокета. Очевидно, вы хотели бы, чтобы я использовал что-то вроде urllib и urllib2, но я не хочу этого использовать.

Это должно было бы выглядеть примерно так:

  • Редактирование строки в python telnet server
  • Python не обнаруживает закрытый сокет, пока вторая передача
  • Как я могу написать сервер сокета в другом потоке из моей основной программы (используя gevent)?
  • Отправка файла через TCP-сокеты в Python
  • Получение Errno 9: Плохой дескриптор файла в сокете python
  • Не удается привязать адрес после сбоев программы сокета
  • import socket tcpsoc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcpsoc.bind(('72.14.192.58', 80)) #bind to googles ip tcpsoc.send('HTTP REQUEST') response = tcpsoc.recv() 

    Очевидно, вам также придется запрашивать страницу / файл, а также получать и отправлять параметры

  • Python-Scapy или тому подобное. Как создать HTTP-запрос GET на уровне пакета
  • Как использовать Python для входа на веб-страницу и получения файлов cookie для последующего использования?
  • Каков самый чистый способ сделать HTTP POST с базовым auth в Python?
  • Ошибка Python: io.UsupportedOperation: fileno
  • Как отправить запрос POST как JSON?
  • Как создать API POST (ReST) в платформе Robot с помощью
  • 4 Solutions collect form web for “Создание необработанного HTTP-запроса с сокетами”

    Большая часть того, что вам нужно знать, – это спецификация HTTP / 1.1, которую вы обязательно должны изучить, если хотите запустить собственную HTTP-реализацию: http://www.w3.org/Protocols/rfc2616/rfc2616.html

     #!/usr/bin/python import socket import urlparse import re import os socket.setdefaulttimeout = 0.50 os.environ['no_proxy'] = '127.0.0.1,localhost' linkRegex = re.compile('<a\s*href=[\'|"](.*?)[\'"].*?>') CRLF = "\r\n\r\n" def GET(url): url = urlparse.urlparse(url) path = url.path if path == "": path = "/" HOST = url.netloc # The remote host PORT = 80 # The same port as used by the server # create an INET, STREAMing socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) """ *********************************************************************************** * Note that the connect() operation is subject to the timeout setting, * and in general it is recommended to call settimeout() before calling connect() * or pass a timeout parameter to create_connection(). * The system network stack may return a connection timeout error of its own * regardless of any Python socket timeout setting. *********************************************************************************** """ s.settimeout(0.30) """ ************************************************************************************** * Avoid socket.error: [Errno 98] Address already in use exception * The SO_REUSEADDR flag tells the kernel to reuse a local socket in TIME_WAIT state, * without waiting for its natural timeout to expire. ************************************************************************************** """ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #s.setblocking(0) s.connect((HOST, PORT)) s.send("GET / HTTP/1.0%s" % (CRLF)) data = (s.recv(1000000)) print data # https://docs.python.org/2/howto/sockets.html#disconnecting s.shutdown(1) s.close() print 'Received', repr(data) GET('http://www.google.com') 

    Да, в основном вам просто нужно написать текст, что-то вроде:

     GET /pageyouwant.html HTTP/1.1[CRLF] Host: google.com[CRLF] Connection: close[CRLF] User-Agent: MyAwesomeUserAgent/1.0.0[CRLF] Accept-Encoding: gzip[CRLF] Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7[CRLF] Cache-Control: no-cache[CRLF] [CRLF] 

    Не стесняйтесь удалять / добавлять заголовки по желанию.

    Для рабочего примера, который поможет вам, вы можете взглянуть на библиотеку libcurl , написанную на языке C, которая:

    1. делает то, что вы хотите, и многое другое;

    2. является оснасткой;

    3. широко используется; а также

    4. активно поддерживается.

    Это прекрасная вещь и один из лучших примеров того, что с открытым исходным кодом может и должно быть.

    Python - лучший язык программирования в мире.