PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Webservice, um Bücherdaten abzufragen


Gast2352
2010-03-08, 23:56:49
Ich suche einen Webservice, mit dem man Daten von Büchern abfragen kann.

Hintergrund: Ich bin Informatiker und großer Bücherfan (Fantasy). Ich habe schon sehr viel in Java und C/C++ gemacht, Skriptsprachen wie PHP oder Perl und der Einsatz im Internet gingen bisher an mir vorbei (bzw. konnte ich mich davor während meiner Ausbildung erfolgreich drücken ;)).
Da ich aber genau diese Wissenslücke nun aufholen will, habe ich vor, eine kleine Webseite zu machen, auf der man z.B. den Buchtitel eingibt und dann Erscheinungsdatum, Autor und dergleichen bekommt.

Das alles läuft dann lokal auf meinem PC und ist nur für mich gedacht, um damit Erfahrungen zu sammeln.

Leider scheint die API von Amazon kostenpflichtig zu sein. Kennt Ihr eine Alternative?

creave
2010-03-09, 00:22:08
Habe mal was ähnliches gemacht, auch via Amazon - ohne deren API.
Nimm einfach kurz das "erweiterte Suche"-Formular auseinander und schau dir an, was du per post get senden musst - isbn, titel oder oder..
Dann baust du dir noch einen Parser für die Antwort, ließt also das HTML der Suchergebnisse ein und fischst dir mittels Regex oder ähnlichem das raus, was du willst. Du nimmst natürlich den ersten Treffer des Suchergebnisses - das ist totsicher wenn du per isbn suchst, wenn du per Titeleingabe suchst aber auch noch ziemlich gut dank der Amazonsuche - per API wärst du da auch nicht genauer dran.



edit: Hier hast du kurz die Namen der relevanten Formularfelder.

Titel: field-title
ISBN: field-isbn (schluckt die 10stelligen als auch die neueren mit 13 Stellen)
Suchbegriffe: field-keywords

Wenn du die Genauigkeit erhöhen willst benutze zusätzlich: field-author, field-publisher

Absenden mit Adv-Srch-Books-Submit

Die aufzurufende Seite vermutlich /s/ref=nb_sb_noss, musst du probieren.


Die Trefferseite packt jedes einzelne Buch in ein <div class="result product" id="result_X" .......... </div> "Container", wobei das X für den Treffer steht. Für dich ist result_0 relevant. Rufe den Link auf. Auf der Produktseite stehen die relevanten Infos ab

<h2>Produktinformation</h2>
<div class="content">

abwärts.

Laz-Y
2010-03-13, 03:35:33
Ich habe diese Amazonabfrage jetzt mal versucht aber geschafft hab ich's nicht :( Ich habe davor aber auch noch nie was mit php gemacht.

Nachdem Skripte zusammenkopieren nicht das Wahre war habe ich nun mehr oder weniger ein eigenes geschrieben (mein erstes php-Skirpt!). Das ruft auch die Amazon-Suchseite auf und übergibt einen Suchbegriff und speichert das Ergebnis als HTML.
Zumindest sollte es so sein, gespeichert wird aber nur die Suchseite.

Ich weiß auch, wo das Problem liegt. Ich hab nämlich keine wirklich Ahnung, was ich machen muss ;).

Vielleicht könnt Ihr meine Fragen beantworten:
1. Woher weiß creave, dass man per GET und nicht per POST senden muss?
2. Ich stelle mir einen HTTP GET Header zusammen, den ich an den Host www.amazon.de sende. Woher weiß ich die URL, die ich nach dem GET benötige? Ist das "Erweiterte-Suche-Bücher/b?ie=UTF8&node=124535011"?
3. wie und wo muss ich die felder field-keywords, field-isbn, etc., die creave bereits rausgesucht hat, in das skript einbauen?

Ich hoffe die Fragen sind nicht zu blöd, ich habe wirklich noch nie was mit php gemacht :redface:

Hier mal das Skript:
<?php
printf("Start!\n");

// host, site and searchstring
$host = "www.amazon.de";
$path = "/Erweiterte-Suche-Bücher/b?ie=UTF8&node=124535011";
$referer = "www.amazon.de";
$suchstring = "Der Herr der Ringe";

// url öffnen und daten senden
$amazon_suche = fsockopen($host, 80);
printf("Open socket!\n");
fputs($amazon_suche, "GET $path HTTP/1.1\r\n");
fputs($amazon_suche, "Host: $host\r\n");
fputs($amazon_suche, "Referer: $referer\r\n");
fputs($amazon_suche, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($amazon_suche, "Content-length: ". strlen($suchstring) ."\r\n");
fputs($amazon_suche, "Connection: close\r\n\r\n");
printf($amazon_suche+"\n");
fputs($amazon_suche, $suchstring);
printf("Send data!\n");

// antwort entgegenehmen
while(!feof($amazon_suche)) {
printf("test\n");
$ergebnis .= fgets($amazon_suche, 128);
}
printf("Recieve data!\n");
fclose($amazon_suche);

// seite speichern
$file = fopen("test.html","w");
fputs($file, $ergebnis);
printf("Save file!\n");

printf("End!\n");

?>

Laz-Y
2010-03-13, 23:14:30
So, Frage 1 konnte ich mir nun selbst beantworten. Die Antwort steht ja im input-Tag :rolleyes:

Über Hilfe bei den anderen Fragen würde ich mich freuen!

DanMan
2010-03-24, 18:57:16
Führ einfach bei Amazon eine Suche durch und schau dir an wie dann die URI aussieht. Das Wichtigste ist der Parameter, der deinen Suchbegriff enthält.

Das schickst du dann an Amazon per GET. Dürfte einfacher sein, wenn du dafür curl (http://php.net/curl) nimmst, anstatt einen Socket zu öffnen und dir deinen Header von Hand zu bauen.

Was du dann zurück bekommst ist die komplette Seite, wie sie im Browser aussieht. Wenn du dort dann Inhalte extrahieren willst, dann musst du entweder mit regulären Ausdrücken und/oder einem XML-Parser weiterarbeiten.

edit: hab gerade das gefunden:
http://scripts.incutio.com/amazon/
http://a9.com/-/company/productsearch.jsp

Um die Amazon API zu benutzen brauchst du auf jeden Fall erst einen Account (http://aws.amazon.com/) bei denen.

Laz-Y
2010-03-24, 23:53:28
Danke DanMan für die Links. Werd mir das auf jedenfall noch durchlesen.
Habs jetzt aber auch bereits ohne curl oder Amazon-API geschafft.


Wie sieht es eigentlich rechtlich aus, wenn man für Menschen geschriebene Seiten maschinell verarbeitet? Ist das verboten, erlaubt oder eine Grauzone?

DanMan
2010-03-25, 22:32:48
Danke DanMan für die Links. Werd mir das auf jedenfall noch durchlesen.
Habs jetzt aber auch bereits ohne curl oder Amazon-API geschafft.


Wie sieht es eigentlich rechtlich aus, wenn man für Menschen geschriebene Seiten maschinell verarbeitet? Ist das verboten, erlaubt oder eine Grauzone?
Bittscheh. Würd mal sagen, dass das eine Grauzone ist. Auf einer Seite kanns eigentlich egal sein, weil ja öffentlich zugänglich. Auf der anderen gehörts schon jemandem irgendwie.