Fehler im Script?

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.
Marcellus
User
Beiträge: 18
Registriert: Mittwoch 30. Dezember 2015, 14:45

soweit passt alles, nur erhalte ich leider die Fehlermeldung:

ImportError: No module named 'bs4'

Code: Alles auswählen

from bs4 import BeautifulSoup
import requests

url = "http://www.heise.de/"

webpage = requests.get(url).text

soup = BeautifulSoup(webpage, "html.parser")

results = soup.find_all("h2")

for result in results:

	print(result.text.strip(" "))
	
	
import pprint
 
ergebnisse = []
 
results = ["http://www.ard.de", "http://www.zdf.de",
           "http://www.rtl.de", "http://www.disney.de"]
 
for i, result in enumerate(results):
 
    teilergebnis = []
 
    Lead nr = i + 1
    content = "Fahrrad"
    url = result
    cms = "Magento, JTL, Typo3"
    ranking = i
   
    teilergebnis = [Lead nr, content, url, cms, ranking]
   
    ergebnisse.append(teilergebnis)
 
 
pprint.pprint(ergebnisse)
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Nope, das passt noch nicht. Arbeite begleitend ein Tutorial zu Python zumindest ansatzweise durch.

Folgendes Problem: Du rufst wahrscheinlich Module auf, die Du zuvor nicht installiert hast. Das vermute ich ganz massiv, deshalb die Fehlermeldungen. Das sind Grundlagen und deshalb solltest Du dich an ein Tutorial machen.

Konkret zur Lösung:
http://docs.python-requests.org/en/late ... l/#install
http://www.crummy.com/software/BeautifulSoup/#Download

Ich setze immer voraus, dass Du Windows nutzt, weil ich das auch mache. In dem Fall startest Du die MS Eingabeaufforderung (Command Prompt) und gibst folgende 2 Sachen nacheinander ein und bestätigst jede Eingabe mit Enter.

Zeile 1:
pip install requests

Das installiert Dir requests, was Du brauchst und wahrscheinlich den nächsten Fehler geworfen hätte.

Zeile 2:
pip install BeautifulSoup

Das installiert Dir das bs4-Package.

Anschließend kannst Du das Skript noch mal versuchen und die Fehlermeldungen sollten nicht mehr auftauchen. Ich merke an, dass pip nach Bestätigen von Enter erst einmal arbeitet und Dir Sachen anzeigt. Das sollte aber fehlerfrei durchlaufen...
Marcellus
User
Beiträge: 18
Registriert: Mittwoch 30. Dezember 2015, 14:45

Ok. Tutorials habe ich mir heute fast den ganzen Tag rein gezogen :)

requests zu installieren war kein Problem, bei beautifulSoup habe ich noch Schwierigkeiten.

Ich habe es nun mehrere male versucht, anscheinend mache ich da noch was falsch..

[img][IMG]http://www.bilder-upload.eu/thumb/e248d6-1451664686.png[/img][/img]


----------
installation hat jetzt funktioniert. :)
Marcellus
User
Beiträge: 18
Registriert: Mittwoch 30. Dezember 2015, 14:45

Die Installation müsste jetzt richtig sein oder?

[img][IMG]http://www.bilder-upload.eu/thumb/21a896-1451665993.png[/img][/img]
BlackJack

Unter `site-packages` eine `setup.py` auszuführen sieht schon mal ziemlich falsch aus. In die Verzeichnishierarchie von Python selbst sollte man nichts von Hand kopieren (wenn man nicht genau weiss was man da tut) oder gar Archive entpacken um dann von dort Skripte zum Installieren zu starten.

BeautifulSoup 4 braucht auch noch eine Bibliothek um letztendlich das HTML zu parsen. Da es dort verschiedene Alternativen gibt, denke ich die muss man manuell installieren weil da keine als feste Abhängigkeit definiert sein dürfte. `lxml.html` wäre beispielsweise so eine Bibliothek die `bs4` zum Parsen verwenden kann.
Marcellus
User
Beiträge: 18
Registriert: Mittwoch 30. Dezember 2015, 14:45

ich hab alles nochmal platt gemacht und python neu installiert und dann erst requests über pip installiert und dann beauftifulsoup
[img][IMG]http://www.bilder-upload.eu/thumb/1ca4f7-1451667092.png[/img][/img]
nezzcarth
User
Beiträge: 1752
Registriert: Samstag 16. April 2011, 12:47

