Heim  >  Artikel  >  Backend-Entwicklung  >  Python3, um einen lustigen Seitencrawler zu erstellen

Python3, um einen lustigen Seitencrawler zu erstellen

高洛峰
高洛峰Original
2017-02-14 13:37:001761Durchsuche

Die meisten Python-Tutorials im Internet sind Version 2.X. Viele Bibliotheken werden anders verwendet . Beispiel

0x01

Ich hatte während des Frühlingsfestes nichts zu tun (wie frei ich bin), also habe ich ein einfaches Programm geschrieben, um ein paar Witze zu machen und den Prozess des Programmschreibens aufzuzeichnen. Das erste Mal, dass ich mit Crawlern in Kontakt kam, war, als ich einen Beitrag wie diesen sah. Es war ein lustiger Beitrag über das Crawlen von Fotos von Mädchen auf Omelette. Also habe ich einfach selbst Fotos von Katzen und Tigern gemacht.

Technologie inspiriert die Zukunft. Wie kann man als Programmierer so etwas besser machen?

Python3, um einen lustigen Seitencrawler zu erstellen

0x02

Bevor wir die Ärmel hochkrempeln und loslegen, wollen wir etwas theoretisches Wissen bekannt machen.

Um es einfach auszudrücken: Wir müssen den Inhalt an einer bestimmten Stelle auf der Webseite herunterziehen. Wie müssen wir zuerst die Webseite analysieren, um zu sehen, welchen Inhalt wir haben? brauchen. Diesmal haben wir beispielsweise die Witze auf der urkomischen Website gecrawlt. Wenn wir die Witzeseite auf der urkomischen Website öffnen, können wir viele Witze sehen. Kommen Sie zurück und beruhigen Sie sich, nachdem Sie es gelesen haben. Wenn Sie so weiter lachen, können wir keinen Code schreiben. In Chrome öffnen wir Inspect Element und erweitern dann die HTML-Tags Ebene für Ebene oder klicken mit der kleinen Maus, um das benötigte Element zu finden.

Python3, um einen lustigen Seitencrawler zu erstellen

Schließlich können wir feststellen, dass der Inhalt in

der Witz ist, den wir brauchen . Wir können also alle

auf dieser Webseite finden und dann den darin enthaltenen Inhalt extrahieren, und schon sind wir fertig.

0x03

Okay, jetzt, da wir unser Ziel kennen, können wir die Ärmel hochkrempeln und loslegen. Ich verwende hier Python3. Über die Wahl von Python2 und Python3 kann jeder selbst entscheiden. Beide Funktionen können implementiert werden, es gibt jedoch einige geringfügige Unterschiede. Es wird jedoch weiterhin empfohlen, Python3 zu verwenden.
Wir möchten zuerst den Inhalt dieser Webseite abrufen gesamte Webseite.
Zuerst importieren wir urllib


Code kopieren Der Code lautet wie folgt:

urllib.request als Anfrage importieren

Dann können wir die Anfrage verwenden, um die Webseite abzurufen,


Kopieren Sie den Code Der Code lautet wie folgt:

def getHTML(url):
return request.urlopen(url).read()

Das Leben ist kurz, ich benutze Python, eine Codezeile, lade Webseiten herunter, hast du gesagt, da Es gibt keinen Grund, Python nicht zu verwenden.
Nach dem Herunterladen der Webseite müssen wir die Webseite analysieren, um die Elemente zu erhalten, die wir benötigen. Um Elemente zu analysieren, müssen wir ein anderes Tool namens Beautiful Soup verwenden. Damit können wir HTML und XML schnell analysieren und die benötigten Elemente abrufen.


Code kopieren Der Code lautet wie folgt:

soup = BeautifulSoup(getHTML("http://www.pengfu. com/xiaohua_1 .html"))

Die Verwendung von BeautifulSoup zum Parsen von Webseiten ist nur ein Satz, aber wenn Sie den Code ausführen, wird eine Warnung angezeigt, die Sie auffordert, einen Parser anzugeben. Andernfalls funktioniert es möglicherweise nicht auf anderen Plattformen oder Es wird ein Fehler im System gemeldet.


Code kopieren Der Code lautet wie folgt:

/Library/Frameworks/Python.framework/Versions/3.5/lib/ python3.5 /site-packages/bs4/__init__.py:181: UserWarning: Es wurde kein Parser explizit angegeben, daher verwende ich den besten verfügbaren HTML-Parser für dieses System („lxml“). Dies ist normalerweise kein Problem , aber wenn Sie diesen Code auf einem anderen System oder in einer anderen virtuellen Umgebung ausführen, verwendet er möglicherweise einen anderen Parser und verhält sich anders.

