C#中使用HTTP GET和POST进行Facebook数据抓取

在本文中,将探讨如何使用C#语言通过HTTPGET和POST方法来执行Facebook的一些基本任务,如登录、搜索、更新状态和上传图片。将使用Facebook移动版网站来获取响应,并通过正则表达式解析HTML以获取所需数据。

在之前的文章《C#中的多线程Web抓取》中,介绍了使用正则表达式、WebClient和HTTPWebRequest以及Response进行Web抓取的技术。基于那篇文章中介绍的技术,编写了本文附带的代码。本文的目的是解释如何使用HTTPWebRequest和HTTPWebReponse,如何向Web服务器发送GET和POST数据,如何收集Cookies以及如何维护会话。

类方法

以下是一些类方法的描述:

  • public staticFacebookLogin(string username, string password)此方法用于获取WebBrowser控件的Cookies,并将其存储在Cookie集合中以维护会话。成功时返回Facebook对象,以便调用其他公共方法;失败时,在默认浏览器中显示响应HTML。
  • public bool StatusUpdate(string txt)此方法用于在用户的Timeline上更新文本状态。
  • public void UploadPhoto(string filepath, string caption)此方法用于将指定路径的图片上传到当前用户资料的移动上传文件夹,并附带指定的标题。
  • public Dictionary SearchGroups(string keyword, int scount)此方法用于搜索给定关键字的群组,并从指定的搜索结果开始计数返回包含GroupID和名称的字典。
  • public Dictionary SearchPages(string keyword, int scount)此方法用于搜索给定关键字的页面,并从指定的搜索结果开始计数返回包含页面URL和名称的字典。

使用代码

以下是如何使用上述方法的示例:

执行登录

Facebook fb = Facebook.Login("USERNAME", "PASSWORD");

更新状态

fb.StatusUpdate("Text Status");

上传图片

fb.UploadPhoto(@"C:\Users\..\...\...\IMAGE.jpg", "Its the Caption");

搜索群组

Dictionary<string, string> groups; int startCount = 1; do { groups = fb.SearchGroups("diet coke", startCount); startCount += groups.Count; string txt = ""; foreach (string k in groups.Keys) txt += k + "\t\t" + groups[k] + Environment.NewLine; MessageBox.Show(txt); } while (groups.Count > 0);

同样的方法也可以用来搜索页面。

代码工作原理

在用C#进行登录之前,先在Mozilla中进行登录,并通过LiveHTTPHeaders分析HTTP头。可以从Firefox网站安装LiveHTTPHeader插件。启动LiveHTTPHeaders,浏览到http://www.facebook.com,输入用户名和密码,点击登录按钮。浏览器发送的HTTP Web请求看起来像这样:

第一行是URL,用户名和密码将被发送到该URL(稍后在示例3中,将看到如何找到这个URL)。第二行告诉使用的HTTP方法和版本,分别是POST和1.1。

然后所有的字段就像在示例1中看到的正常的HTTP头一样。重要的东西从Cookie头开始,在示例1中,一旦浏览到http://www.facebook.com,就没有Cookie头,而在响应头中收到了一些Cookies,现在当点击登录按钮时,之前收到的一组Cookies正在这个Cookie头中被发送。

下一个头显示内容类型,用于POST数据的两种主要内容类型是application/x-www-form-urlencoded和multipart/form-data。可以在这里找到更多信息。

下一个头显示内容长度,最后一行显示内容。将在这一行看到电子邮件地址和密码。实际上,最后一行显示的是HTTP Post方法发送到服务器的数据。

还有其他一些值,稍后在示例中,将看到这些值是什么,以及如何获得这些值!!!

让检查上述请求的响应头。

响应头显示了很多Cookies,这些是服务器在成功登录后颁发的Cookies,现在对于任何后续请求,浏览器将把这些Cookies发送到服务器,通过这种方式会话将被维护。

转到工具->清除最近的历史记录并删除Cookies,然后尝试浏览到Facebook个人资料页面,将看到会重定向到Facebook登录页面。

现在让创建与上述屏幕截图相同的登录请求头,并测试否能够成功登录。

string getUrl = "https://www.facebook.com/login.php?login_attempt=1"; string postData = "lsd=AVo_jqIy&email=YourEmailAddress&pass=YourPassword&default_persistent=0&charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%6C%B0%B4%2C%D0%94%2C%D0%84&timezone=-300&lgnrnd=072342_0iYK&lgnjs=1348842228&locale=en_US"; HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl); getRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Firefox 15.0.0.1"; getRequest.CookieContainer = new CookieContainer(); getRequest.CookieContainer.Add(cookies); getRequest.Method = WebRequestMethods.Http.Post; getRequest.ProtocolVersion = HttpVersion.Version11; getRequest.AllowAutoRedirect = false; getRequest.ContentType = "application/x-www-form-urlencoded"; getRequest.Referer = "https://www.facebook.com"; getRequest.KeepAlive = true;

getUrl被分配到数据将被发布的地址,postData变量是上述HTTP请求数据包的内容副本。然后创建了一个HTTPWebRequest对象,并设置了它的User-Agent头。

在请求http://www.facebook.com时收到的Cookies被添加到HTTPWebRequest对象中,如果不添加这些Cookies,那么服务器将不会处理登录请求,而是将重定向到登录页面。接下来将HTTP方法设置为Post,版本设置为1.1(用于HTTPS)。

将AllowAutoRedirect属性设置为false对于尝试登录的请求非常重要,如果这个属性被设置为true,那么HTTPWebRequest对象将遵循重定向响应。在重定向过程中,可能会丢失服务器在登录请求响应中发送的Cookies。

现在让将登录信息发送到服务器。

// Converting postData to Array of Bytes byte[] byteArray = Encoding.ASCII.GetBytes(postData); // Setting Content-Length Header of the Request getRequest.ContentLength = byteArray.Length; // Obtaining the Stream To Write Data Stream newStream = getRequest.GetRequestStream(); // Writing Data To Stream newStream.Write(byteArray, 0, byteArray.Length); newStream.Close();

数据被写入流中,现在让获取响应并看看收到了哪些Cookies:

成功登录系统并收到了9个Cookies,上面的截图显示了关于收到的Cookies的很少信息,可以通过访问Cookies的属性来获取更多信息。将收到的Cookies添加到全局定义的CookieCollection中,以便在后续请求中使用。

如何检查登录是否成功

通常Cookies数量是一个简单的方法来确定登录是否成功,为了更确定,可以尝试获取首页的HTML,如果没有被重定向到登录页面,那就意味着成功登录了。

通过这种方式,可以检查每个任务的post数据,并编写正则表达式来在页面的HTML中找到这些数据,然后生成后续的post数据请求。上面的大多数函数都使用这种机制。

尽管这些是非常基本的函数,但通过理解这些,代码可以被增强以执行更高级的功能,如加入群组、点赞页面、获取时间线故事、向群组和页面发布图片、对帖子发表评论、发送好友请求等。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485