最近想要在百度網盤裏面搜索一些pdf資源,打開之前保存的一個專門搜索百度網盤資源的頁面so.baiduyun.me
,頁面轉了很久,終於出來,可是出現的倒是Error 522,連接失效了。最後,在網上找到一個能夠用的地址http://pan.java1234.com/
,這個地址確實能夠搜索百度網盤資源,可是廣告超級多,稍有不慎,就進入了一個廣告頁面,神煩。當時就想能不能尋找到這個網頁中資源搜索的地址,而後本身根據這個地址來模擬請求,從而得到查詢結果。打開瀏覽器的調試工具,隨意輸入一個關鍵字進行查詢,點擊查詢,而後進行分析。分析發現了一個url請求返回的正是百度網盤搜索結果,數據是json格式。找到了這個獲取搜索結果url以後就好辦了。咱們能夠徹底本身寫一個Winform界面,而後經過這個url去模擬請求,獲取結果,這樣就沒有廣告了,想怎麼弄就怎麼弄,下面介紹一下,如何完成這一系列的過程。html
實現這個程序的關鍵就是如何獲取http://pan.java1234.com/
百度網盤搜索結果的url,首先咱們打開這個頁面,啓動瀏覽器調試,而後隨意輸入一個關鍵字,點擊查詢。java
上圖咱們能夠看到,有一個請求url,返回來的結果就是頁面上顯示的搜索結果。咱們能夠看看它的請求地址以及請求頭信息。web
經過查看headers面板能夠知道請求信息以下:json
知道請求地址,user-agent,host,referer請求頭信息,咱們就能夠構造出一個搜索資源的請求,如今咱們來分析一下這個請求地址的特色,這個請求地址有一個查詢參數q=win7
,而咱們知道先前在搜索框裏面輸入的關鍵字就是win7,由此能夠判斷,該查詢參數表明的搜索關鍵字。咱們能夠把這個請求地址在瀏覽器中打開,而後去去更改這些查詢參數,來分析這些查詢參數各有什麼做用。c#
通過分析,請求地址中的q參數表明的是搜索關鍵字;start參數表明的是搜索頁面,一共有10頁,0表明第一頁,10表明第二頁,···,90表明第十頁,該網頁最高顯示100條資源結果;而最後的&_=1478436979649能夠刪掉,在請求中沒有實質的做用。數組
通過2.1節分析,咱們知道搜索結果的url地址,如今咱們隨意的構造一個以下。瀏覽器
http://pan1234.com/server3?jsoncallback=jQuery19109864917922941505_1478436979648&q=win7&start=0
在瀏覽器中顯示的效果以下:網絡
咱們能夠知道搜索結果是以json字符串的格式返回的。返回的是一個對象數組,每一個資源對象都包含了title
,content
,unescapedUrl
三個屬性。app
知道了返回的json格式結構,咱們就能夠在c#中創建相對應的類,而後將這些json數據通過預處理,以後即可以反序列化成爲相對應的對象。jsp
下面將貼出實現該程序的關鍵代碼,源代碼能夠到本文章的末尾自行下載。
public class SearchResult { public BDWPResource[] resources { get; set; } } public class BDWPResource { public string title { get; set; } public string content { get; set; } public string unescapedUrl { get; set; } }
class HttpHelper { static readonly string urlTemplate = "http://pan1234.com/server3?jsoncallback=jQuery191042552483269501273_1478315152726&q={0}&start={1}"; public static SearchResult Requset(string key, string start) { string url = string.Format(urlTemplate, key, start); HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(url); httpRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; httpRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"; httpRequest.Host = "pan1234.com"; httpRequest.Referer = "http://pan.java1234.com/result.jsp?wp=0&op=0&ty=gn&q=" + Uri.EscapeUriString(key); try { HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse(); Stream s = httpResponse.GetResponseStream(); StreamReader sr = new StreamReader(s); string jsonString = sr.ReadToEnd(); string jsonProcessed = null; if ((jsonProcessed = JsonPreProcessing(jsonString)) != null) { SearchResult searchResult = UtilityClass.GetObject<SearchResult>(jsonProcessed); return searchResult; } return null; } catch { return null; } } public static string JsonPreProcessing(string jsonString) { int startIndex = jsonString.IndexOf("("); if (startIndex > 0) { string json = jsonString.Substring(startIndex + 1); return "{\"resources\":" + json.Remove(json.Length - 3) + "}"; } else { return null; } } }
class UtilityClass { public static T GetObject<T>(string json) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)); T obj = (T)serializer.ReadObject(ms); return obj; } }
界面設計以下:
將網絡請求的代碼放到任務線程中進行執行。代碼以下:
Thread thread = new Thread(() => { for (int i = 0; i < 100; i += 10) { if (isSearch) { SearchResult sr = HttpHelper.Requset(key, i.ToString()); if (sr != null) { foreach (BDWPResource resource in sr.resources) { BindResource(resource); } } } else break; } //搜索完成 SearchOver(); }); thread.IsBackground = true; thread.Start(); //綁定數據代碼 private void BindResource(BDWPResource resource) { string title = resource.title.Replace("</b>", "").Replace("<b>",""); string content = resource.content.Replace("</b>", "").Replace("<b>", ""); this.Invoke(new Action<string, string, string>((tle, ctt, url) => { this.dataGridView1.Rows.Add(tle, ctt, url); this.lblResult.Text = (Int32.Parse(this.lblResult.Text) + 1).ToString(); this.pgsBar.Value++; }), title, content, resource.unescapedUrl); } //搜索完成 private void SearchOver() { this.Invoke(new Action(() => { this.btnSearch.Text = "開始搜索"; this.btnSearch.Enabled = true; this.btnStop.Enabled = false; this.isSearch = true; })); }
該程序搜索速度有時候比較慢,有時間快,剛開始點擊搜索通常都要等一會纔有結果,可能有網絡延遲的緣由。但發現搜索一會還沒結果的時候,能夠先中止搜索,而後再點擊開始搜索,就會有搜索結果出來了。