Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Diskussion über die Codierungsverarbeitung von Python-Crawling-Webseiten

Eine kurze Diskussion über die Codierungsverarbeitung von Python-Crawling-Webseiten

高洛峰
高洛峰Original
2017-02-22 11:13:222314Durchsuche

Hintergrund

Während des Mittherbstfestes schickte mir ein Freund eine E-Mail, in der er mir mitteilte, dass er beim Besteigen von Lianjia festgestellt habe, dass die Codes vom Internet zurückgegeben wurden Er hat mich gebeten, ihm mit seinem Rat zu helfen (ich mache Überstunden während des Mittherbstfestes, also bin ich schon sehr früh auf dieses Problem gestoßen, als ich es gelesen habe). Ich habe Romane gelesen, aber ich habe es nicht ernst genommen. Tatsächlich ist dieses Problem richtig. Verursacht durch mangelndes Verständnis der Codierung.

Problem

Ein sehr häufiger Crawler-Code, der Code sieht so aus:

# ecoding=utf-8
import re
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf8')

url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/'
res = requests.get(url)
print res.text

Der Zweck ist eigentlich sehr einfach, nämlich den Inhalt von Lianjia zu crawlen. Nach der Ausführung werden jedoch die zurückgegebenen Ergebnisse, einschließlich aller Inhalte mit Chinesisch, verstümmelt, wie beispielsweise dieser

Eine kurze Diskussion über die Codierungsverarbeitung von Python-Crawling-Webseiten

<script type="text/template" id="newAddHouseTpl">
 <p class="newAddHouse">
  自从您上次浏览(<%=time%>ï¼‰ä¹‹åŽï¼Œè¯¥æœç´¢æ¡ä»¶ä¸‹æ–°å¢žåŠ äº†<%=count%>套房源
  <a href="<%=url%>" class="LOGNEWERSHOUFANGSHOW" <%=logText%>><%=linkText%></a>
  <span class="newHouseRightClose">x</span>
 </p>
</script>

Solche Daten sind nutzlos.

Problemanalyse

Das Problem hier ist offensichtlich, das heißt, die Kodierung des Textes ist falsch, was zu verstümmelten Zeichen führt.

Codierung der Webseite anzeigen

Dem Header der gecrawlten Zielwebseite nach zu urteilen, ist die Webseite mit utf-8 codiert.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Also müssen wir utf-8 für die endgültige Codierung verwenden, also für die endgültige Textverarbeitung. Verwenden Sie utf- 8 zum Dekodieren, das heißt: decode('utf-8')

Textkodierung und -dekodierung

Python-Kodierung Der Dekodierungsprozess ist wie folgt Dies. Quelldatei ===》 kodieren (Kodierungsmethode) ===》dekodieren (Dekodierungsmethode) Es wird weitgehend nicht empfohlen,

import sys
reload(sys)
sys.setdefaultencoding(&#39;utf8&#39;)

Auf diese Weise wird die Textkodierung hart verarbeitet. Faulheit ist jedoch kein großes Problem, wenn sie zu bestimmten Zeiten keine Auswirkungen hat. Es wird jedoch empfohlen, den Text nach Erhalt der Quelldatei mit Kodierung und Dekodierung zu verarbeiten.

Zurück zum Problem

Das größte Problem ist jetzt die Kodierungsmethode der Quelldatei, wenn wir Anfragen normal verwenden Erraten Sie die Quelle. Die Kodierungsmethode der Datei wird dann in die Unicode-Kodierung umgewandelt. Schließlich handelt es sich jedoch um ein Programm und es ist möglich, falsch zu raten. Wenn wir also falsch raten, müssen wir die Kodierungsmethode manuell angeben. Das offizielle Dokument beschreibt es wie folgt:

Wenn Sie eine Anfrage stellen, macht Requests fundierte Vermutungen über die Kodierung der Antwort basierend auf den HTTP-Headern. Die von Requests erratene Textkodierung wird verwendet, wenn Sie auf r.text zugreifen . Mit der Eigenschaft r.encoding können Sie herausfinden, welche Codierung Requests verwendet, und diese ändern.

Wir müssen also überprüfen, welche Codierungsmethode von Anfragen zurückgegeben wird?

# ecoding=utf-8
import re
import requests
from bs4 import BeautifulSoup
import sys
reload(sys)
sys.setdefaultencoding(&#39;utf8&#39;)

url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/'

res = requests.get(url)
print res.encoding

Die gedruckten Ergebnisse lauten wie folgt:

ISO-8859-1

Mit anderen Worten: Die Quelldatei ist mit ISO-8859-1 kodiert. Baidu hat nach ISO-8859-1 gesucht und die Ergebnisse sind wie folgt:

ISO8859-1, normalerweise als Latin-1 bezeichnet. Latin-1 enthält zusätzliche Zeichen, die für das Schreiben aller westeuropäischen Sprachen unverzichtbar sind.

Problem gelöst

Nachdem Sie dieses Problem entdeckt haben, lässt sich das Problem leicht lösen. Geben Sie einfach die Kodierung an und Sie können Chinesisch richtig eingeben. Der Code lautet wie folgt:


# ecoding=utf-8
import requests
import sys
reload(sys)
sys.setdefaultencoding(&#39;utf8&#39;)

url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/'

res = requests.get(url)
res.encoding = ('utf8')

print res.text

Das gedruckte Ergebnis ist offensichtlich und die chinesischen Schriftzeichen werden korrekt angezeigt.

Eine kurze Diskussion über die Codierungsverarbeitung von Python-Crawling-Webseiten

Eine andere Möglichkeit besteht darin, die Quelldatei zu dekodieren und zu kodieren. Der Code lautet wie folgt:

# ecoding=utf-8
import requests
import sys
reload(sys)
sys.setdefaultencoding(&#39;utf8&#39;)

url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/'

res = requests.get(url)
# res.encoding = ('utf8')

print res.text.encode('ISO-8859-1').decode('utf-8')

Anderes: ISO-8859-1 wird auch als Latin1 bezeichnet und es ist normal, Latin1 zum Dekodieren von Ergebnissen zu verwenden.

Es gibt viel zu sagen über die Zeichenkodierung. Freunde, die mehr wissen möchten, können sich auf die folgenden Informationen beziehen.

•„Das absolute Minimum, das jeder Softwareentwickler unbedingt über Unicode und Zeichensätze wissen muss (keine Ausreden!)“

Der obige Artikel geht kurz auf die Codierungsverarbeitung von Python-Crawling-Webseiten ein. Ich habe den gesamten mit Ihnen geteilten Inhalt zusammengestellt und hoffe, dass er Ihnen als Referenz dient. Ich hoffe auch, dass Sie die chinesische PHP-Website unterstützen.

Weitere Artikel zum Codieren und Verarbeiten von Crawling-Webseiten mit Python finden Sie auf der chinesischen PHP-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