Crawling - Homepage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Hallo zusammen,

versuche derzeit mein erstes Spider/Crawling Script zu schreiben und brauche eure Hilfe/Tipps bei einer Sache. Mein Ziel ist es ein Teil des Links rauszufiltern. Solle quasi das folgende Ergebnis bekommen:
/example/view.php?id=34

Das ist mein Code:

Code: Alles auswählen

import requests
from bs4 import BeautifulSoup

def trade_spider(max_pages): 

    page = 1
    while page <= max_pages:
        url = "example" + str(page)
        source_code = requests.get(url)
        plain_text = source_code.text
        soup = BeautifulSoup(plain_text)
        for link in soup.findALL("a", {"class": "featured-playlist-title"}):
            href = link.get("href")
            print(href)
        page += 1

trade_spider(1)

Aber leider erhalte ich die folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:/Users/Example/PycharmProjects/untitled/Example.py", line 19, in <module>
    trade_spider(1)
  File "C:/Users/Example/PycharmProjects/untitled/Example.py", line 14, in trade_spider
    for link in soup.findALL("a", {"class": "featured-playlist-title"}):
TypeError: 'NoneType' object is not callable

Könnt ihr mir Tipps geben, wie ich das Problem lösen kann? Danke für euer Feedback:)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Den Namen ``findALL`` wird es im Modul sicher nicht geben ;-) (Man muss schon auf Groß- und Kleinschreibung achten).

Du suchst in diesem Kontext eventuell auch die *Funktion* ``find_all`` - nicht die Methode aus BS3-Zeiten? Dein Import deutet darauf hin ;-)

Die ``while``-Schleife bestehend aus den Zeilen 6, 7 und 15 würde man besser in eine ``for``-Schleife umschreiben, da man die genaue Anzahl an Durchläufen a priori kennt. Das ist übrigens eine Fausregel: Ist von vornherein klar, wie oft man eine Schleife durchläuft, nutze ``for``! (Der Umkehrschluss ist dagegen ungültig: Es gibt durchaus Fälle, bei denen man ``for`` ebenfalls verwenden kann und sollte, wenn die Anzahl nicht bekannt ist!)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Danke für dein Feedback:)
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Der Name „source_code“ für das Objekt, das „requests.get“ dir zurückgibt, ist übrigens sinnlos, denn das, was du „plain_text“ nennst, ist der Source-Code, und das, was du „source_code“ nennst, ist ein requests.Response-Objekt.
Antworten