我有一个网站,我需要一种方法通过http请求从不同的网站获取HTML数据,我已经四处寻找实现它的方法,而且大多数都是通过ajax调用来代替。
ajax调用被链接阻止,因此我想尝试一个简单的跨域http请求,并希望它不会被阻止。
答案 0 :(得分:1)
如果您正在运行服务器并且能够在其上运行代码,则可以建立HTTP呼叫服务器端。请记住,大多数网站只允许每个IP地址拨打这么多电话,因此您无法以这种方式为很多用户提供服务。
这是一个简单的httpListener,可在QueryString包含?site=http://linkedin.com
时下载网站内容:
// setup an listener
using(var listener = new HttpListener())
{
// on port 8080
listener.Prefixes.Add("http://+:8080/");
listener.Start();
while(true)
{
// wait for a connect
var ctx = listener.GetContext();
var req = ctx.Request;
var resp = ctx.Response;
// default page
var cnt = "<html><body><a href=\"/?site=http://linkedin.com\">click me</a> </body></html>";
foreach(var key in req.QueryString.Keys)
{
if (key!=null)
{
// if the url contains ?site=some url to an site
switch(key.ToString())
{
case "site":
// lets download
var wc = new WebClient();
// store html in cnt
cnt = wc.DownloadString(req.QueryString[key.ToString()]);
// when needed you can do caching or processing here
// of the results, depending on your needs
break;
default:
break;
}
}
}
// output whatever is in cnt to the calling browser
using(var sw = new StreamWriter(resp.OutputStream))
{
sw.Write(cnt);
}
}
}
要使上述代码正常工作,您可能需要为网址设置权限,如果您在开发框中执行操作:
netsh http add urlacl url=http://+:8080/ user=Everyone listen=yes
在生产中使用用户的理智值。
设置完成后,运行以上代码并将浏览器指向
http://localhost:8080/
(注意/最后)
您将获得一个包含链接的简单页面:
单击该链接将向httplistener发送新请求,但这次使用查询字符串site=http://linkedin.com
。服务器端代码将获取给定网址的http内容,在本例中为LinkedIn.com。结果是一对一地发送回浏览器,但您可以根据需要进行后处理/缓存等。
大多数网站都不喜欢被这种方式刮掉,他们的服务条款实际上可能会禁止它。确保您不会做出违反网站可靠性或导致对您采取法律行动的非法行为。