博客动态
Hi!欢迎来到Jerry Coding!公众号垃圾分类增加学习功能,关注下面的公众号一起来帮助Jerry学习更多垃圾分类知识吧!
微信扫码

扫一扫关注我

More
关于
New
RSS

C# winform 实现垃圾分类爬虫

2020年3月26日 Jerry 371 2020年4月8日

       C# winform 实现垃圾分类爬虫小程序,查询输入的物品具体属于什么垃圾。

       好久没有写代码了,仿佛人生没有了方向。python做爬虫很简单,但是界面就比较费劲了。而且python打包成exe也好大的包,于是又想研究研究c#。反正也是一天天的东搞西搞。

一、数据来源

       博主投机取巧,数据来自网站:https://lajifenleiapp.com/

       随便查询一个垃圾,发现网址规律都是这种:

https://lajifenleiapp.com/sk/卫生纸
https://lajifenleiapp.com/sk/黄瓜
https://lajifenleiapp.com/sk/塑料

       于是,一切就变得简单了,我们只需要构造url,访问解析结果就OK了。

二、构造界面

       新建一个c# winform程序,构造成下图样式,编辑框接收输入信息,点击查询按钮进行网页爬取、信息解析以及显示。

       远程请求使用webrequest完成,下面是一个简单的get请求的例子:

//Get
public string GetContent(string uri, Encoding coding)
{
	//Get请求中请求参数等直接拼接在url中
	WebRequest request = WebRequest.Create(uri);

	//返回对Internet请求的响应
	WebResponse resp = request.GetResponse();

	//从网络资源中返回数据流
	Stream stream = resp.GetResponseStream();

	StreamReader sr = new StreamReader(stream, coding);

	//将数据流转换文字符串
	string result = sr.ReadToEnd();

	//关闭流数据
	stream.Close();
	sr.Close();

	return result;
}

于是,我们只需要根据输入的垃圾信息构造出链接即可:

string url = "http://lajifenleiapp.com/sk/" + textBox1.Text;
string str = GetContent(url, Encoding.UTF8);

       使用 Console.WriteLine(str); 将返回的网页信息打印出来:没错,就是一个完整的html,具体内容和网页源代码看到的是一样的。

       找到其中最关键的一句,

<div style="width:fit-content; display:inline-block;border: 1.3px dashed #3c85ee;border-radius: 8px;padding:0px 20px;"><h1><span style="color:#D42121;">卫生纸</span><span style="color:#FBbC28;">&nbsp;属于&nbsp;</span><span style="#2e2a2b">干垃圾</span></h1></div>

       接下来的任务就是把每个返回网页的这一段解析就OK了。

三、结果解析 

       关于解析,有很多种方法,正则啊什么乱七八糟的,这里用别人写好的简单轮子 HtmlAgilityPack 解析。

       首先在项目中添加 HtmlAgilityPack 包,vs2019 点击工具--> nuget包管理-->管理程序包,输入 HtmlAgilityPack  安装到该项目即可。

       然后开始编写代码,

//创建对象
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

//加载html
doc.LoadHtml(str);

HtmlAgilityPack.HtmlNode htmlnode = doc.DocumentNode.SelectSingleNode("/html/body/div/div[4]/div[2]/div[3]/h1");

       根据 xpath 来获取带有结果信息的节点。xpath可以通过下面这个简单的方法复制到:最后得到的就是“/html/body/div/div[4]/div[2]/div[3]/h1”

       于是乎,轻松就可以得到这个节点,怎么取其中的信息也就很easy了。这里还要加个判断,因为可能输入的物品比较奇葩,万一搜索不到结果呢,这个节点会是null哦!

string s;
if (htmlnode != null)
{
	s = htmlnode.InnerText;
	s = s.Replace("&nbsp;", " ");
}
else 
{
	s = "未查询到相关信息!";
}

Console.WriteLine(s);
label3.Text = s;

       最后的实现就是这样了!


原创文章,转载请注明出处: https://jerrycoding.com/article/rubbish-winform

微信
支付宝

您尚未登录,暂时无法评论。请先 登录 或者 注册

0 人参与 | 0 条评论