pixewakb hat geschrieben:Ich sage es mal so: Wahrscheinlich würde ich es neu programmieren, weil ich den Aufwand für gering halte.
Google findet automatisierte Abfragen nicht so gut und lässt diese nicht so ohne weiteres über sich ergehen (s.a. https://support.google.com/webmasters/answer/66357; das dürfte trotz der Rubrik wohl für Google allgemein gelten). Abgesehen davon, dass man gegen die Nutzungsbedingungen verstößt, wird Aufgabe daher weniger trivial sein, als sie klingt.
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Ich erinnere mich, dass ich darüber mal mit BlackJack hier "gesprochen" habe. Meine Datenquellen im Netz verbieten kaum etwas bzw. Unterseiten, die ich gar nicht suche, also die mich nicht interessieren.

Konkret: http://www.google.de/robots.txt

Was kann eigentlich bei einem unrechtmäßigen Parsen solcher Seiten passieren!? Würde mich interessieren. Teilweise als Fingerübung schreibe ich schon mal Software, um Webseiten abzufragen, ohne mich vorher in Sachen robots.txt kundig zu machen.
BlackJack

@pixewakb: Einfachster Fall wäre wenn die Server versuchen solche Zugriffe zu erkennen und zu blocken. Wenn man auf der Seite ein Benutzerkonto besitzt und der Betreiber einen als Übeltäter identifizieren kann, könnte das Konto gesperrt werden. Es könnte auch zu künstlichen Hindernissen für alle Benutzer kommen um Missbrauch zu vermeiden. Oder der Dienst stellt den Betrieb ein wenn es überhand nimmt.
nezzcarth
User
Beiträge: 1752
Registriert: Samstag 16. April 2011, 12:47

BlackJack hat geschrieben:@pixewakb: Einfachster Fall wäre wenn die Server versuchen solche Zugriffe zu erkennen und zu blocken.
Im konkreten Fall -- Google -- bekommt man Captchas vorgesetzt.
Marcellus
User
Beiträge: 18
Registriert: Mittwoch 30. Dezember 2015, 14:45

requests und beautiful soup sind installiert und laufen, auch das crawlen mit "h2" gab mir die entsprechende Ausgabe.

Code: Alles auswählen

from bs4 import BeautifulSoup
import requests
 
url = "http://www.zdf.de/"
 
webpage = requests.get(url).text
 
soup = BeautifulSoup(webpage, "html.parser")
 
results = soup.find_all("h2")
 
for result in results:
 
    print(result.text.strip(" "))
	

	
import pprint
 
ergebnisse = []
 
results = ["http://www.ard.de", "http://www.zdf.de",
           "http://www.rtl.de", "http://www.disney.de"]
 
for i, result in enumerate(results):
 
    teilergebnis = []
 
    nr = i + 1
    content = "Hose, blau"
    url = result
    cms = "Magento, JTL, Typo3"
    ranking = i
   
    teilergebnis = [nr, content, url, cms, ranking]
   
    ergebnisse.append(teilergebnis)
 
 
pprint.pprint(ergebnisse)

wie kann ich jetzt weitermachen? Kann mir jemand einen tip geben? Ich habe hier was sehr interessantes gefunden, bin mir aber noch viel zu unsicher es so wie er hier beschreibt anzugehen:

http://eliteinformatiker.de/2013/01/29/ ... mentieren/
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Du musst Dich mit den Grundlagen befassen, sonst wird das nichts. :evil:

Du kopierst meine Schnipsel zusammen, ohne sie sinnvoll zu verbinden.

Nur mal so am Rande: Ich sehe gerade das Problem, dass man den Google-Such-Link nicht einfach zusammenbasteln kann, d. h. Google packt da einiges rein. Ansonsten könntest Du mal grob beschreiben, was Du eigentlich brauchst.

Folgendes funktioniert bei mir im Browser:

https://www.google.de/search?q=python

https://www.google.de/search?q=python+crawler
Marcellus
User
Beiträge: 18
Registriert: Mittwoch 30. Dezember 2015, 14:45

sorry :) wollte Dich doch nicht ärgern. Die "Schnippsel" habe ich einfach nur zusammengefügt um nochmal darauf aufmerksam zu machen..

ja Grundlagen bin ich mit Tutorial videos dran.

Was ich brauche ist ein crawler der mit in einer csv datei oder xls CMS System, URL und das googlerank ausspuckt. wie gesagt, hat mir vor einigen jahren mal ein bekannter, der aber verstorben ist sowas gebastelt. und der funktioniert nicht mehr. Da ich aber hier nun nicht mehr groß weiter komme und ich Dich anscheinend auch noch verärgert habe, werde ich mich erstmal mit den Grundlagen beschäftigen und irgendwann eines Tages, vielleicht mal solch einen Crawler basteln. ich habe wirklich gedacht, das es schneller umsetzbar ist. Trotzdem vielen Dank für die hilfe bisher!
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Verärgert bin ich nicht, die Smileys sollte man nicht so ernst nehmen. Mein Eindruck ist allerdings, dass das so nichts werden kann. Mom. ich schaue mal.
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Das kann man so eigentlich kaum weitergeben, aber es ist ein Anfang und für mehr reicht die Zeit nicht. Du könntest mal schauen, ob es bei dir lauffähig ist. Was genau brauchst Du? Ich frage mal ganz doof, wie weit willst Du die Google Suche auswerten!? Du müsstest dann die Unterseiten nämlich auch noch durchsuchen.

