Python-Webcrawler von 0 bis 1 (1): Detaillierte Einführung in die Requests-Bibliothek

  In Webcrawlern sind Webanfragen der grundlegende Teil. Ohne Netzwerkanforderungen und -antworten verliert die nachfolgende Datenanalyse des Webcrawlers ihre Bedeutung. Netzwerkanforderungen in Python werden hauptsächlich von der Anforderungsbibliothek ausgeführt. In diesem Artikel werfen wir einen Blick auf die Anforderungsbibliothek und ihre grundlegende Verwendung.

Erste Schritte mit Anfragen

Einführung in die Anforderungsbibliothek

  Die Requests-Bibliothek ist eine übersichtliche und elegante Python-Bibliothek von Drittanbietern, die besser zu den Nutzungsgewohnheiten der Benutzer passt. Daher ist die Requests-Bibliothek in der http-Bibliothek bei Entwicklern sehr beliebt. Die Anforderungsbibliothek unterstützt viele Funktionen, die heute verwendet werden, wie z. B. Keep-Alivedauerhafte Verbindung, CookieDialog, SSLAuthentifizierung, dynamische Dekodierung, HTTP(S)Proxy-Unterstützung, Streaming-Download und Hochladen von Dateiblöcken. Weitere Funktionseinführungen und Dokumentationen finden Sie in der offiziellen Dokumentation. Anfragen: HTTP für Menschen

 Installation der Requests-Bibliothek

pip install requests

 Die Hauptmethoden der Requests-Bibliothek

Die Anforderungsbibliothek verfügt hauptsächlich über 7 Methoden, von HTTP(S)denen die meisten mit den Anforderungsmethoden im Protokoll identisch sind

Methode Beschreibung
request.request () Erstellen Sie eine Anforderung zur Unterstützung der folgenden Methoden
request.get () Die Methode zum Abrufen von Ressourcen ist dieselbe wie bei HTTP GET
request.head () Die Methode zum Abrufen von Ressourcenantwort-Header-Informationen ist dieselbe wie bei HTTP HEAD
request.post () Die Methode zum Senden einer Post-Anfrage an die Website entspricht der von HTTP POST
request.put () Die Methode zum Senden einer Put-Anfrage an die Website entspricht der von HTTP PUT
request.patch () Senden Sie eine teilweise Patch-Änderungsanforderung an die Website, genau wie bei HTTP PATCH
request.delete () Senden Sie eine Anforderung zum Löschen von Ressourcen an die Website, genau wie bei HTTP DELETE
  • Darüber hinaus werden auch andere HTTP-Methodenanforderungsbibliotheken unterstützt, da sie nicht häufig verwendet werden und nicht einzeln aufgelistet werden.

  • Tatsächlich werden alle anderen Methoden von der requests.request()zu erreichenden Basismethode aufgerufen


Verwenden Sie die Anforderungsbibliothek, um eine Basisanforderung zu erstellen

  Die am häufigsten verwendete Anforderungsmethode beim Zugriff auf Webseiten ist die GETMethode. Im Folgenden wird die GETMethode zum Erstellen einer Basisanforderung verwendet.

 Requests.get () -Methode

Durch den folgenden Code

r = requests.get(url)
#url是一个字符串型变量,保存了要请求资源的URL

Die Anforderungsbibliothek erstellt ein RequestAnforderungsobjekt, das Ressourcen vom Server anfordert , und das vom Befehl zurückgegebene Ergebnis ist ein ResponseAntwortobjekt, das Serverressourcen enthältr

Vollständiges Verwendungsformat der Requests.get () -Methode

requests.get(url,params=None,**kwargs)

unter ihnen:

  • url: URLEinheitlicher Ressourcen-Locator der Ressource, die Sie anfordern möchten
  • Parameter: Optional, Standard ist Keine. Dies bedeutet zusätzliche Parameter in der URL, die im Wörterbuch- oder Byte-Stream-Format vorliegen können.
  • ** kwargs: Optional, 12 Parameter zur Zugriffssteuerung, siehe unten

Tatsächlich ruft die request.get () -Methode die request.request () -Methode auf. Der Code vor der Kapselung lautet wie folgt

requests.request('get',url,params=params,**kwargs)

