2012-04-24 11 views
5

Bisher habe ich folgendes Stück:Fetching Seite von url luasocket und Proxy

local socket = require "socket.http" 
client,r,c,h = socket.request{url = "http://example.com/", proxy="<my proxy and port here>"} 
for i,v in pairs(c) do 
    print(i, v) 
end 

, die mir eine Ausgabe wie folgt ergibt:

connection close 
content-type text/html; charset=UTF-8 
location http://www.iana.org/domains/example/ 
vary Accept-Encoding 
date Tue, 24 Apr 2012 21:43:19 GMT 
last-modified Wed, 09 Feb 2011 17:13:15 GMT 
transfer-encoding chunked 
server Apache/2.2.3 (CentOS) 

was bedeutet, dass die Verbindung nur hergestellt perfekt. Jetzt möchte ich den Titel meiner url's mit dieser socket.http holen. Ich suchte vorherige SO Fragen und die luasocket's http documentation. aber ich habe immer noch keine Idee, wie man den ganzen Teil der Seite in einer Variablen ablegt/speichert und etwas damit macht.

Bitte helfen.

Antwort

4

Sie verwenden die 'generische' Form von http.request(), die das Speichern des Körpers über eine LTN12-Senke erfordert. Es ist nicht so kompliziert, wie es klingt, versuchen Sie diesen Code:

local socket = require "socket.http" 
local ltn12 = require "ltn12"; -- LTN12 lib provided by LuaSocket 

-- This table will store the body (possibly in multiple chunks): 
local result_table = {}; 
client,r,c,h = socket.request{ 
    url = "http://example.com/", 
    sink = ltn12.sink.table(result_table), 
    proxy="<my proxy and port here>" 
} 
-- Join the chunks together into a string: 
local result = table.concat(result_table); 
-- Hacky solution to extract the title: 
local title = result:match("<[Tt][Ii][Tt][Ll][Ee]>([^<]*)<"); 
print(title); 

Wenn Ihr Proxy gesamten Anwendung konstant ist dann eine einfache Lösung die einfache Form von http.request() zu verwenden wäre, und geben Sie den Proxy über http.PROXY:

local http = require "socket.http" 
http.PROXY="<my proxy and port here>" 

local result = http.request("http://www.youtube.com/watch?v=_eT40eV7OiI") 
local title = result:match("<[Tt][Ii][Tt][Ll][Ee]>([^<]*)<"); 
print(title); 

Ausgang:

Flanders and Swann - A song of the weather 
    - YouTube 
+0

Dank! Dies funktioniert im Allgemeinen gut mit allen Arten von Seiten. :) Aber beim Versuch, den Titel von Youtube-Links zu holen, hat die Variable 'result' nur die Seite [** 404 error **] (http://www.hastebin.com/gikavorone.xml). Ich habe beide Methoden ausprobiert. Der zweite holt die Seiten schneller. :) – hjpotter92

+0

Ich habe gerade mit einem Beispiel YouTube-Link aktualisiert und die Ausgabe, die ich bekomme. Es funktioniert alles gut für mich. Der Titel enthält Leerzeichen und wahrscheinlich auch HTML-Elemente. Sie werden es wahrscheinlich ein wenig normalisieren wollen, indem Sie diese entfernen und konvertieren. – MattJ

+0

Nein, hat noch nicht funktioniert. Ich lasse die Datei (mit dem Namen "02.lua") in SciTe laufen. Hier ist der Screenshot der Ausgabe und des Codes (Ich habe 4 verschiedene Webseiten benutzt, 2 auf meinem eigenen Webserver). Überprüfen Sie: http://i.stack.imgur.com/XkQQj.jpg – hjpotter92