• 使用HttpClient类实现网页和图片的抓取
  • 超级玛丽 发表于 2015/10/18 10:30:00 | 分类标签: HttpClient 图片抓取 网页抓取
  • HttpClient类

    在UWP中可以用来进行网络通信的HttpClient类有两个,System.Net.Http.HttpClientWindows.Web.Http.HttpClient,两者使用上的差别并不大,但我们优先考虑后者,因为它位于Windows.Foundation.UniversalApiContract程序集中,是本地代码,效率更高。我们主要学习的也是Windows.Web.Http.HttpClient了。

    使用HttpClient类,我们可以向指定的URI发出HTTP请求,并获取从服务器返回的数据。发起请求的方式有GET、POST、 PUT和 DELETE,请求都是异步请求。同时我们还需要一个HttpResponseMessage对象,用来声明从 HTTP 请求接收到的 HTTP 响应消息。
    1. HttpClient httpClient = new HttpClient();  
    2. //添加用户代理标头  
    3. httpClient.DefaultRequestHeaders.Add("user-agent""Mozilla/5.0 (compatible;MSIE 10.0;Windows NT 6.2;WOW64;Trident/6.0)");  
    4. HttpResponseMessage response =  await httpClient.GetAsync(new Uri(tbUrl.Text));//发送请求,此处是GET的方式,其他方式类似  
    5. response.EnsureSuccessStatusCode();//确保请求成功  
    6. //Buffer方式读取返回结果  
    7. IBuffer buffer = await response.Content.ReadAsBufferAsync();  
    8. //流方式读取返回结果  
    9. IInputStream inputStream= await response.Content.ReadAsInputStreamAsync();  
    10. //字符串方式读取返回结果  
    11. string result = await response.Content.ReadAsStringAsync();  

    上面是HttpClient类来实现HTTP请求的一般方式了,ok,看常规演示:

    请求HTML页面

    我们请求返回的HTML,最后都转换成了string类型,然后将这个string类型的值给了WebView控件的NavigateToString方法,它会自动处理HTML标记。(PS:你如果觉得这样还不如直接把URI给WebView控件的Navigate方法,反正显示效果一样,那你就把string值用其他文本控件显示吧!)还有,读取字符串直接用ReadAsStringAsync方法就行啦,后面的只为折腾一下。
    1. private async void btn_get_Click(object sender, RoutedEventArgs e)  
    2.         {  
    3.             //http://www.hello-code.com/Upload/News/201510151310250.jpg  
    4.             //http://www.hello-code.com/blog/asp.net/201509/5392.html  
    5.             HttpClient httpClient = new HttpClient();  
    6.             httpClient.DefaultRequestHeaders.Add("user-agent""Mozilla/5.0 (compatible;MSIE 10.0;Windows NT 6.2;WOW64;Trident/6.0)");  
    7.   
    8.             if (String.IsNullOrEmpty(tbUrl.Text))  
    9.             {  
    10.                 tbstatus.Text = "输入的URL为空";  
    11.             }  
    12.             else  
    13.             {  
    14.                 try  
    15.                 {                  
    16.                     tbstatus.Text = " 等待响应......";  
    17.                     HttpResponseMessage response =  await httpClient.GetAsync(new Uri(tbUrl.Text));  
    18.                  
    19.                     response.EnsureSuccessStatusCode();//确保请求成功  
    20.                     tbstatus.Text = response.StatusCode + " " + response.ReasonPhrase;  
    21.   
    22.                     //请求html  
    23.   
    24.                     //字符串方式读取返回结果  
    25.                     string result = await response.Content.ReadAsStringAsync();  
    26.                     wv.NavigateToString(result);  
    27.   
    28.                     //Buffer方式读取  
    29.                     //IBuffer buffer = await   response.Content.ReadAsBufferAsync();  
    30.                     //using (var dataReader = DataReader.FromBuffer(buffer))  
    31.                     //{  
    32.                     //    string result = dataReader.ReadString(buffer.Length);  
    33.                     //    wv.NavigateToString(result);  
    34.                     //}  
    35.   
    36.                     //Stream方式读取  
    37.                     //var inputstream = await  response.Content.ReadAsInputStreamAsync();  
    38.                     // Stream stream= inputstream.AsStreamForRead();  
    39.                     // using (StreamReader reader=new StreamReader(stream))  
    40.                     // {  
    41.                     //   string result= reader.ReadToEnd();  
    42.                     //   wv.NavigateToString(result);  
    43.                     // }                 
    44.                 }  
    45.                 catch (Exception ex)  
    46.                 {  
    47.                     tbstatus.Text = ex.ToString();  
    48.                 }  
    49.             }  
    50.         }  
    请求图片

    在请求图片的时候,WriteToStreamAsync方法最简捷,后面的同样是为了折腾,但可以仔细体会一下。。。(PS:直接把网络图片的地址赋值给Image控件的Source属性就能显示图片啦,我是砸场子的!)
    1. private async void btn_get_Click(object sender, RoutedEventArgs e)  
    2.         {  
    3.             //http://www.hello-code.com/Upload/News/201510151310250.jpg  
    4.             //http://www.hello-code.com/news/daily/201510/18782.html  
    5.             HttpClient httpClient = new HttpClient();  
    6.             httpClient.DefaultRequestHeaders.Add("user-agent""Mozilla/5.0 (compatible;MSIE 10.0;Windows NT 6.2;WOW64;Trident/6.0)");  
    7.   
    8.             if (String.IsNullOrEmpty(tbUrl.Text))  
    9.             {  
    10.                 tbstatus.Text = "输入的URL为空";  
    11.             }  
    12.             else  
    13.             {  
    14.                 try  
    15.                 {  
    16.                     tbstatus.Text = " 等待响应......";  
    17.                     HttpResponseMessage response = await httpClient.GetAsync(new Uri(tbUrl.Text));  
    18.   
    19.                     response.EnsureSuccessStatusCode();//确保请求成功  
    20.                     tbstatus.Text = response.StatusCode + " " + response.ReasonPhrase;  
    21.   
    22.                     //请求图片                  
    23.                     BitmapImage bitmap = new BitmapImage();  
    24.   
    25.                     //   WriteToStreamAsync  
    26.                     using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())  
    27.                     {  
    28.                         await response.Content.WriteToStreamAsync(stream);  
    29.                         stream.Seek(0ul);  
    30.                         bitmap.SetSource(stream);  
    31.                         img.Source = bitmap;  
    32.                     }  
    33.   
    34.                     //         IInputStream   >>  IRandomAccessStream  
    35.                     //IInputStream inputStream = await response.Content.ReadAsInputStreamAsync();  
    36.                     //using (IRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream())  
    37.                     //{  
    38.                     //    using (IOutputStream outputStream = randomAccessStream.GetOutputStreamAt(0))  
    39.                     //    {  
    40.                     //        await RandomAccessStream.CopyAsync(inputStream, outputStream);  
    41.                     //        randomAccessStream.Seek(0);  
    42.   
    43.                     //        bitmap.SetSource(randomAccessStream);  
    44.                     //        img.Source = bitmap;  
    45.                     //    }  
    46.                     //}  
    47.   
    48.                     //          IBuffer  >> IRandomAccessStream  
    49.                     //IBuffer buffer = await response.Content.ReadAsBufferAsync();  
    50.                     //using (IRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream())  
    51.                     //{  
    52.                     //    using (DataWriter datawriter = new DataWriter(randomAccessStream.GetOutputStreamAt(0)))  
    53.                     //    {  
    54.                     //        datawriter.WriteBuffer(buffer, 0, buffer.Length);  
    55.                     //        await datawriter.StoreAsync();  
    56.                     //        randomAccessStream.Seek(0);  
    57.                     //        bitmap.SetSource(randomAccessStream);  
    58.                     //        img.Source = bitmap;  
    59.                     //    }  
    60.                     //}  
    61.                 }  
    62.                 catch (Exception ex)  
    63.                 {  
    64.                     tbstatus.Text = ex.ToString();  
    65.                 }  
    66.             }  
    67.         }  
  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:超级玛丽
  • 加入时间:2013/6/13 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