Closed repat closed 9 years ago
https://stackoverflow.com/questions/7336814/problems-with-web-site-scraping-using-zombie-js
Vielleicht können wir die HTTP(S) Requests nachahmen?
Zombie sieht ganz gut aus, habe aber noch nichts damit hinbekommen. Hat einer von euch mal was, das ich mit fb ausprobieren kann?
https://www.facebook.com/search/115351105145884/residents/present
https://www.facebook.com/search/str/John%20Doe/users-named
statt present
kann man auch past
und future
einsetzen
Man kann die Abfragen auch kombinieren:
https://www.facebook.com/search/str/john%2520doe/places-named/114829128532877/places-in/intersect
Facebook behandelt Städte als pages
mit einer ID (e.g. Hamburg, Germany = 114829128532877). Mit der Graph API kann man die IDs herausbekommen. Soweit ich das gesehen habe sind das die Pages, die auch einen Wikipedia Eintrag zeigen.
Im Graph API Explorer kann man das ausprobieren mit
search?distance=10&q=Cairo, Egypt&type=page
und bekommt dann (u.a.)
{
"data": [
{
"category": "City",
"category_list": [
{
"id": "224455390913969",
"name": "City"
}
],
"name": "Cairo, Egypt",
"id": "115351105145884"
},
Cairo hat die ID 115351105145884, ergo bekommt man mit https://www.facebook.com/search/115351105145884/residents/present alle Leute aus Kairo, Ägypten bzw. weil wir FB in Englisch haben Cairo, Egypt.
ja, wer lesen kann ist klar im Vorteil. Ich habe die ganze zeit nach Städten gesucht. mit pages gehts.
Hey, ich hab mir das URL-Schema mal etwas genauer angesehen. Ist tatsächlich nicht so kompliziert, wie anfangs gedacht. Hier sind erstmal die Dinge, die ich durchprobiert habe.
People who live in Cairo, Egypt and are 32 years old /search/32/users-age/115351105145884/residents/present/intersect
People who live in Cairo, Egypt and are between 21 and 32 years old /search/32/21/users-age-2/115351105145884/residents/present/intersect
People who live in Cairo, Egypt and are under 21 years old /search/21/users-younger/115351105145884/residents/present/intersect
People who are older than 21 and live in Cairo, Egypt /search/21/users-older/115351105145884/residents/present/intersect
People who are younger than 21 /search/21/users-younger
Women /search/females
Women who are younger than 21 /search/21/users-younger/females/intersect
Women who are younger than 21 named "Alice" /search/21/users-younger/str/alice/users-named/females/intersect
Men who are younger than 21 /search/21/users-younger/males/intersect
Es gibt wohl für alle unterstützen Anfragen einen Pfad. Will man mehrere suchen verbinden, dann schreibt man die Anfragen hintereinander und setzt ein /intersect dahinter.
Anfrage | Pfad |
---|---|
Living in X | /id(X)/residents/present |
Men | /males |
Woman | /females |
X years old | /X/users-age |
between X and Y years old | /X/Y/users-age-2 |
under X years old | /X/users-younger |
older than X years | /X/users-older |
named "X" | /str/X/users-named |
who like X | /id(X)/likers |
Können wir denn davon ausgehen, dass dieses Schema auch in nächster Zeit so bleibt? Ansonsten sehr schönes Reverse-Engineering!
MfG Jan
Am 13.11.2014 um 21:15 schrieb lSoleyl:
Hey, ich hab mir das URL-Schema mal etwas genauer angesehen. Ist tatsächlich nicht so kompliziert, wie anfangs gedacht. Hier sind erstmal die Dinge, die ich durchprobiert habe.
People who live in Cairo, Egypt and are 32 years old /search/32/users-age/115351105145884/residents/present/intersect
People who live in Cairo, Egypt and are between 21 and 32 years old /search/32/21/users-age-2/115351105145884/residents/present/intersect
People who live in Cairo, Egypt and are under 21 years old /search/21/users-younger/115351105145884/residents/present/intersect
People who are older than 21 and live in Cairo, Egypt /search/21/users-older/115351105145884/residents/present/intersect
People who are younger than 21 /search/21/users-younger
Women /search/females
Women who are younger than 21 /search/21/users-younger/females/intersect
Women who are younger than 21 named "Alice" /search/21/users-younger/str/alice/users-named/females/intersect
Men who are younger than 21 /search/21/users-younger/males/intersect
Zusammenfassung:
Es gibt wohl für alle unterstützen Anfragen einen Pfad. Will man mehrere suchen verbinden, dann schreibt man die Anfragen hintereinander und setzt ein /intersect dahinter.
Anfrage Pfad Living in X /id(X)/residents/present Men /males Woman /females X years old /X/users-age between X and Y years old /X/Y/users-age-2 under X years old /X/users-younger older than X years /X/users-older named "X" /str/X/users-named
— Reply to this email directly or view it on GitHub https://github.com/thinking-aloud/HAW-MI-G2/issues/5#issuecomment-62958491.
Ich denke schon.
Allerdings müssen wir immer noch runterscrollen, damit wir mehr Ergebnisse bekommen. Und es sind nicht die ersten Ergebnisse,die in der dropdown Liste kommen, wenn man die Graph Search benutzt.
Ich hab mal nen Parser für die Anfragesprache (ja, CI war eines meiner Lieblingsfächer :P ) geschrieben (f3e46a311ca81e827d3cf935423e262def291a2e). In dem Testscript könnt ihr euch angucken, wie der funktioniert. Ich finde, dass es der richtige Ansatz ist, die Semantik der Anfrage von einem Parser ermitteln zu lassen. Jedoch müssen wir dann nochmal mit der Front-End Gruppe sprechen, dass sie uns die gesamte Anfrage schicken.
Bsp-Code:
var Requests = require("./request-logic")
var input = 'All women who are younger than 20 OR all men who are older than 20'
var parseTree = Requests.parse(input) //Eingabestring -> Tree
Requests.translateTree(parseTree, function(err, requestList) { //Tree -> FacebookURLs
console.log("Resolved into following requests:")
requestList.forEach(function (request) { console.log(request) })
})
Ausgabe:
Resolved into following requests:
/males/20/users-older/intersect
/females/20/users-younger/intersect
Damit das ganze funzt, müsst ihr euch async ziehen npm install async
. Ich fahre gleich los und bin erst spät wieder da. Also schreibt eure Fragen und Anregungen auf und ich gucke sie mir dann entweder heute abend oder morgen an.
Ansonsten hab ich mir auch Mühe gegeben den Code ausreichend mit Kommentaren zu füllen ;)
EDIT:
Achja IDs werden noch nicht aufgelöst. Anstatt den Wohnort in eine ID aufzulösen wird das durch ID(Wohnort)
angedeutet. Der Resolver(resolver.js), der dafür zuständig ist, muss halt noch geschrieben werden und hat momentan nur eine Dummy-Implementierung.
Abgefahren, guck ich mir gleich mal an. Ist ja 'ne ganze Menge Code;) Am besten sprechen wir uns aber mit der GUI Gruppe vorher ab, denn die haben auf jeden Fall schon irgendwas mit einem Tokenizer gebastelt (https://github.com/repat/HAW-MI-G2/tree/gui). Nicht, dass wir hier Teil der Aufgaben doppelt machen.
Wenn wir tatsächlich natürliche Sprache parsen, dann denke ich auch, dass es auf unser Seite passieren sollte.
edit: @lSoleyl gerne auch neue issues aufmachen. eigentlich war dieser Thread ja nur für das Diskutieren der Backend Technologie gedacht. Nicht, dass es irgendwann demnächst unübersichtlich wird.
und auch nochmal an alle:
Haben wir uns dadurch jetzt quasi endgültig entschieden, dass wir Nodejs mit den entsprechenden Modulen(async, express, zombiejs, ?) benutzen? Ich sehe in Moment keine Probleme mehr mit der Entscheidung(?).
Der Parser sollte noch wunderbar bei uns integrierbar sein. Momentan zählt es ja nur zu unseren Aufgaben, die Abfrageergebnisse entsprechend zusammenzufügen und darzustellen. Dürfte keine Probleme geben. EDIT: Der Tokenizer spaltet bisher nur die Anfrage Anhand von Wörtern wie AND, OR usw.
@repat Ich denke schon, dass wir jetzt bei nodeJS bleiben. Die Schnittstelle zur GUI lässt sich dann ja wunderbar mit Express machen und da wir nur eine URL anbrowsen & runterscrollen müssen, sollte ZombieJS dafür ausreichen.
Ich glaube @thinking-aloud ist damit auch einverstanden, d.h. wir können dieses issue. eigentlich schliessen. Die Tabelle und dein Beispielcode werde ich mal ins Wiki stellen.
Fuck, ich kann deine Beiträge nicht editieren @lSoleyl -.- Kannst du die selbst ins Wiki schieben, will jetzt nicht die Tabellenstruktur und das alles neu basteln.
edit: nevermind, geht nur auf dem Handy nicht.
edit2: done.
Das haben @lSoleyl, @thinking-aloud und ich herausgefunden:
cc/@malteh, @janusd