Heim  >  Artikel  >  Backend-Entwicklung  >  Erste Schritte mit Python-Crawlern (1) – Verstehen Sie schnell das HTTP-Protokoll

Erste Schritte mit Python-Crawlern (1) – Verstehen Sie schnell das HTTP-Protokoll

零下一度
零下一度Original
2017-05-27 11:36:241457Durchsuche

Das http-Protokoll ist eines der wichtigsten und grundlegendsten Protokolle im Internet. Unsere Crawler müssen sich häufig mit dem http-Protokoll befassen. Der folgende Artikel stellt Ihnen hauptsächlich die relevanten Informationen zu Python Erste Schritte mit Crawler vor, um das HTTP-Protokoll schnell zu verstehen. Freunde, die es benötigen, können sich darauf beziehen Lasst uns gemeinsam einen Blick darauf werfen.

Vorwort

Das Grundprinzip des Crawlers besteht darin, den Browser zu simulieren, um HTTP-Anfragen zu stellen Grundlage für das Schreiben von Crawlern: In der Crawler-Position auf der Rekrutierungswebsite heißt es auch eindeutig, dass Sie die HTTP-Protokollspezifikationen beherrschen. Beim Schreiben eines Crawlers müssen Sie mit dem HTTP-Protokoll beginnen >Was ist das HTTP-Protokoll?

Jede Webseite, die Sie durchsuchen, wird auf Basis des HTTP-Protokolls dargestellt. Das HTTP-Protokoll ist ein Protokoll für die Datenkommunikation zwischen dem Client (Browser) und dem Server in Internetanwendungen. Das Protokoll legt das Format fest, in dem der Client Anfragen an den Server senden soll, und legt außerdem das Format der vom Server zurückgegebenen Antwort fest. Solange jeder gemäß dem Protokoll Anforderungen initiiert und Antwortergebnisse zurückgibt, kann jeder seinen eigenen Web-Client (Browser, Crawler) und Webserver (Nginx, Apache usw.) basierend auf dem HTTP-Protokoll implementieren .

Das HTTP-Protokoll selbst ist sehr einfach. Es legt fest, dass der Client nur aktiv Anfragen initiieren kann und der Server das Antwortergebnis zurückgibt, nachdem er die Anfrage empfangen und verarbeitet hat. Gleichzeitig ist HTTP ein Protokoll ohne

Status

und das Protokoll selbst nicht Zeichnen Sie die historischen Anfragedatensätze des Kunden auf.

Wie legt das HTTP-Protokoll das Anforderungsformat und das Antwortformat fest? Mit anderen Worten: In welchem ​​Format kann der Client eine HTTP-Anfrage korrekt initiieren? In welchem ​​Format gibt der Server das Antwortergebnis zurück, damit der Client es korrekt analysieren kann?

HTTP-Anfrage

HTTP-Anfrage besteht aus 3 gruppierten Teilen, nämlich Anfragezeile, Anfrageheader und Anfrage body , der Header und der Anfragetext sind optional und nicht für jede Anfrage erforderlich.

Anfragezeile

Die Anfragezeile ist ein wesentlicher Bestandteil jeder Anfrage, sie besteht aus 3 Es besteht aus Teilen, nämlich Anfragemethode (Methode), Anfrage-URL (URI) und HTTP-Protokollversion, getrennt durch Leerzeichen.

Die am häufigsten verwendeten Anforderungsmethoden im HTTP-Protokoll sind: GET, POST, PUT, DELETE. Die GET-Methode wird verwendet, um Ressourcen vom Server abzurufen, und 90 % der Crawler crawlen Daten basierend auf GET-Anfragen.

Die Anforderungs-URL bezieht sich auf die Pfadadresse des Servers, auf dem sich die Ressource befindet. Das obige Beispiel zeigt beispielsweise an, dass der Client die Ressource index.html abrufen möchte und sich ihr Pfad im Stammverzeichnis befindet (/) des Servers foofish.net.

Anfrage-Header

Da die Menge der in der Anfragezeile enthaltenen Informationen sehr begrenzt ist, hat der Kunde dem noch viel zu sagen Server-Dinge müssen im Anforderungsheader (Header) platziert werden. Der Anforderungsheader wird verwendet, um dem Server einige zusätzliche Informationen bereitzustellen. Beispielsweise wird User-Agent verwendet, um die Identität des Clients anzugeben und dem Server mitzuteilen, ob der Die Anfrage kommt von einem Browser oder einem Crawler oder von Chrome. Der Browser ist immer noch Firefox. HTTP/1.1 spezifiziert 47 Header-Feldtypen. Das Format des HTTP-Header-Felds ist dem Wörterbuchtyp in Python sehr ähnlich und besteht aus durch Doppelpunkte getrennten Schlüssel-Wert-Paaren. Zum Beispiel:

Denn wenn der Client eine Anfrage sendet, bestehen die gesendeten Daten (Nachricht) aus einer Zeichenfolge, um das Ende des Anfrageheaders und den Anfang des Anfragetextes zu unterscheiden. Zur Darstellung wird eine Leerzeile verwendet. Wenn eine Leerzeile angetroffen wird, bedeutet dies, dass dies das Ende des Headers und der Anfang des Anforderungstexts ist.

User-Agent: Mozilla/5.0

Anforderungstext

Der Anforderungstext ist der tatsächliche Inhalt, der vom Client an den Server übermittelt wird, z. B. der Benutzername und das Passwort, die erforderlich sind, wenn der Benutzer meldet sich an. Zum Beispiel Daten zum Hochladen von Dateien, z. B. Formularinformationen, die bei der Registrierung von Benutzerinformationen übermittelt werden. Jetzt verwenden wir das von Python bereitgestellte Original-API-Socket-Modul, um eine HTTP-Anfrage an den Server zu simulieren

HTTP-Antwort
with 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)

Nachdem der Server die Anfrage empfangen und verarbeitet hat, gibt er den Antwortinhalt an den Client zurück. Ebenso muss der Antwortinhalt einem festen Format folgen, damit der Browser ihn korrekt analysieren kann. Die HTTP-Antwort besteht ebenfalls aus drei Teilen: Antwortzeile, Antwortheader und Antworttext, die dem HTTP-Anforderungsformat entsprechen.

响应行

响应行同样也是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

4.  总结Python的逻辑运算符and

Das obige ist der detaillierte Inhalt vonErste Schritte mit Python-Crawlern (1) – Verstehen Sie schnell das HTTP-Protokoll. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn