之前研究各种语言异步的时候就想做一个C#版本的异步,但是毕竟好久不做了(也就是在大学期间用asp.net做了几个管理系统)

一开始写代码时完全蒙蔽了,语法啥的都忘差不多了~~研究了好几天,也参考了网上许多资料,终于写出了几行low逼代码

实现内容:异步并发爬取网页信息

首先异步的语法和其他语言都大同小异,async、await,定义异步方法的话要加async修饰符,如果你想在await调用,那么返回值必须为 Task

若返回值为Task,但是我们并没有await,也就是阻塞时返回继续执行,VS编译器也会给予提示,但可以正常运行

接下来说一下爬取程序的实现,也是也很简单,就是HTML匹配抓取关键字

先写一个方法 实现文本截取

    public static string get_key_by_content(string content, string start, string end){if (content.Contains(start) && content.Contains(end)){int start_point = content.IndexOf(start, 0, System.StringComparison.Ordinal) + start.Length;int end_point = content.IndexOf(end, start_point, System.StringComparison.Ordinal);return content.Substring(start_point, end_point - start_point);}else{return "";}}

以CSDN博客为例,截取标题、阅读量等信息

我们发现标题有一个超链接,于是我们把帖子的子url摘出来

                string link_view = Common.get_key_by_content(content, "<span class=\"link_view\" title=\"阅读次数\">", "</span>");string link_title = Common.get_key_by_content(content, "<span class=\"link_title\"><a href=\"/"+childurl+"\">", "</a>");

整个爬取函数:

 static async Task Spider(string RootUrl, int child, string childurl){using (var client = new HttpClient()){client.BaseAddress = new Uri(RootUrl);client.DefaultRequestHeaders.Accept.Clear();client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));try{HttpResponseMessage response = await client.GetAsync(childurl);response.EnsureSuccessStatusCode();   string content = await response.Content.ReadAsStringAsync();string link_view = Common.get_key_by_content(content, "<span class=\"link_view\" title=\"阅读次数\">", "</span>");string link_title = Common.get_key_by_content(content, "<span class=\"link_title\"><a href=\"/"+childurl+"\">", "</a>");Console.WriteLine("第" + (child + 1).ToString() + "个帖子 " + link_title+"   "+link_view);}catch (HttpRequestException e){Console.WriteLine(e.Message);}}}

然后我们定义执行异步任务函数

static async void StartTask(string url){for (int p = 0; p < Common.get_article_length(); p++){//await WhileRun(url, p, Common.get_article_by_id(p));WhileRun(url, p, Common.get_article_by_id(p));}}static async Task WhileRun(string RootUrl, int p, string childurl){while (true){await Spider(RootUrl, p, childurl);Thread.Sleep(1000);}}

接下来只要定义几个帖子就可以了,由于C#没有全局的概念,所以我们要封装成一个类,同时给出获取帖子地址、帖子总数长度等方法。

完整代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;public class Common
{static string[] articles = {"sm9sun/article/details/75395020","sm9sun/article/details/75446875","sm9sun/article/details/75449050","sm9sun/article/details/75735001","sm9sun/article/details/75309443","sm9sun/article/details/76358660"};public static string get_article_by_id(int id){if(id < articles.Length&&id>=0){return articles[id];}else{return "error";}}public static int get_article_length(){return articles.Length;}public static string get_key_by_content(string content, string start, string end){if (content.Contains(start) && content.Contains(end)){int start_point = content.IndexOf(start, 0, System.StringComparison.Ordinal) + start.Length;int end_point = content.IndexOf(end, start_point, System.StringComparison.Ordinal);return content.Substring(start_point, end_point - start_point);}else{return "";}}}class Program
{static void Main(){string RootUrl = "http://blog.csdn.net";StartTask(RootUrl);Console.WriteLine("gogogo!");Console.ReadLine();}static async void StartTask(string url){for (int p = 0; p < Common.get_article_length(); p++){//await WhileRun(url, p, Common.get_article_by_id(p));WhileRun(url, p, Common.get_article_by_id(p));}}static async Task WhileRun(string RootUrl, int p, string childurl){while (true){await Spider(RootUrl, p, childurl);Thread.Sleep(1000);}}static async Task Spider(string RootUrl, int child, string childurl){using (var client = new HttpClient()){client.BaseAddress = new Uri(RootUrl);client.DefaultRequestHeaders.Accept.Clear();client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));try{HttpResponseMessage response = await client.GetAsync(childurl);response.EnsureSuccessStatusCode();   string content = await response.Content.ReadAsStringAsync();string link_view = Common.get_key_by_content(content, "<span class=\"link_view\" title=\"阅读次数\">", "</span>");string link_title = Common.get_key_by_content(content, "<span class=\"link_title\"><a href=\"/"+childurl+"\">", "</a>");Console.WriteLine("第" + (child + 1).ToString() + "个帖子 " + link_title+"   "+link_view);}catch (HttpRequestException e){Console.WriteLine(e.Message);}}}
}

运行截图:

顺带一提,我不是故意刷阅读量的~!~!

不是~!~!

真的不是~!~!

c#.net——c#.net异步实现网页信息爬取相关推荐

  1. 使用selenium和第三方浏览器插件驱动完成搜狐网页信息爬取

    from selenium import webdriver driver = webdriver.Chrome('chromedriver.exe')#引入驱动 driver.get('https: ...

  2. Python爬虫以及数据可视化分析之某站热搜排行榜信息爬取分析

    目录 前言 一,确定目标 二,发送请求 三, 解析数据 四, 保存数据 pyecharts进行可视化 "某站"数据排名前10视频类型 "某站"标题标签可视化 & ...

  3. 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23866427 今天又遇到一个网页数据抓取的任务,给大家分享下. 说道网页信息抓取 ...

  4. python——爬虫实现网页信息抓取

    首先实现关于网页解析.读取等操作我们要用到以下几个模块 import urllib import urllib2 import re 我们可以尝试一下用readline方法读某个网站,比如说百度 de ...

  5. Python+Selenium动态网页的信息爬取

    录 一.Selenium 1.1 简介 1.2 配置 二.对百度进行自动化测试 2.1 进入百度搜索界面 2.2 自动填充百度网页的查询关键字并完成自动搜索 三.爬取指定网页的名言 3.1 找到元素 ...

  6. Python 爬虫 中国行政区划信息爬取 (初学者)

    Python 爬虫 中国行政区划信息爬取 (初学者) 背景 环境准备 代码片段 1.定义地址信息对象 2.地址解析对象 2.1 获取web信息 2.2 web信息解析 2.3 区划信息提取 2.4 省 ...

  7. python循环爬取页面_使用for或while循环来处理处理不确定页数的网页数据爬取

    本文转载自以下网站: Python For 和 While 循环爬取不确定页数的网页  https://www.makcyun.top/web_scraping_withpython16.html 需 ...

  8. 爬虫入门—requests模块基础之药监企业信息爬取

    爬虫入门-requests模块基础之药监企业信息爬取 Author: Labyrinthine Leo   Init_time: 2021.02.22 Key Words: Spider.reques ...

  9. python获取网页数据对电脑性能_【Python】网页数据爬取实战

    由于网页结构跟之前有变化,还不是很熟悉.代码待完善,问题记录: 腾讯新闻二级网页内容爬取有问题. 链家网站头文件没有用到. 爬取一条腾讯视频的header内容,存入txt.要求: 包含网页链接 包含t ...

最新文章

  1. 谈谈你对Android NDK的理解
  2. leetcode 287. 寻找重复数(Find the Duplicate Number)
  3. Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)的实现原理
  4. 【SharePoint 2010】SharePoint 2010开发方面的课堂中整理有关问题
  5. 配置透明网桥实现QinQ传输案例
  6. YBTOJ:单词频率(AC自动机)
  7. Java面试题17 牛客 下面哪个选项正确创建socket连接?
  8. ORA-02292:integrity constraint(xx) violated - child record found 外键关联,无法删除记录
  9. 大快人心!和P2P网贷彻底说再见
  10. python 函数中参数的传递方式(三分钟读懂)
  11. 天天学到夜里12点,感觉越学越迷茫,怎么办?
  12. Centos中安装memcached
  13. linux如何停止命令运行,linux的停止命令
  14. MATLAB中wcp什么意思,WCP是什么意思
  15. QT: 为自己的QT程序添加一个登录界面
  16. 成语答题赚小程序安装教程
  17. 计算圆周率π的C++实现(任意精度)
  18. 罗斯蒙特8800DF020SA3E1D1K3M5R10涡街流量计
  19. Elasticsearch 分片管理解析
  20. 食物과 學問의 萃聚

热门文章

  1. python怎么对文件行排序_使用Python对文本文件进行排序
  2. VS2019配置opencv详细图文教程和测试代码
  3. ubuntun 16.04环境安装Caffe过程
  4. ubuntu 20.04 下安装使用clash for windows
  5. 【Pytorch】X.view(-1)操作
  6. 软件外部接口和内部接口_java中的内部类内部接口详解
  7. Mybatis(5)自定义Mybatis分析以及自定义实现
  8. Anaconda安装tensorflow遇到的wrapt、load error、Twisted问题
  9. H5 水球加载动画 - canvas应用篇
  10. 一款漂亮的赞助打赏单页界面美化版源码