日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

模拟登录微博通,抓取新浪微博c#

發布時間:2023/12/29 C# 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模拟登录微博通,抓取新浪微博c# 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在前天我到公司就接到一個驚人的消息,說是新浪1.0的搜索接口關閉了,那我們的業務豈不是受很大影響,這個事太緊急了,大家在一起商討該怎么辦,跟新浪買2.0的接口肯定時間很長,最后決定抓取新浪網頁的,新浪網頁未登錄狀態10分鐘只能抓取不到200次,然后就讓你手動輸入驗證碼了,很顯然,這個方案有落空了。然后我們想是否有其他的辦法,后來去看孔明和微博通,這倆家居然正常跑,就把我樂壞了。稍微研究了下,發現抓取還很容易,然后決定搞微博通的。為什么放棄孔明了,因為孔明的微博默認都是不帶圖片的,你還得抓一次,一次帶圖片的,一次不帶圖片的,然后倆者拼在一起才算有效數據。

廢話少說,下面的東西就在倆個小時內完成了。

一、首先我們要提到模擬登錄微博通,我用fiddler查看了下,發現登錄走下面三個流程:

1、第一個請求地址:http://www.wbto.cn/?c=login&m=index_login ,這個請求是Post提交的,生成一個用戶身份唯一標識的cookie,但是這個cookie不全,需要下面一個請求來補全,那么下面一個請求的地址從哪來了?從第一個post請求返回

2、第二個請求地址:http://www.wbto.cn/bbs/api/uc.php?time=1350530131&code=9888GfRzqS0FVoZFT1EoH6UsF0JklnvPdaiKrhN%2FD5BPYdzdwzyBTIbk5roC8YVn9AeTjsNFDqD1LONBwdGCQqjL%2BqX6uqSXUT6w9Si6JOlNA5BFLYEHIfl1A96Cf5bACA4O447xUah%2FM9JxMc47qOFtlnjjqWSRb%2FNPNMrJsxjCuex8V6Wri%2Ft8ZP7Q87s8,這個請求地址在上面描述了,是第一個Post請求返回的,下面代碼里會演示如何獲取。

3、第三個請求地址:http://www.wbto.cn 這個是登錄地址,其實第二個請求完成后,用戶身份標識的cookie已經完全形成,那么拿著這個cookie就可以訪問任何一個頁面了,包括首頁以及我們主要關心的微博搜索頁。

下面來上代碼,完成上面的描述,很簡單,如下:

(1 )我們先定義一個全局變量:

????

private static CookieContainer cc = new CookieContainer();
(2 )模擬第一個post請求:

/// <summary>/// 模擬post請求/// </summary>/// <param name="url">Post請求后會返回下一次get請求的地址</param>/// <param name="cookie">返回的cookie</param>/// <param name="nick">用戶昵稱/郵箱</param>/// <param name="password">用戶登錄密碼</param>/// <returns></returns>public void SimulatePost(string nick,string password, out string url,out string cookie){HttpWebRequest req = null;HttpWebResponse rep = null;Stream stream = null;try{string postdata = "action=submit&to=/&username={0}&password={1}&cookietime=2592000";postdata = string.Format(postdata, nick, password); //拼裝數據string LoginUrl = "http://www.wbto.cn/?c=login&m=index_login"; //登錄地址#region 信息頭req = (HttpWebRequest)WebRequest.Create(LoginUrl);req.Method = "POST";req.ContentType = "application/x-www-form-urlencoded";byte[] postdatabytes = Encoding.UTF8.GetBytes(postdata);req.ContentLength = postdatabytes.Length;req.Referer = "http://www.wbto.cn/";req.AllowAutoRedirect = false;req.CookieContainer = cc;req.KeepAlive = true;#endregion#region 提交數據并返回COOKIEstream = req.GetRequestStream();stream.Write(postdatabytes, 0, postdatabytes.Length);rep = (HttpWebResponse)req.GetResponse();cc = req.CookieContainer;cookie = req.CookieContainer.GetCookieHeader(req.RequestUri); //字符串形式的COOKIE跟你在瀏覽器看到的一樣StreamReader stre = new StreamReader(rep.GetResponseStream(), Encoding.GetEncoding("utf-8"));#endregionstring html = stre.ReadToEnd();url = html.Substring(html.IndexOf("src=\"") + 5, (html.IndexOf("\"", html.IndexOf("src=\"") + 5) - html.IndexOf("src=\"") - 5));rep.Close();stream.Close();}catch {if (rep != null){rep.Close();}if (stream != null){stream.Close();}url = null;cookie = null;}}
(3) 模擬第二個請求:

/// <summary>/// 模擬Get請求/// </summary>/// <param name="url">請求地址</param>/// <param name="cookie">cookie對象</param>/// <param name="cookieStr">cookie字符串</param>/// <param name="host">host,可選</param>/// <param name="newCookie">新的cookie字符串</param>/// <returns></returns>public string SimulateGet(string url, CookieContainer cookie,string cookieStr, string host,out string newCookie){string json = string.Empty;HttpWebRequest req = null;HttpWebResponse rep = null;Stream st = null;try{req = req = (HttpWebRequest)HttpWebRequest.Create(url);req.ContentType = "application/x-www-form-urlencoded";req.Method = "Get";req.Timeout = 1000 * 30;if (!string.IsNullOrEmpty(host))req.Host = host;req.Referer = "http://www.wbto.cn/?c=login&m=index_login";req.CookieContainer = cookie;req.Headers.Add("Cookie:" + cookieStr);rep = (HttpWebResponse)req.GetResponse();newCookie = req.CookieContainer.GetCookieHeader(req.RequestUri);st = rep.GetResponseStream();StreamReader stre = new StreamReader(st, Encoding.GetEncoding("utf-8"));json = stre.ReadToEnd();}catch{if (rep != null){rep.Close();}if (st != null){st.Close();}newCookie = null;}return json;}
這里講一下,當我們第二個請求完成后,我前面講過cookie已經完全形成了,這個時候你拿著這個cookie就可以訪問任何一個頁面了,所以聰明的你會發現,第二個方法是通用的,你可以接著用他請求其他的地址,只要傳入正確的請求地址和cookie字符串即可。

下面貼上最后一段代碼,是我測試用的,如下:


結束:搞定。這個只是一個簡單的寫法,各位朋友看著改即可。






總結

以上是生活随笔為你收集整理的模拟登录微博通,抓取新浪微博c#的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。