C#WPF实现简单爬虫以爬取微博热搜为例

搜索微博热搜,打开微博热搜官网,如下图所示:

C#WPF实现简单爬虫以爬取微博热搜为例_第1张图片

复制该网址

创建一个wpf程序,添加一个按钮,点击按钮事件的代码如下所示:

            //创建HttpClient对象
            HttpClient client = new HttpClient();
            //获取响应的页面
           HttpResponseMessage response = await httpClient.GetAsync("https://s.weibo.com/top/summary/");
           string html = await response.Content.ReadAsStringAsync();

查看html中的内容,如下图所示:

C#WPF实现简单爬虫以爬取微博热搜为例_第2张图片里面全都是js代码没有我们想要的数据

添加请求头

添加请求头的代码如下所示:

 var httpClient = new HttpClient();
 AddDefaultHeaders(httpClient);
 private static void AddDefaultHeaders(HttpClient httpClient)
        {
            httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.60");
            httpClient.DefaultRequestHeaders.Add("Host", "s.weibo.com");
            httpClient.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
            httpClient.DefaultRequestHeaders.Add("Accept-Language", "zh-CN,zh-Hans;q=0.9");
            httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate, br");
            httpClient.DefaultRequestHeaders.Add("Cookie", "自己的Cookie");
        }

查看Cookie

查看Cookie的步骤如下图所示:

C#WPF实现简单爬虫以爬取微博热搜为例_第3张图片

按照图中的顺序,打开微博热搜官方,点击右键,选择检查,点击网络,选择全部,点击刷新按钮,出现很多请求,选择URL与当前网址一样的请求,往下拉,找到Cookie,对应的值即是我们需要的Cookie,复制该Cookie

C#WPF实现简单爬虫以爬取微博热搜为例_第4张图片现在重新发送请求,发现返回结果是乱码

像下面这样改写代码之后,就可以了

 var httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip });
  AddDefaultHeaders(httpClient);
  //获取响应的页面
  HttpResponseMessage response = await httpClient.GetAsync("https://s.weibo.com/top/summary/");
  string html = await response.Content.ReadAsStringAsync();

现在html是网页的结构,如下图所示:

C#WPF实现简单爬虫以爬取微博热搜为例_第5张图片这是因为返回的内容是经过压缩的,需要进行解压缩

new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }

这段代码的作用是配置 HttpClient 使用 GZip 压缩方法来处理响应数据,通过这样配置可以确保 HttpClient 在与支持 GZip 压缩的服务器通信时自动处理压缩和解压缩,以便能够以更高效的方式处理数据

使用HtmlAgilityPack解析网页

HtmlAgilityPack介绍

HtmlAgilityPack是一个用于处理HTML文档的.NET库,它提供了一种方便的方式来解析、修改和操作HTML文档。它特别适用于需要从Web页面中提取数据或对HTML文档进行结构化处理的应用程序。

以下是HtmlAgilityPack的一些主要功能和用途:

  1. HTML解析:HtmlAgilityPack可以帮助您将HTML文档解析为一个可操作的对象模型,使您能够轻松地访问文档中的元素和内容。

  2. DOM操作:您可以使用HtmlAgilityPack来修改HTML文档,添加、删除或编辑元素和属性,以满足您的需求。

  3. 数据提取:它使您能够轻松地从HTML文档中提取所需的数据,例如网页抓取、数据挖掘或屏幕抓取等。

  4. LINQ支持:HtmlAgilityPack与LINQ(Language-Integrated Query)结合使用,使您能够以一种更直观的方式查询和筛选HTML文档中的元素。

  5. 支持XPath:除了LINQ,HtmlAgilityPack还支持XPath,这是一种用于在XML和HTML文档中导航和定位元素的强大语言。

  6. 处理损坏的HTML:HtmlAgilityPack能够容忍和处理不完全或损坏的HTML,尽可能恢复文档的结构。

  7. 开源和跨平台:HtmlAgilityPack是一个开源项目,可以在不同的.NET平台上使用,包括.NET Framework和.NET Core。

使用XPath进行定位

XPath介绍

