从站点检索DOM数据

时间:2011-11-08 20:42:01

标签: c# java javascript dom screen-scraping

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

http://www.facebook.com/FamilyGuy

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

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

2 个答案:

答案 0 :(得分:0)

我认为older posts链接会发送Ajax请求并将响应附加到该页面。 (我不确定。你应该查看页面来源)。

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

编辑:

似乎Facebook使用某种内部API(JSCC)来加载内容并且没有记录内容。

我不了解Facebook开发人员的API(您可能想先检查一下),但如果您想要模拟浏览器中发生的事情,那么您可以使用TamperData拦截{当您点击GET链接并找到请求网址及其参数时,{1}}会提出请求。

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

您请求的

Login示例代码:

C#

然后,您可以使用自己的Cookie执行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; } 次请求,使用GET使用URL分析JSCC.get().getHandler()个请求时获得TamperData,最后是'我会得到你想要的响应流:

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

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

答案 1 :(得分:0)

Facebook使用AJAX动态加载内容。您可以使用Firebug之类的工具来检查发出了哪种请求,然后复制它。

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