Webcrawling

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

Hallo!

Könnte mir jemand bei folgender Aufgabe weiterhelfen:

Rufen Sie die Online-Version des Shanghai Rankings, der Top 500 Universitaten auf. Machen Sie sich
mit der Struktur der Webseite vertraut. Crawlen Sie die Webseite und extrahieren Sie Daten fur alle
Jahre, von 2003 bis 2014. Geben Sie an, welche Entscheidungen Sie jeweils bezuglich der drei Schritte
des Webcrawlings (seed,crawl frontier und policy ) getroen haben und begrunden Sie diese

Vielen Dank :)
BlackJack

@Padidem: Was ist denn jetzt das konkrete Problem?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Na klar, dass Vorgehen ist eigentlich ganz einfach, du musst nur folgendes tun:

Rufe die Online-Version des Shanghai Rankings, der Top 500 Universitaten auf. Mache dich
mit der Struktur der Webseite vertraut. Crawle die Webseite und extrahiere Daten fur alle
Jahre, von 2003 bis 2014. Gib an, welche Entscheidungen du jeweils bezuglich der drei Schritte
des Webcrawlings (seed,crawl frontier und policy ) getroen hast und begrunden diese.

Hier wird sicher keiner deine Aufgaben für dich erledigen. Wie lauten denn deine konkreten Fragen zum Problem? Wie sieht dein bisheriger Code aus? Was für Gedanken hast du dir schon gemacht und was hast du ausprobiert und das Problem zu lösen?
Das Leben ist wie ein Tennisball.
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

Das Problem ist dass ich die URL nicht öffnen kann mit:

Code: Alles auswählen

import urllib2
response = urllib2.urlopen('http://shanghairanking.com/de')
html = response.read()
kommt folgender Output:

Code: Alles auswählen

Traceback (most recent call last):

  File "<ipython-input-14-ee84a4abc301>", line 2, in <module>
    response = urllib2.urlopen(seed)

  File "C:\Users\User\Anaconda\lib\urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)

  File "C:\Users\User\Anaconda\lib\urllib2.py", line 404, in open
    response = self._open(req, data)

  File "C:\Users\User\Anaconda\lib\urllib2.py", line 422, in _open
    '_open', req)

  File "C:\Users\User\Anaconda\lib\urllib2.py", line 382, in _call_chain
    result = func(*args)

  File "C:\Users\User\Anaconda\lib\urllib2.py", line 1214, in http_open
    return self.do_open(httplib.HTTPConnection, req)

  File "C:\Users\User\Anaconda\lib\urllib2.py", line 1184, in do_open
    raise URLError(err)
URLError: <urlopen error [Errno 11004] getaddrinfo failed>
BlackJack

@Padidem: Das glaube ich kaum denn im Quelltext steht eine literale Zeichenkette und im Traceback steht der Name `seed`. Bitte keine Code/Traceback-Kombinationen die gar nicht zusammengehören.

Du könntest die URL mal im Browser ausprobieren. Zumindest bei mir funktioniert die auch dort nicht.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Dafür funktioniert bei mir im Browser http://www.shanghairanking.com.
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

Jup, die funktioniert bei mir auch. Und auch die URL vom Link zur deutschen Seite die auf dieser Webseite zu finden ist. :-)

Edit: @Padidem: Ich würde übrigens keine der beiden Seiten als Ausgangspunkt verwenden. Es gibt da eine Alternative die a) ”maschinenfreundlicher” ist und b) deutlich robuster ist was Änderungen am Websitedesign angeht (ein Grund für a)).
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

Ich habe mir gedacht die Aufgabe mit der pandas.read.html Funktion zu erledigen und die Tabellen einzeln auszulesen, aber wie verbinde ich das dann mit dem seed, crawl frontier und policy?

Also für 2011 z.B. :

Code: Alles auswählen

import urllib2
import pandas as pd
response = urllib2.urlopen('http://www.shanghairanking.com/ARWU2011.html')
html = response.read()
df = pd.read_html(html)
BlackJack

@Padidem: Bei `seed` kann ich ja noch raten was das sein soll, aber „crawl frontier” und „policy”!? Ich denke mal Du sollst die Links zu den Seiten mit den Jahren nicht hart im Programm vorgeben sondern aus einer anderen Seite extrahieren. Da bräuchte man dann einen HTML-Parser der nicht nur mit Tabellen funktioniert.
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

Kann mir jemand weiterhelfen?

Wie speichert man in Python Daten z.B. aus einer Tabelle (Pandas) in einem beliebigen Datenformat??

Danke
BlackJack

@Padidem: Die Frage ist jetzt nicht ernst gemeint oder? In einem *beliebigen* Datenformat? In dem man die entsprechenden Module verwendet für das *beliebige* Datenformat, und eventuell noch etwas (oder etwas mehr) eigenen Code ergänzt. Welche Module und welchen und wieviel eigener Code hängt davon ab welches *konkrete* Datenformat man in eine Datei schreiben möchte.
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

wenn ich meinen Datenframe über csv speichern will:

Code: Alles auswählen

df.to_csv(pandas_03, sep='\t') 
Kommt die Meldung:

AttributeError: 'list' object has no attribute 'to_csv'


Wie kann ich das beheben?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Padidem: Du hast keinen Datenframe, sondern eine Liste. Du hast also in Deinem Programm vorher etwas erzeugt, was Du nicht haben willst.
Antworten