XPath,全称 XML Path Language,即 XML 路径语言,它是一门在XML文档中查找信息的语言。XPath 最初设计是用来搜寻XML文档的,但是它同样适用于 HTML 文档的搜索。 XPath 的选择功能十分强大,它提供了非常简洁明了的路径选择表达式,另外它还提供了超过 100 个内建函数用于字符串、数值、时间的匹配以及节点、序列的处理等等,几乎所有我们想要定位的节点都可以用XPath来选择。

XPath 于 1999 年 11 月 16 日 成为 W3C 标准,它被设计为供 XSLT、XPointer 以及其他 XML 解析软件使用,更多的文档可以访问其官方网站:https://www.w3.org/TR/xpath/。

确定热搜所在元素的XPath

确定热搜所在元素的位置如下图所示:

C#WPF实现简单爬虫以爬取微博热搜为例_第6张图片

可以发现所有的热搜都在class=“data”的div元素下的table下的tbody下的tr下的td下的a中

因此XPath就是//div[@class="data"]/table/tbody/tr/td/a

选择所有热搜元素的代码如下所示:

 var nodes = doc.DocumentNode.SelectNodes("//div[@class=\"data\"]/table/tbody/tr/td/a"); 

创建保存热搜信息的自定义类 

创建保存热搜信息的自定义类的代码如下所示:

    public class HotSearch
    {
        public DateTime? Date { get; set; }
        public int? Rank { get; set; }
        public string? Content { get; set; }

    }

遍历热搜所在的a元素并将热搜数据写入列表

            //遍历目标div中的所有的a元素
            for (int i = 0; i < nodes.Count; i ++) 
            {
                HotSearch hotSearch = new HotSearch();
                hotSearch.Date = DateTime.Now;
                hotSearch.Rank = i;
                hotSearch.Content = nodes[i].InnerText;
                DataList.Add(hotSearch);
            }

结果如下图所示:

C#WPF实现简单爬虫以爬取微博热搜为例_第7张图片

将数据显示出来

这里使用的是WPF中的ListView控件

前端Xaml代码如下所示:


    
        
            
            
        
        

C#后台代码如下所示:  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
    public class HotSearch
    {
        public DateTime? Date { get; set; }
        public int? Rank { get; set; }
        public string? Content { get; set; }

    }
    /// 
    /// Interaction logic for MainWindow.xaml
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
         
        }
      


        private void Button_Click(object sender, RoutedEventArgs e)
        {
            GetData();
           
        }
        private static void AddDefaultHeaders(HttpClient httpClient)
        {
            httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.60");
            httpClient.DefaultRequestHeaders.Add("Host", "s.weibo.com");
            httpClient.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
            httpClient.DefaultRequestHeaders.Add("Accept-Language", "zh-CN,zh-Hans;q=0.9");
            httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate, br");
            httpClient.DefaultRequestHeaders.Add("Cookie", "自己的Cookie");
        }
        public async void GetData()
        {
            var DataList = new List();
            var httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip });
            AddDefaultHeaders(httpClient);
            //获取响应的页面
            HttpResponseMessage response = await httpClient.GetAsync("https://s.weibo.com/top/summary/");
            string html = await response.Content.ReadAsStringAsync();
            //使用HtmlAgilityPack解析网页内容
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(html);         
            var nodes = doc.DocumentNode.SelectNodes("//div[@class=\"data\"]/table/tbody/tr/td/a");   
            //遍历目标div中的所有的a元素
            for (int i = 0; i < nodes.Count; i ++) 
            {
                HotSearch hotSearch = new HotSearch();
                hotSearch.Date = DateTime.Now;
                hotSearch.Rank = i;
                hotSearch.Content = nodes[i].InnerText;
                DataList.Add(hotSearch);
            }
            listview.ItemsSource = DataList;

        }


    }
}

结果如下图所示:

C#WPF实现简单爬虫以爬取微博热搜为例_第8张图片总结 

本文以爬取微博热搜为例,说明了C#如何实现简单爬虫,其中涉及到的步骤为添加请求头、添加HttpClientHandler、使用HtmlAgilityPack解析网页(其中使用XPath进行定位)等。

你可能感兴趣的:(WPF,c#,爬虫,wpf,.net)