Die Methode get listet den Parameter params als Schlüsselwortparameter mit Standardparametern auf. Daher verfügt die Methode request.request () über 13 Parameter (einschließlich Parameter), die in einem Wörterbuch gelesen werden.

 Antwortobjekt

Die obige Anforderung gibt ein Antwortobjekt zurück, das die vom Server zurückgegebenen ressourcenbezogenen Informationen enthält und hauptsächlich die folgenden Attribute aufweist

Attribute Beschreibung
r.status_code Die HTTP-Anforderung gibt den Statuscode zurück
r.text Inhalt der HTTP-Antwort (Zeichenfolgenform)
r.encoding Die aus dem HTTP-Header erhaltene Antwortkörper-Codierungsmethode ist auch die aktuelle Entitätscodierungsmethode (kann auch später konfiguriert werden).
r.apparent_encoding Aus dem Antworttext analysierte Codierungsmethode (optional)
Inhalt Binäre Form des HTTP-Antwortinhalts

 Verwenden Sie die get-Methode, um die Anforderung zu erstellen

Anhand eines Beispiels wird veranschaulicht, wie mit der request.get () -Methode eine get-Anforderung erstellt wird, wobei als Beispiel der Zugriff auf Baidu verwendet wird

r = requests.get("https://www.baidu.com")

Zeigen Sie die Codierungsinformationen des Antwortobjekts an

#每一行后的注释内容为返回值
r.encoding
#'ISO-8859-1'
r.apparent_encoding
#'utf-8'

In der Tat müssen Sie aufgrund des ISO-8859-1falschen Codierungsformats für den Antwortheaderfeldkörper (tatsächlich ist das Codierungsformat für den Antwortheader nicht angegeben, das Standardformat ist falsch) (nicht korrekt auf Chinesisch angezeigt) Ihren r.encodingtatsächlichen Betreff anpassen Codierung utf-8zur korrekten Anzeige von Chinesisch

Nachdem das Codierungsformat des Körpers korrekt eingestellt wurde, kann der Körperinhalt der Antwort korrekt erhalten werden, und die Antwortkopfinformationen können auch erhalten werden.


Allgemeines Code-Framework zum Crawlen von Webseiten

  Das Universal Code Framework ist ein Teil des Universal Codes, der zum Crawlen von Webseiten verwendet wird. Durch Anpassen des Universal Code Framework zum Crawlen von Webseiten kann der Inhalt der Webseite zuverlässig und flexibel gecrawlt werden, und es können auch Links zu anderen Seiten abgerufen werden. Es ist unvermeidlich, dass eine Ausnahme ausgelöst wird, wenn die request.get () -Methode für den Zugriff auf eine Webseite verwendet wird. Sie müssen daher die Ausnahmeinformationen und Behandlungsmethoden der Requests-Bibliothek verstehen, bevor Sie das allgemeine Code-Framework kennenlernen.

 Fordert die Behandlung von Bibliotheksausnahmen an

  Wenn Sie die Anforderungsbibliothek zum Senden von Anforderungen verwenden, erhalten Sie möglicherweise verschiedene Ausnahmen von verschiedenen Links. Wenn Sie diese nicht verarbeiten, wird das Programm möglicherweise abnormal beendet. Das Erkennen und Behandeln von Ausnahmen ist daher ein notwendiges Glied bei der Crawler-Entwicklung.

abnormal Beschreibung
request.ConnectionError Netzwerkverbindungsfehler, z. B. keine Verbindung herstellen können, DNS-Auflösungsfehler, verweigerte Verbindung (Nicht-4xx-Antwortcode) usw.
request.HTTPError HTTP-Fehlerausnahme (muss manuell ausgelöst werden, siehe Hinweis)
request.URLRequired Fehlende URL-Ausnahme
Anfragen.TooManyRedirects Die Umleitung der Antwort überschreitet den Schwellenwert und es tritt eine Umleitungsausnahme auf
Anfragen.ConnectTimeout Timeout-Ausnahme für Serververbindung
Anfragen.Timeout Anforderungszeitlimit (Zeitlimit ohne Verbindung bezieht sich auf das Zeitlimit der Anforderungsphase nach der Verbindung)
  • Unter diesen ConnectionErrorbezieht sich auf die Ausnahmen, die auf der Netzwerk-TCP-Schicht generiert werden, wodurch die Beendigung des Programms erzwungen wird, während HTTPErrorauf die Ausnahmen verwiesen wird, die auf dem HTTP-Protokoll (Anwendungsschicht) generiert wurden, der Verwendungsmethode r.raise_for_status()zum manuellen Auslösen einer Ausnahme, solange der Rückkehrcode nicht 200 ist. Dies wird ausgelöst abnormal.

 Gemeinsames Code-Framework

