Maison > Article > développement back-end > Premiers pas avec les robots d'exploration Python (1) - Comprendre rapidement le protocole HTTP
Le protocole http est l'un des protocoles les plus importants et les plus fondamentaux d'Internet. Nos robots d'exploration doivent souvent gérer le protocole http. L'article suivant vous présente principalement les informations pertinentes sur python Démarrer avec Crawler pour comprendre rapidement le protocole HTTP. L'introduction dans l'article est très détaillée. Les amis qui en ont besoin peuvent s'y référer. à cela. Rejoignons-nous.
Avant-propos
Le principe de base du robot d'exploration est de simuler le navigateur pour effectuer une requête HTTP. Comprendre le protocole HTTP est nécessaire. base pour l'écriture d'un robot, la position du robot sur le site de recrutement indique également clairement que vous maîtrisez les spécifications du protocole HTTP. Lors de l'écriture d'un robot, vous devez commencer par le protocole HTTP. >Qu'est-ce que le protocole HTTP ?
Chaque page Web que vous parcourez est présentée sur la base du protocole HTTP Le protocole HTTP est un protocole de communication de données entre le client (navigateur) et le serveur dans les applications Internet. Le protocole stipule le format dans lequel le client doit envoyer les requêtes au serveur, ainsi que le format de la réponse renvoyée par le serveur. Tant que chacun lance des requêtes et renvoie les résultats des réponses conformément au protocole, n'importe qui peut implémenter son propre client Web (navigateur, robot d'exploration) et son propre serveur Web (Nginx, Apache, etc.) basés sur le protocole HTTP. .
Le protocole HTTP lui-même est très simple. Il stipule que le client ne peut lancer activement des requêtes et que le serveur renvoie le résultat de la réponse après avoir reçu la requête et l'avoir traitée. En même temps, HTTP est un protocole sans
statut, et le protocole lui-même ne le fait pas. enregistrer les enregistrements de demandes historiques du client.
Comment le protocole HTTP spécifie-t-il le format de requête et le format de réponse ? En d’autres termes, dans quel format le client peut-il correctement lancer une requête HTTP ? Dans quel format le serveur renvoie-t-il le résultat de la réponse afin que le client puisse l'analyser correctement ?Requête HTTP
La requête HTTP est composée de 3 parties regroupées, à savoir la ligne de requête, l'en-tête de requête et la requête body , l'en-tête et le corps de la requête sont facultatifs et ne sont pas obligatoires pour chaque requête.
Ligne de requête
La ligne de requête est une partie essentielle de chaque demande, elle se compose de 3 Il se compose de parties, à savoir la méthode de requête (méthode), l'URL de requête (URI) et la version du protocole HTTP, séparées par des espaces.
Les méthodes de requête les plus couramment utilisées dans le protocole HTTP sont : GET, POST, PUT, DELETE. La méthode GET est utilisée pour obtenir des ressources du serveur, et 90 % des robots explorent les données en fonction des requêtes GET.
L'URL de la requête fait référence à l'adresse du chemin du serveur où se trouve la ressource. Par exemple, l'exemple ci-dessus indique que le client souhaite obtenir la ressource index.html, et son chemin se trouve sous le répertoire racine. (/) du serveur foofish.net.
En-tête de requête
La quantité d'informations contenues dans la ligne de requête étant très limitée, le client a encore beaucoup à dire au serveur Les éléments doivent être placés dans l'en-tête de la requête (Header). L'en-tête de la requête est utilisé pour fournir des informations supplémentaires au serveur. Par exemple, User-Agent est utilisé pour indiquer l'identité du client et indiquer au serveur si le serveur est connecté. la requête provient d'un navigateur ou d'un robot, ou de Chrome. Le navigateur est toujours FireFox. HTTP/1.1 spécifie 47 types de champs d'en-tête. Le format du champ d'en-tête HTTP est très similaire au type de dictionnaire en Python, composé de paires clé-valeur séparées par des deux-points. Par exemple :
Parce que lorsque le client envoie une requête, la donnée (message) envoyée est composée d'une chaîne Afin de distinguer la fin de l'en-tête de la requête et le début du corps de la requête, une ligne vide est utilisée pour le représenter, lorsqu'une ligne vide est rencontrée, cela signifie qu'il s'agit de la fin de l'en-tête et du début du corps de la requête.User-Agent: Mozilla/5.0
Corps de la requête
Le corps de la requête est le contenu réel soumis par le client au serveur, tel que le nom d'utilisateur et le mot de passe requis lorsque le l'utilisateur se connecte. Par exemple, les données de téléchargement de fichiers, telles que les informations de formulaire soumises lors de l'enregistrement des informations de l'utilisateur. Nous utilisons maintenant le module de socket API original fourni par Python pour simuler une requête HTTP au serveur
Réponse HTTPwith socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: # 1. 与服务器建立连接 s.connect(("www.seriot.ch", 80)) # 2. 构建请求行,请求资源是 index.php request_line = b"GET /index.php HTTP/1.1" # 3. 构建请求首部,指定主机名 headers = b"Host: seriot.ch" # 4. 用空行标记请求首部的结束位置 blank_line = b"\r\n" # 请求行、首部、空行这3部分内容用换行符分隔,组成一个请求报文字符串 # 发送给服务器 message = b"\r\n".join([request_line, headers, blank_line]) s.send(message) # 服务器返回的响应内容稍后进行分析 response = s.recv(1024) print(response)
Une fois que le serveur a reçu et traité la demande, il renvoie le contenu de la réponse au client. De même, le contenu de la réponse doit suivre un format fixe pour que le navigateur l'analyse correctement. La réponse HTTP se compose également de trois parties : la ligne de réponse, l'en-tête de réponse et le corps de la réponse, qui correspondent au format de la requête HTTP.
响应行
响应行同样也是3部分组成,由服务端支持的 HTTP 协议版本号、状态码、以及对状态码的简短原因描述组成。
状态码是响应行中很重要的一个字段。通过状态码,客户端可以知道服务器是否正常处理的请求。如果状态码是200,说明客户端的请求处理成功,如果是500,说明服务器处理请求的时候出现了异常。404 表示请求的资源在服务器找不到。除此之外,HTTP 协议还很定义了很多其他的状态码,不过它不是本文的讨论范围。
响应首部
响应首部和请求首部类似,用于对响应内容的补充,在首部里面可以告知客户端响应体的数据类型是什么?响应内容返回的时间是什么时候,响应体是否压缩了,响应体最后一次修改的时间。
响应体
响应体(body)是服务器返回的真正内容,它可以是一个HTML页面,或者是一张图片、一段视频等等。
我们继续沿用前面那个例子来看看服务器返回的响应结果是什么?因为我只接收了前1024个字节,所以有一部分响应内容是看不到的。
b'HTTP/1.1 200 OK\r\n Date: Tue, 04 Apr 2017 16:22:35 GMT\r\n Server: Apache\r\n Expires: Thu, 19 Nov 1981 08:52:00 GMT\r\n Set-Cookie: PHPSESSID=66bea0a1f7cb572584745f9ce6984b7e; path=/\r\n Transfer-Encoding: chunked\r\n Content-Type: text/html; charset=UTF-8\r\n\r\n118d\r\n <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n\n <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n <head>\n\t <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" /> \n\t <meta http-equiv="content-language" content="en" />\n\t ... </html>
从结果来看,它与协议中规范的格式是一样的,第一行是响应行,状态码是200,表明请求成功。第二部分是响应首部信息,由多个首部组成,有服务器返回响应的时间,Cookie信息等等。第三部分就是真正的响应体 HTML 文本。
至此,你应该对 HTTP 协议有一个总体的认识了,爬虫的行为本质上就是模拟浏览器发送HTTP请求,所以要想在爬虫领域深耕细作,理解 HTTP 协议是必须的。
【相关推荐】
1. python爬虫入门(4)--详解HTML文本的解析库BeautifulSoup
2. python爬虫入门(3)--利用requests构建知乎API
3. python爬虫入门(2)--HTTP库requests
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!