百度网盘资源搜索器

1 写在前面

最近想要在百度网盘里面搜索一些pdf资源,打开以前保存的一个专门搜索百度网盘资源的页面so.baiduyun.me ,页面转了好久,终于出来,但是出现的却是Error 522,链接失效了。最后,在网上找到一个可以用的地址http://pan.java1234.com/,这个地址确实可以搜索百度网盘资源,但是广告超级多,稍有不慎,就进入了一个广告页面,神烦。当时就想能不能寻找到这个网页中资源搜索的地址,然后自己根据这个地址来模拟请求,从而获得查询结果。打开浏览器的调试工具,随意输入一个关键字进行查询,点击查询,然后进行分析。分析发现了一个url请求返回的正是百度网盘搜索结果,数据是json格式。找到了这个获取搜索结果url之后就好办了。我们可以完全自己写一个Winform界面,然后通过这个url去模拟请求,获取结果,这样就没有广告了,想怎么弄就怎么弄,下面介绍一下,如何完成这一系列的过程。

2 分析

2.1 获取请求头信息

实现这个程序的关键就是如何获取http://pan.java1234.com/百度网盘搜索结果的url,首先我们打开这个页面,启动浏览器调试,然后随意输入一个关键字,点击查询。

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

上图我们可以看到,有一个请求url,返回来的结果就是页面上显示的搜索结果。我们可以看看它的请求地址以及请求头信息。

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

通过查看headers面板可以知道请求信息如下:

知道请求地址,user-agent,host,referer请求头信息,我们就可以构造出一个搜索资源的请求,现在我们来分析一下这个请求地址的特点,这个请求地址有一个查询参数q=win7,而我们知道先前在搜索框里面输入的关键字就是win7,由此可以判断,该查询参数代表的搜索关键字。我们可以把这个请求地址在浏览器中打开,然后去去更改这些查询参数,来分析这些查询参数各有什么作用。

经过分析,请求地址中的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三个属性。

知道了返回的json格式结构,我们就可以在c#中建立相对应的类,然后将这些json数据经过预处理,之后便可以反序列化成为相对应的对象。

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

