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.
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-Alive
dauerhafte Verbindung, Cookie
Dialog, SSL
Authentifizierung, 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 GET
Methode. Im Folgenden wird die GET
Methode zum Erstellen einer Basisanforderung verwendet.
Requests.get () -Methode
Durch den folgenden Code
r = requests.get(url)
#url是一个字符串型变量,保存了要请求资源的URL
Die Anforderungsbibliothek erstellt ein Request
Anforderungsobjekt, das Ressourcen vom Server anfordert , und das vom Befehl zurückgegebene Ergebnis ist ein Response
Antwortobjekt, das Serverressourcen enthältr
Vollständiges Verwendungsformat der Requests.get () -Methode
requests.get(url,params=None,**kwargs)
unter ihnen:
- url:
URL
Einheitlicher 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-1
falschen 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.encoding
tatsächlichen Betreff anpassen Codierung utf-8
zur 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
ConnectionError
bezieht sich auf die Ausnahmen, die auf der Netzwerk-TCP-Schicht generiert werden, wodurch die Beendigung des Programms erzwungen wird, währendHTTPError
auf die Ausnahmen verwiesen wird, die auf dem HTTP-Protokoll (Anwendungsschicht) generiert wurden, der Verwendungsmethoder.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_uri
Funktion 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. Nachtry-except
der 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
Method
Für den angegebenen Methodennamenurl
Einheitliche Kennung für die angeforderte Zielressource**kwargs
Fü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方法将data
和json
参数单独列出,分别表示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.