百度網盤資源搜索器

1 寫在前面

最近想要在百度網盤裏面搜索一些pdf資源,打開之前保存的一個專門搜索百度網盤資源的頁面so.baiduyun.me ,頁面轉了很久,終於出來,可是出現的倒是Error 522,連接失效了。最後,在網上找到一個能夠用的地址http://pan.java1234.com/,這個地址確實能夠搜索百度網盤資源,可是廣告超級多,稍有不慎,就進入了一個廣告頁面,神煩。當時就想能不能尋找到這個網頁中資源搜索的地址,而後本身根據這個地址來模擬請求,從而得到查詢結果。打開瀏覽器的調試工具,隨意輸入一個關鍵字進行查詢,點擊查詢,而後進行分析。分析發現了一個url請求返回的正是百度網盤搜索結果,數據是json格式。找到了這個獲取搜索結果url以後就好辦了。咱們能夠徹底本身寫一個Winform界面,而後經過這個url去模擬請求,獲取結果,這樣就沒有廣告了,想怎麼弄就怎麼弄,下面介紹一下,如何完成這一系列的過程。html

2 分析

2.1 獲取請求頭信息

實現這個程序的關鍵就是如何獲取http://pan.java1234.com/百度網盤搜索結果的url,首先咱們打開這個頁面,啓動瀏覽器調試,而後隨意輸入一個關鍵字,點擊查詢。java

2016_11_78518cbf-2d0b-4ada-8dbd-85236e20b1cf

上圖咱們能夠看到,有一個請求url,返回來的結果就是頁面上顯示的搜索結果。咱們能夠看看它的請求地址以及請求頭信息。web

2016_11_8ee7e19f-775f-44ba-907b-e1e480b0f03d

經過查看headers面板能夠知道請求信息以下:json

知道請求地址,user-agent,host,referer請求頭信息,咱們就能夠構造出一個搜索資源的請求,如今咱們來分析一下這個請求地址的特色,這個請求地址有一個查詢參數q=win7,而咱們知道先前在搜索框裏面輸入的關鍵字就是win7,由此能夠判斷,該查詢參數表明的搜索關鍵字。咱們能夠把這個請求地址在瀏覽器中打開,而後去去更改這些查詢參數,來分析這些查詢參數各有什麼做用。c#

通過分析,請求地址中的q參數表明的是搜索關鍵字;start參數表明的是搜索頁面,一共有10頁,0表明第一頁,10表明第二頁,···,90表明第十頁,該網頁最高顯示100條資源結果;而最後的&_=1478436979649能夠刪掉,在請求中沒有實質的做用。數組

2.2 分析返回的搜索結果格式

通過2.1節分析,咱們知道搜索結果的url地址,如今咱們隨意的構造一個以下。瀏覽器

http://pan1234.com/server3?jsoncallback=jQuery19109864917922941505_1478436979648&q=win7&start=0

在瀏覽器中顯示的效果以下:網絡

2016_11_3a923c28-8109-4561-8706-71fa6308cfc0

咱們能夠知道搜索結果是以json字符串的格式返回的。返回的是一個對象數組,每一個資源對象都包含了title,content,unescapedUrl三個屬性。app

知道了返回的json格式結構,咱們就能夠在c#中創建相對應的類,而後將這些json數據通過預處理,以後即可以反序列化成爲相對應的對象。jsp

3.程序實現

下面將貼出實現該程序的關鍵代碼,源代碼能夠到本文章的末尾自行下載。

3.1 數據實體類

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; }
}

3.2 數據請求及預處理

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;
        }
    }
}

3.3 json數據反序列化對象

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;
    }
}

3.4 界面

界面設計以下:

2016_11_288a1961-19b1-4f12-a93c-696d61bd9884

將網絡請求的代碼放到任務線程中進行執行。代碼以下:

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;
    }));
}

3.5 程序運行結果

2016_11_831ec578-b373-4660-97a5-81317b2ef478

2016_11_2a3aaa50-7efe-428e-82f0-c0e79111fcce

4 結論

該程序搜索速度有時候比較慢,有時間快,剛開始點擊搜索通常都要等一會纔有結果,可能有網絡延遲的緣由。但發現搜索一會還沒結果的時候,能夠先中止搜索,而後再點擊開始搜索,就會有搜索結果出來了。

5 資源

源代碼下載連接:http://download.csdn.net/download/mingge38/9674694

相關文章
相關標籤/搜索