Requests (Python)

Uit De Vliegende Brigade
Versie door Jeroen Strompf (overleg | bijdragen) op 5 aug 2019 om 10:58 (→‎Bronnen)
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Naar navigatie springen Naar zoeken springen

Python kent diverse bibliotheken om een webclient te emuleren. Requests lijkt de populairste te zijn (zomer 2019).

HTTP-requests

Een webserver en een webclient babbelen HTTP met elkaar via zogenaamde HTTP-requests. Er bestaan zeven requests:

  • GET
  • POST
  • PUT
  • HEAD
  • DELETE
  • PATCH
  • OPTIONS

GET en POST zijn de twee meestvoorkomende requests. PUT is een stuk zeldzamer. De overige requests kom je bijna nooit tegen. Waarschijnlijk is het handig om een begrip te hebben van deze eerste drie requests:

GET

Een browser gebruikt GET om een resource van een server op te vragen. Ik weet niet precies welke opties er zijn, of hoe je authenticatie incorporeert.

Voorbeeld:

GET /docs/index.html HTTP/1.1
Host: www.nowhere123.com
Accept: image/gif, image/jpeg, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
(blank line)

Voorbeeld van een GET-request met gebruiker-authenticatie geïncorporeerd in de URL:

GET https://www.example.com/api/v1/users/1?access_token=1234567890abcdefghijklmnopqrstuvwxyzABCD

De helpfile voor het Pythoncommando requests.get:

get(url, params=None, **kwargs)
    Sends a GET request.
    
    :param url: URL for the new :class:`Request` object.
    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response

POST

POST: Sent data to a server to create/update a resource. Als je Terug klikt binnen een browser, en deze waarschuwt je, dat je iets opnieuw submit, dan betreft het een POST-request

PUT

PUT: Broertje van POST, maar dan idempotent: Als je hetzelfde PUT-commando meerdere keren uitvoert, verandert het resultaat niet. Als je een POST-commando herhaalt, creëer je additionele resources/updates.

Inloggen op een afgeschermde pagina

Dat gaat met requests verbazend simpel. Sterker nog: Het eerste voorbeeld op de home page demonstreet dit:

>>> r = requests.get('http://example.strompf.com', auth=('xxx','yyy'))
>>> r.status_code
200
>>> r.headers
{'Content-language': 'en', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Vary': 'Accept-Encoding,Cookie', 'X-Powered-By': 'PHP/5.5.9-1ubuntu4.27', 'Date': 'Fri, 02 Aug 2019 12:14:12 GMT', 'Cache-Control': 'private, must-revalidate, max-age=0', 'Server': 'Apache/2.4.7 (Ubuntu)', 'Content-Type': 'text/html; charset=UTF-8', 'Content-Encoding': 'gzip', 'Keep-Alive': 'timeout=5, max=49', 'Connection': 'Keep-Alive', 'Content-Length': '32237', 'Last-Modified': 'Fri, 02 Aug 2019 10:03:24 GMT'}
>>> r.headers['content-type']
'text/html; charset=UTF-8'
>>> r.encoding
'UTF-8'
>>> r.text
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n<html lang="en" dir="ltr">\n<head>\n<title>Main Page - Example</title>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\n<meta name="generator" content="MediaWiki 1.16.4" />\n<link rel="alternate" type="application/x-wiki" title="Edit" href="/index.php?title=Main_Page&action=edit" />\n<link rel="edit" title="Edit" href="/index.php?title=Main_Page&action=edit" />\n<link rel="shortcut icon" href="/favicon.ico" />\n<link rel="search" type="application/opensearchdescription+xml" href="/opensearch_desc.php" title="Example (en)" />\n<link rel="alternate" type="a

Ter verificatie

#! /usr/bin/python3
#
# Experiments with requests
###################################################################
#
#
import requests

print(">>> Login zonder credentials...")
r = requests.get('http://example.strompf.com')
print(r.status_code)

print(">>> Login met correcte credentials...")
r = requests.get('http://example.strompf.com', auth=('xxx','correcte wachtwoord'))
print(r.status_code)

print(">>> Login met incorrecte credentials...")
r = requests.get('http://example.strompf.com', auth=('xxx','Verkeerde wachtwoord'))
print(r.status_code)

Uitvoer:

>>> Login zonder credentials...
401
>>> Login met correcte credentials...
200
>>> Login met incorrecte credentials...
401

P.s.: Handjevol HTTP Status-codes:

  • 200: OK
  • 301: Moved Permanently
  • 307: Temporary Redirected
  • 400: Bad Request
  • 401: Unauthorized
  • 403: Forbidden - Ik geloof dat je dit krijgt als je Google Search probeert te scrapen
  • 404: Not found
  • 504: Gateway Timeout - Krijg ik regelmatig op https://couchsurfing.com

Bronnen