Die Variablennamen dürften nicht akzeptabel sein, eigentlich gibt es zum Schreiben von csv-Dateien auch ein eigenes Modul...

Code: Alles auswählen

import requests
from bs4 import BeautifulSoup

suchwort = "Python crawler"

url = "https://www.google.de/search?q={}"

# URL zusammenbauen
google_url = url.format(suchwort.replace(" ", "+"))

# Seite abfragen
webpage = requests.get(google_url).text

soup = BeautifulSoup(webpage, "html.parser")

with open("webpage.txt", "w") as f:
    f.write(webpage)

"""
Text

Welcome to Python.org
https://www.python.org/ Diese Seite übersetzen
The official home of the Python Programming Language.
‎Download - ‎Python 3.4.3 - ‎Documentation - ‎Getting Started

HTML in Auswahl (scheint nicht (!) zu stimmen!!!)

<div class="rc" data-hveid="31">
<h3 class="r"><a href="[...] data-href="https://www.python.org/">Welcome to Python.org</a></h3>
<div class="s"><div><div class="f kv _SWb" style="white-space:nowrap">
<cite class="_Rm">https://www.<b>python</b>.org/</cite>
[...]
<span class="st">The official home of the <em>Python</em> Programming Language.</span>
[...]
"""

results = soup.find_all("li", attrs={"class": "g"})

ergebnisse = []

for i, result in enumerate(results):
    # print(result)

    print("Rang:", i+1)
    
    title = result.find("h3").find("a").text.replace("\n", "\t")
    print(title)

    """
    <span class="st">PyPI Version PyPI monthly downloads Wheel Status <b>Python</b> 3 Porting Status <br>
    Coverage report. Install the latest version of Scrapy. Scrapy 1.0. pip install scrapy.</br></span>
    """
    summary = result.find("span", attrs={"class": "st"}).text.replace("\n", "\t")
    print(summary)

    # input(">>>")
    ergebnisse.append([i+1, title, summary])
    
with open("ergebnisse.csv", "a") as f:
    for zeile in ergebnisse:
        f.write(";".join(map(str, zeile))+"\n")
Marcellus
User
Beiträge: 18
Registriert: Mittwoch 30. Dezember 2015, 14:45

eigentlich reicht die Startseite aus, denn das was ich suche ist auf der startseite meistens zu finden. Z.B. Magento oder Joomla steht ja im Quelltext drin. Was dann noch gesucht werden soll sind z.b. Farbe oder Produktname usw. diese Begriffe möchte ich mir dann gerne aussuchen und eintragen können.
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Damit hört es auf einfach zu sein ;) Du musst jetzt jede Zielseite wieder einzeln auswerten und die Daten zusammenstellen... Nicht so schön. Wie gut sind deine Programmierkenntnisse!?!?!?
Marcellus
User
Beiträge: 18
Registriert: Mittwoch 30. Dezember 2015, 14:45

:D Programmierkenntnisse? Naja, html grundkenntnisse habe ich, Python seit etwa 3 Tagen non stop video tutorials am reinziehen. ich würde sagen meine Programmierkenntnisse sind fast bei 0. Trotzdem verstehe ich mir bereits angeschauten Videos und bin auch hochmotiviert Python zu lernen. weniger wegen dem script was ich brauche, eher aus dem Interesse heraus. Trotzdem brauche ich natürlich diesen Crawler und so richtig wissen wie und woher die den bekomme, außer selber hinzusetzen, fällt mir nichts ein.
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

@pixewakb: Bei Query-Strings ist nicht nur das Leerzeichen ein Sonderzeichen. Deshalb gibt es ja sowas wie urllib.quote, oder man läßt das requests automatisch machen. Wenn man ab 1 Zählen will, dann kann man das enumerate auch gleich sagen «enumerate(results, 1)». Und für csv-Dateien gibt es ein Modul, das das besser kann.
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Bei mir hat gestern die Zeit zu mehr nicht gereicht und ab heute muss ich durcharbeiten, d. h. da werde ich es nicht unbedingt schaffen, das noch zu ändern. (Ich bitte um Verständnis!)

Aus meiner Sicht. Obiges Skript liefert dir für die ersten 10 Google-Treffer auch die Links zu den Webseiten. Du müsstest mal schauen, ob du damit weiterkommst. Letztlich müsstest Du dann die 10 URLs wieder - wie bei der Google-Seite - parsen, also noch mal eine Schleife durchlaufen. Einen Teil der Funktionalität kann man m. E. in eine Funktion packen und dann immer mal wieder aufrufen.

An die Shopsoftware kommst Du m. E. nur heran, wenn die das in dem Quelltext nicht herausgenommen haben.

Das steht meistens im meta-Tag generator, dazu:
http://www.web-consultant.at/joomla-cms ... -entfernen

Die meisten werden es wohl verbergen. Da kann man es trotzdem über verräterische id oder class-Elemente rausfischen, ist aber einiges zu programmieren.
Antworten