搜索微博热搜,打开微博热搜官网,如下图所示:
复制该网址
创建一个wpf程序,添加一个按钮,点击按钮事件的代码如下所示:
//创建HttpClient对象
HttpClient client = new HttpClient();
//获取响应的页面
HttpResponseMessage response = await httpClient.GetAsync("https://s.weibo.com/top/summary/");
string html = await response.Content.ReadAsStringAsync();
查看html中的内容,如下图所示:
添加请求头的代码如下所示:
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的步骤如下图所示:
按照图中的顺序,打开微博热搜官方,点击右键,选择检查,点击网络,选择全部,点击刷新按钮,出现很多请求,选择URL与当前网址一样的请求,往下拉,找到Cookie,对应的值即是我们需要的Cookie,复制该Cookie
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是网页的结构,如下图所示:
new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }
这段代码的作用是配置 HttpClient
使用 GZip 压缩方法来处理响应数据,通过这样配置可以确保 HttpClient
在与支持 GZip 压缩的服务器通信时自动处理压缩和解压缩,以便能够以更高效的方式处理数据
HtmlAgilityPack是一个用于处理HTML文档的.NET库,它提供了一种方便的方式来解析、修改和操作HTML文档。它特别适用于需要从Web页面中提取数据或对HTML文档进行结构化处理的应用程序。
以下是HtmlAgilityPack的一些主要功能和用途:
HTML解析:HtmlAgilityPack可以帮助您将HTML文档解析为一个可操作的对象模型,使您能够轻松地访问文档中的元素和内容。
DOM操作:您可以使用HtmlAgilityPack来修改HTML文档,添加、删除或编辑元素和属性,以满足您的需求。
数据提取:它使您能够轻松地从HTML文档中提取所需的数据,例如网页抓取、数据挖掘或屏幕抓取等。
LINQ支持:HtmlAgilityPack与LINQ(Language-Integrated Query)结合使用,使您能够以一种更直观的方式查询和筛选HTML文档中的元素。
支持XPath:除了LINQ,HtmlAgilityPack还支持XPath,这是一种用于在XML和HTML文档中导航和定位元素的强大语言。
处理损坏的HTML:HtmlAgilityPack能够容忍和处理不完全或损坏的HTML,尽可能恢复文档的结构。
开源和跨平台:HtmlAgilityPack是一个开源项目,可以在不同的.NET平台上使用,包括.NET Framework和.NET Core。
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/。
确定热搜所在元素的位置如下图所示:
可以发现所有的热搜都在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);
}
结果如下图所示:
将数据显示出来
这里使用的是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#如何实现简单爬虫,其中涉及到的步骤为添加请求头、添加HttpClientHandler、使用HtmlAgilityPack解析网页(其中使用XPath进行定位)等。