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

搜索微博热搜,打开微博热搜官网,如下图所示:C#WPF实现简单爬虫以爬取微博热搜为例

复制该网址

创建一个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实现简单爬虫以爬取微博热搜为例

里面全都是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实现简单爬虫以爬取微博热搜为例

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

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

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

  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实现简单爬虫以爬取微博热搜为例

这是因为返回的内容是经过压缩的,需要进行解压缩

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实现简单爬虫以爬取微博热搜为例

可以发现所有的热搜都在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 { getset; }
        public int? Rank { getset; }
        public string? Content { getset; }

    }

遍历热搜所在的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实现简单爬虫以爬取微博热搜为例

将数据显示出来

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

前端Xaml代码如下所示:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="爬取微博热搜" Height="551" Width="734">
    <Grid >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Button Content="开始获取" VerticalAlignment="Center" Height="30" Width="80" Click="Button_Click"/>
        <ListView Grid.Column="1" x:Name="listview">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="时间" DisplayMemberBinding="{Binding Date}"/>
                    <GridViewColumn Header="排名" DisplayMemberBinding="{Binding Rank}"/>
                    <GridViewColumn Header="内容" DisplayMemberBinding="{Binding Content}"/>
                </GridView>
            </ListView.View>
        </ListView>
      
    </Grid>
</Window>
            

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 { getset; }
        public int? Rank { getset; }
        public string? Content { getset; }

    }
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    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<HotSearch>();
            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实现简单爬虫以爬取微博热搜为例

总结

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


原文始发于微信公众号(DotNet学习交流):C#WPF实现简单爬虫以爬取微博热搜为例

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/230939.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!