import requests


def get_uri(url):
    try:
        r = requests.get(url, allow_redirects=False)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "An error has been thrown"


print("Requests.get Skeleton")
print(get_uri("http://192.168.0.6:8080/a"))

  • Die get_uriFunktion im Beispiel ist ein einfaches allgemeines Crawler-Code-Framework, das gekapselt ist
  • Im Beispiel hat der Server einen 404-Fehler zurückgegeben, der von der raise_for_status()Methode abgefangen wurde . Wenn die URL im Beispiel in einen nicht vorhandenen Server oder eine unzulässige URL geändert wurde, wird der Fehler direkt ohne die Anweisung ausgelöst. Nach try-exceptder Ausnahmeerfassung der Anweisung wird das Programm nicht beendet, aber die Fehleraufforderung und die Verarbeitung im nächsten Schritt können ausgeführt werden.
  • Wenn die URL im Beispiel in eine echte URL geändert wird, wird der Quellcode der Webseite direkt ausgegeben, der durch weitere Vorgänge analysiert und verarbeitet werden kann.
  • Eine genauere Definition der Erfassungsbedingung der Ausnahme-Anweisung kann unterschiedliche Fehler unterscheiden, um unterschiedliche Lösungen für unterschiedliche Fehler anzupassen

Verwendung der Hauptmethoden der Requests-Bibliothek

 Grundlegende Anforderungsmethoden und -parameter

Stellen Sie zunächst die grundlegende Methode der Requests library-Requests.request () -Methode vor. Die anderen Hauptanforderungsmethoden in der Requests-Bibliothek werden alle durch Aufrufen der Requests.request () -Methode ausgeführt.

requests.request('Method', url, **kwargs)

unter ihnen

  • MethodFür den angegebenen Methodennamen
  • urlEinheitliche Kennung für die angeforderte Zielressource
  • **kwargsFür die zusätzlichen Parameter der Anforderung sind alle anderen auf request.request () basierenden Methodenparameter identisch. Einige Methoden definieren möglicherweise einige allgemeine Parameter explizit als Schlüsselwortparameter, was keine wesentlichen Auswirkungen hat
