从站点检索 DOM 数据

本文关键字:数据 DOM 点检索 从站 | 更新日期: 2023-09-27 18:13:56

当我从网站上单击较旧的帖子时,是否有机会检索 DOM 结果:

http://www.facebook.com/FamilyGuy

使用 C# 还是 Java?我听说可以用onclick执行脚本并获得结果。 我如何执行此脚本:

onclick="(JSCC.get('j4eb9ad57ab8a19f468880561') && JSCC.get('j4eb9ad57ab8a19f468880561').getHandler())(); return false;"

从站点检索 DOM 数据

我认为older posts链接会发送Ajax请求并将响应附加到页面。(我不确定。您应该检查页面源代码(。

您可以在 C#JavaJavaScript 中模拟此行为(您已经拥有 javascript 的代码(。

编辑:

似乎Facebook使用某种内部 API ( JSCC ( 来加载内容,并且没有文档。

我不知道Facebook开发人员的 API(您可能想先检查一下(,但如果您想准确模拟浏览器中发生的情况,那么当您单击more posts链接并找到请求 URL 及其参数时,您可以使用TamperData拦截GET请求。

获取此信息后,您必须Login到应用程序中的帐户并获取身份验证 Cookie。

按照您的要求C#示例代码:

private CookieContainer GetCookieContainer(string loginURL, string userName, string password)
{
    var webRequest = WebRequest.Create(loginURL) as HttpWebRequest;
    var responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
    string responseData = responseReader.ReadToEnd();
    responseReader.Close();
    // Now you may need to extract some values from the login form and build the POST data with your username and password.
    // I don't know what exactly you need to POST but again a TamperData observation will help you to find out.
    string postData =String.Format("UserName={0}&Password={1}", userName, password); // I emphasize that this is just an example.
    // cookie container
    var cookies = new CookieContainer();
    // post the login form
    webRequest = WebRequest.Create(loginURL) as HttpWebRequest;
    webRequest.Method = "POST";
    webRequest.ContentType = "application/x-www-form-urlencoded";
    webRequest.CookieContainer = cookies;
    // write the form values into the request message
    var requestWriter = new StreamWriter(webRequest.GetRequestStream());
    requestWriter.Write(postData);
    requestWriter.Close();
    webRequest.GetResponse().Close();
    return cookies;
}

然后,您可以使用您拥有的 cookie 执行GET请求,使用TamperData分析该JSCC.get().getHandler()请求获得URL,最终您将获得所需的响应流:

var webRequest = WebRequest.Create(url) as HttpWebRequest;
webRequest.CookieContainer = GetCookieContainer(url, userName, password);
var responseStream = webRequest.GetResponse().GetResponseStream();

您还可以使用Selenium进行浏览器自动化。它还具有C#Java API(我没有使用Selenium的经验(。

Facebook使用

AJAX动态加载其内容。您可以使用像Firebug这样的工具来检查发出的请求类型,然后复制它。

或者你可以使用像webkit这样的浏览器渲染引擎为你处理JavaScript并公开生成的HTML:http://webscraping.com/blog/Scraping-JavaScript-webpages-with-webkit/