### Ver:2014-03-06 ### [资源配置] 资源名称=%目录名称% 运行程序=play.exe 预先执行= 起始目录= 窗口模式=1 绝对路径=1 导注册表= [安装组件] DirectX=0 VC2005=1 VC2008=0 VC2010=0 物理驱动=0 NET11=0 NET20=0 NET35=0 NET40=0 XLive=0 AppLocale=0 [程序配置] 调试模式=0 窗口模式=2 [组件1] 组件简称=VC2005 组件名称=Microsoft Visual C++ 2005 组件版本=SP1 所需时间=15 文件1=%ProgramFiles%\Common Files\Microsoft Shared\VC\msdia80.dll 注册表1主键=HKLM 注册表1子键=SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{837b34e3-7c30-493c-8f6a-2b0f04e2912c} 注册表1名称=DisplayName 注册表1数据= 预先执行=msiexec /regserver|Reg Delete "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\UpgradeCodes\AA5D9C68C00F12943B2F6CA09FE28244" /f|Reg Delete "HKEY_CLASSES_ROOT\Installer\Products\3e43b73803c7c394f8a6b2f0402e19c2" /f 安装程序=Install\VC2005\vcredist_2005_x86.exe /Q 窗口模式=0 [组件2] 组件简称=VC2008 组件名称=Microsoft Visual C++ 2008 组件版本=SP1 所需时间=10 文件1=%ProgramFiles%\Common Files\Microsoft Shared\VC\msdia90.dll 注册表1主键=HKEY_LOCAL_MACHINE 注册表1子键=SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1F1C2DFC-2D24-3E06-BCB8-725134ADF989} 注册表1名称=DisplayName 注册表1数据= 预先执行=msiexec /regserver 安装程序=Install\VC2008\vcredist_2008_x86.exe /Q 窗口模式=0 [组件3] 组件简称=VC2010 组件名称=Microsoft Visual C++ 2010 组件版本= 所需时间=20 文件1=%ProgramFiles%\Common Files\Microsoft Shared\VC\msdia100.dll 注册表1主键=HKEY_LOCAL_MACHINE 注册表1子键=SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{196BB40D-1578-3D01-B289-BEFC77A11A1E} 注册表1名称=DisplayName 注册表1数据= 预先执行=msiexec /regserver|Install\VC2010\WindowsXP-KB942288-v3-x86.exe /q /norestart 安装程序=Install\VC2010\vcredist_x86.exe /Q 窗口模式=0 [组件4] 组件简称=物理驱动 组件名称=Nvidia物理驱动 组件版本=9.10.0513 所需时间=25 文件1=%ProgramFiles%\NVIDIA Corporation\PhysX\Common\PhysXLoader.dll 注册表1主键=HKEY_LOCAL_MACHINE 注册表1子键=SOFTWARE\AGEIA Technologies\PhysX_A32_Engines 注册表1名称=2.8.3 注册表1数据= 预先执行=msiexec /regserver|Install\PhysX\WindowsXP-KB942288-v3-x86.exe /q /norestart|Reg Delete "HKEY_LOCAL_MACHINE\SOFTWARE\AGEIA Technologies" /f|Reg Delete "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\UpgradeCodes\61A06632C8ACCC042938A4584BF90122" /f 安装程序=Install\PhysX\PhysX_9.10.0513_SystemSoftware.exe /q 环境变量=C:\Program Files\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common 窗口模式=0 [组件5] 组件简称=NET11 组件名称=.NET Framework 1.1 组件版本=SP1 所需时间=50 文件1=C:\Windows\Microsoft.NET\Framework\v1.1.4322\gacutil.exe 注册表1主键=HKEY_LOCAL_MACHINE 注册表1子键=SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft .NET Framework 1.1 (1033) 注册表1名称=DisplayName 注册表1数据= 预先执行=msiexec /regserver|msiexec /i Install\NET11SP1\netfx.msi /q /norestart 安装程序=Install\NET11SP1\NDP1.1sp1-KB867460-X86.exe /q 窗口模式=0 [组件6] 组件简称=NET20 组件名称=.NET Framework 2.0 组件版本=SP2 所需时间=80 文件1=C:\Windows\Microsoft.NET\Framework\v2.0.50727\1033\alinkui.dll 预先执行=msiexec /regserver|Install\NET20SP2\WindowsXP-KB942288-v3-x86.exe /q /norestart 安装程序=Install\NET20SP2\NetFx20SP2_x86.exe /q /norestart 窗口模式=0 [组件7] 组件简称=NET35 组件名称=.NET Framework 3.5 组件版本=SP1 所需时间=140 文件1=C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft .NET Framework 3.5 SP1\setup.exe 注册表1主键=HKEY_LOCAL_MACHINE 注册表1子键=SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9} 注册表1名称=DisplayName 注册表1数据= 预先执行=msiexec /regserver|Install\NET35SP1\WindowsXP-KB942288-v3-x86.exe /q /norestart 安装程序=Install\NET35SP1\dotnetfx35\wcu\dotNetFramework\dotNetFx35setup.exe /q 窗口模式=0 [组件8] 组件简称=NET40 组件名称=.NET Framework 4.0 组件版本=4.0.30319 所需时间=270 文件1=C:\Windows\Microsoft.NET\Framework\v4.0.30319\1033\alinkui.dll 注册表1主键=HKEY_LOCAL_MACHINE 注册表1子键=SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client 注册表1名称=Install 注册表1数据=1 预先执行=msiexec /regserver|Install\NET40\WindowsXP-KB942288-v3-x86.exe /q /norestart|Install\NET40\wic_x86_chs.exe /q /norestart 安装程序=Install\NET40\dotNetFx40_Full_x86_x64.exe /q /norestart 窗口模式=0 [组件9] 组件简称=XLive 组件名称=Game For Windows Live 组件版本=4.0.30319 所需时间=50 文件1=C:\Windows\system32\xlive.dll 注册表1主键=HKEY_LOCAL_MACHINE 注册表1子键=SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{2C9EE786-1DDB-4C98-8FA4-B1B9B5A66B77} 注册表1名称=DisplayName 注册表1数据= 预先执行=msiexec /regserver|Install\GFWLive\WindowsXP-KB942288-v3-x86.exe /q /norestart 安装程序=Install\GFWLive\gfwlivesetup.exe /q /nu /norestart 窗口模式=0 [组件10] 组件简称=DirectX 组件名称=Microsoft(R) DirectX(R) 组件版本=2010年6月 所需时间=40 文件1=C:\WINDOWS\system32\D3DX9_24.dll 文件2=C:\WINDOWS\system32\D3DX9_25.dll 文件3=C:\WINDOWS\system32\D3DX9_26.dll 文件4=C:\WINDOWS\system32\D3DX9_27.dll 文件5=C:\WINDOWS\system32\D3DX9_28.dll 文件6=C:\WINDOWS\system32\D3DX9_29.dll 文件7=C:\WINDOWS\system32\D3DX9_30.dll 文件8=C:\WINDOWS\system32\D3DX9_31.dll 文件9=C:\WINDOWS\system32\D3DX9_32.dll 文件10=C:\WINDOWS\system32\D3DX9_33.dll 文件11=C:\WINDOWS\system32\D3DX9_34.dll 文件12=C:\WINDOWS\system32\D3DX9_35.dll 文件13=C:\WINDOWS\system32\D3DX9_36.dll 文件14=C:\WINDOWS\system32\D3DX9_37.dll 文件15=C:\WINDOWS\system32\D3DX9_38.dll 文件16=C:\WINDOWS\system32\D3DX9_39.dll 文件17=C:\WINDOWS\system32\D3DX9_40.dll 文件18=C:\WINDOWS\system32\D3DX9_41.dll 文件19=C:\WINDOWS\system32\D3DX9_42.dll 文件20=C:\WINDOWS\system32\D3DX9_43.dll 安装程序=Install\DirectX\directx_Jun2010_redist\DXSETUP.EXE /silent 窗口模式=0 [组件11] 组件简称=AppLocale 组件名称=Microsoft AppLocale 组件版本= 所需时间=5 文件1=C:\Windows\AppPatch\AppLoc.exe 文件2=C:\Windows\AppPatch\ALRes401.dll 文件3=C:\Windows\AppPatch\ALRes404.dll 文件4=C:\Windows\AppPatch\ALRes407.dll 预先执行=msiexec /regserver 安装程序=msiexec /i Install\Apploc\apploc.msi /Q /norestart 窗口模式=0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值