Der Code, der diese Warnung verursacht hat, befindet sich in Zeile 64 der Datei joke.py . Um diese Warnung zu entfernen, ändern Sie den Code, der so aussieht:

BeautifulSoup([Ihr Markup])

in diesen:

BeautifulSoup([Ihr Markup], "lxml" )

markup_type=markup_type))

Die Arten von Parsern und die Unterschiede zwischen verschiedenen Parsern werden in offiziellen Dokumenten ausführlich erläutert. Derzeit ist die Verwendung von lxml-Parsing zuverlässiger .
Nach der Änderung


Kopieren Sie den Code Der Code lautet wie folgt:

soup = BeautifulSoup(getHTML("http: //www. pengfu.com/xiaohua_1.html", 'lxml'))

Auf diese Weise entfällt die obige Warnung.


Code kopieren Der Code lautet wie folgt:

p_array = supple.find_all('p', {'class': "content- img clearfix pt10 relative"})

Verwenden Sie die Funktion find_all, um alle p-Tags der Klasse = content-img clearfix pt10 relative zu finden und dann dieses Array zu durchlaufen


Code kopieren Der Code lautet wie folgt:

für x in p_array: content = x.string

Auf diese Weise erhalten wir den Inhalt des Ziels P. An diesem Punkt haben wir unser Ziel erreicht und sind zu unserem Witz aufgestiegen.
Aber beim Crawlen auf die gleiche Weise wird ein solcher Fehler gemeldet


Kopieren Sie den Code Der Code lautet wie folgt:

Raise RemoteDisconnected("Remote-Ende geschlossene Verbindung ohne" http.client.RemoteDisconnected: Remote-Ende geschlossene Verbindung ohne Antwort

Es heißt, dass das Remote-Ende nicht antwortet, die Verbindung geschlossen und das Netzwerk überprüft hat und Es gibt kein Problem. Ist meine Haltung falsch? Es gibt keine Reaktion, wenn ich Charles öffne, um das Paket zu erfassen mit UA? Nachdem ich mir Charles angesehen hatte, stellte ich fest, dass der UA-Standard für mit urllib initiierte Anfragen Python-urllib/3.5 ist und beim Zugriff auf UA in Chrome User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3). ) AppleWebKit/537.36 (KHTML, wie Gecko) Chrome/56.0.2924.87 Safari/537.36, könnte es daran liegen, dass der Server den auf UA basierenden Python-Crawler ablehnt? Versuchen wir es unter einem Deckmantel und sehen, ob es funktioniert


Code kopieren Der Code lautet wie folgt:

def getHTML(url):

headers = {'User-Agent': 'User-Agent :Mozilla /5.0 (Macintosh; Intel Mac OS .urlopen(req).read()

Auf diese Weise wird Python als Chrome getarnt, um die Webseite von Qibai abzurufen, und die Daten können reibungslos abgerufen werden.

An diesem Punkt wird Python zum Crawlen von Qibaihe verwendet. Die Witze auf Pangbelly.com sind vorbei. Wir müssen nur die entsprechenden Webseiten analysieren, die Elemente finden, die uns interessieren, und die leistungsstarken Funktionen von Python nutzen Um unsere Ziele zu erreichen, können wir es mit einem Klick erledigen, ich werde nach ein paar Bildern von Mädchen suchen.

# -*- coding: utf-8 -*-
import sys
import urllib.request as request
from bs4 import BeautifulSoup

def getHTML(url):
  headers = {'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
  req = request.Request(url, headers=headers)
  return request.urlopen(req).read()

def get_pengfu_results(url):
  soup = BeautifulSoup(getHTML(url), 'lxml')
  return soup.find_all('p', {'class':"content-img clearfix pt10 relative"})

def get_pengfu_joke():
  for x in range(1, 2):
    url = 'http://www.pengfu.com/xiaohua_%d.html' % x
    for x in get_pengfu_results(url):
      content = x.string
      try:
        string = content.lstrip()
        print(string + '\n\n')
      except:
        continue
  return

def get_qiubai_results(url):
  soup = BeautifulSoup(getHTML(url), 'lxml')
  contents = soup.find_all('p', {'class':'content'})
  restlus = []
  for x in contents:
    str = x.find(&#39;span&#39;).getText(&#39;\n&#39;,&#39;<br/>&#39;)
    restlus.append(str)
  return restlus

def get_qiubai_joke():
  for x in range(1, 2):
    url = &#39;http://www.qiushibaike.com/8hr/page/%d/?s=4952526&#39; % x
    for x in get_qiubai_results(url):
      print(x + &#39;\n\n&#39;)
  return

if __name__ == &#39;__main__&#39;:
  get_pengfu_joke()
  get_qiubai_joke()
Weitere Python3-Produktionen für lustige Webseiten-Crawler und verwandte Artikel 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