Parameter Beschreibung
params Als Parameter zum zu besuchenden URL-Link hinzufügen
Daten Als Betreff der Anforderungsnachricht wird sie als Formular gesendet, das ein Wörterbuch, ein Tupel usw. sein kann.
json Fordern Sie Nachrichteninhalte im JSON-Format an
Überschriften Häufiger verwendet, definiert es die Anforderungsheaderparameter der Anforderungsnachricht, die ein Wörterbuch sein kann
Kekse Die Cookie-Informationen in der HTTP-Anforderung können ein Wörterbuch, CookieJar oder Cookie in der Anforderung sein
auth Wird für die HTTP-Protokollauthentifizierung als Tupel verwendet
Dateien Der Hauptteil der Anforderungsnachricht (in Form einer Datei) ist ein Wörterbuch, und der Schlüssel des Wörterbuchs ist eine Dateitypvariable
Auszeit Stellen Sie das Zeitlimit für die Anforderung in Sekunden ein
Proxies Legen Sie den Proxy-Server, auf den zugegriffen werden soll, ein Wörterbuch und einen Proxy-Server für das Protokoll fest
allow_redirects Umleitung zulassen, boolescher Typ, Standardwert True, Umleitung zulassen
Strom 流下载(获取内容立即下载),boolean型,默认True,允许流下载
verify SSL认证证书开关,默认True,使用SSL认证证书
cert 本地的SSL证书路径
  • 注意:data参数是将参数加入Request报文中,而params参数是将参数加入要访问的url链接中。比如,params={‘a’: 1},url='https://www.baidu.com/',最后请求生成的url为'https://www.baidu.com/?a=1'

  • headers是一个常用参数,用于定义请求报文的头部信息,接受字典形式的数据。如果未经定义,会输出默认参数

    {
          
          'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
    
  • files参数示例

    files = {
          
          'file1': open('data.xls', 'rb')}
    r = requests.post{
          
          'https://192.168.0.6:8080/post', files=files}
    
  • proxies示例

    proxies = {
          
          'http': 'http://192.168.0.4',
              'https': 'https://192.168.0.5'}
    

关于get方法,上文已经做过讲解,本段中不再重复赘述,下面介绍一些其他的requests库方法

 Requests.post()方法

Requests.post()方法通过HTTP协议的post方法向服务器传递数据,关于HTTP中的post方法请读者自行了解,下面仅介绍Requests.post()方法的具体使用

post方法的封装

def post(url, data=None, json=None, **kwargs):
    r"""Sends a POST request.

    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
        object to send in the body of the :class:`Request`.
    :param json: (optional) json data to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response
    """

    return request('post', url, data=data, json=json, **kwargs)

可以看到,post方法将datajson参数单独列出,分别表示post请求主体内容(以web表单形式编码)和以json格式编码的主体内容。以web表单形式编码的条件为data是一个字典;如果想要发送未经编码的数据(不要默认web表单编码),则直接以字符串作为data

下面三个示例分别用web表单格式、json格式和****作为post方法的请求主体,后附服务器收到信息(节选)

payload = {
    
    'b': 2}
r = requests.post("http://192.168.0.6:8080/post", data=payload)

import json
payload = {
    
    'b': 2}
r = requests.post("http://192.168.0.6:8080/post", json=json.dumps(payload))

r = requests.post("http://192.168.0.6:8080/post", data="b=2")

{
    
    "args":{
    
    },"data":"\"{\\\"b\\\": 2}\"","files":{
    
    },"form":{
    
    },"headers":{
    
    "Content-Length":"12","Content-Type":"application/json"},"json":"{\"b\": 2}",}

{
    
    "args":{
    
    },"data":"","form":{
    
    "b":"2"},"headers":{
    
    "Content-Length":"3","Content-Type":"application/x-www-form-urlencoded"},"json":null}

{
    
    "data":"b=2","headers":{
    
    "Content-Length":"3"},"json":null}
  • 在发送未经编码的请求实体时,首部字段中不存在Content-Type

    如果以元组作为data,将同样以web表单形式编码,但是如果当个元组使用同一个key的时候,使用元组可以避免字典中键名称重复的问题

payload = (('b', 1), ('b', 2))
r = requests.post("http://192.168.0.6:8080/post", data=payload)

#下面是服务器收到的主体内容
"form":{
    
    "b":["1","2"]}

 Requests.put()方法

Die put-Methode im HTTP-Protokoll ähnelt im Wesentlichen der post-Methode, außer dass die Originaldaten unter der URL überschrieben werden, wenn die put-Methode verwendet wird, während die post-Methode nur neue Daten hinzufügt. Das Format der beiden Methoden in der Requests-Bibliothek ist fast identisch, daher werde ich sie hier nicht wiederholen.

 Requests.patch () -Methode

Ähnlich wie bei der Patch-Methode im HTTP-Protokoll ähnelt die Verwendung Requests.put (). Der Unterschied besteht darin, dass der Patch nur einen Teil der Daten bereitstellt, die geändert werden müssen, während put alle Daten unter der URL senden muss.

 Requests.delete () -Methode

Ähnlich wie bei der Löschmethode im HTTP-Protokoll müssen möglicherweise Authentifizierungsinformationen zu den Anforderungsparametern hinzugefügt werden, um den Server zum Löschen der durch die URL angegebenen Ressource aufzufordern.

 Requests.head () -Methode

Ähnlich wie bei der head-Methode im HTTP-Protokoll ähnelt die Verwendung der Requests.get () -Methode, außer dass die zurückgegebene Nachricht nur die Header-Informationen und keinen Text enthält.

Ich denke du magst

Origin blog.csdn.net/Zheng__Huang/article/details/108567203
Empfohlen
Rangfolge