c#.net——c#.net异步实现网页信息爬取
之前研究各种语言异步的时候就想做一个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异步实现网页信息爬取相关推荐
- 使用selenium和第三方浏览器插件驱动完成搜狐网页信息爬取
from selenium import webdriver driver = webdriver.Chrome('chromedriver.exe')#引入驱动 driver.get('https: ...
- Python爬虫以及数据可视化分析之某站热搜排行榜信息爬取分析
目录 前言 一,确定目标 二,发送请求 三, 解析数据 四, 保存数据 pyecharts进行可视化 "某站"数据排名前10视频类型 "某站"标题标签可视化 & ...
- 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23866427 今天又遇到一个网页数据抓取的任务,给大家分享下. 说道网页信息抓取 ...
- python——爬虫实现网页信息抓取
首先实现关于网页解析.读取等操作我们要用到以下几个模块 import urllib import urllib2 import re 我们可以尝试一下用readline方法读某个网站,比如说百度 de ...
- Python+Selenium动态网页的信息爬取
录 一.Selenium 1.1 简介 1.2 配置 二.对百度进行自动化测试 2.1 进入百度搜索界面 2.2 自动填充百度网页的查询关键字并完成自动搜索 三.爬取指定网页的名言 3.1 找到元素 ...
- Python 爬虫 中国行政区划信息爬取 (初学者)
Python 爬虫 中国行政区划信息爬取 (初学者) 背景 环境准备 代码片段 1.定义地址信息对象 2.地址解析对象 2.1 获取web信息 2.2 web信息解析 2.3 区划信息提取 2.4 省 ...
- python循环爬取页面_使用for或while循环来处理处理不确定页数的网页数据爬取
本文转载自以下网站: Python For 和 While 循环爬取不确定页数的网页 https://www.makcyun.top/web_scraping_withpython16.html 需 ...
- 爬虫入门—requests模块基础之药监企业信息爬取
爬虫入门-requests模块基础之药监企业信息爬取 Author: Labyrinthine Leo Init_time: 2021.02.22 Key Words: Spider.reques ...
- python获取网页数据对电脑性能_【Python】网页数据爬取实战
由于网页结构跟之前有变化,还不是很熟悉.代码待完善,问题记录: 腾讯新闻二级网页内容爬取有问题. 链家网站头文件没有用到. 爬取一条腾讯视频的header内容,存入txt.要求: 包含网页链接 包含t ...
最新文章
- 谈谈你对Android NDK的理解
- leetcode 287. 寻找重复数(Find the Duplicate Number)
- Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)的实现原理
- 【SharePoint 2010】SharePoint 2010开发方面的课堂中整理有关问题
- 配置透明网桥实现QinQ传输案例
- YBTOJ:单词频率(AC自动机)
- Java面试题17 牛客 下面哪个选项正确创建socket连接?
- ORA-02292:integrity constraint(xx) violated - child record found 外键关联,无法删除记录
- 大快人心!和P2P网贷彻底说再见
- python 函数中参数的传递方式(三分钟读懂)
- 天天学到夜里12点,感觉越学越迷茫,怎么办?
- Centos中安装memcached
- linux如何停止命令运行,linux的停止命令
- MATLAB中wcp什么意思,WCP是什么意思
- QT: 为自己的QT程序添加一个登录界面
- 成语答题赚小程序安装教程
- 计算圆周率π的C++实现(任意精度)
- 罗斯蒙特8800DF020SA3E1D1K3M5R10涡街流量计
- Elasticsearch 分片管理解析
- 食物과 學問의 萃聚
热门文章
- python怎么对文件行排序_使用Python对文本文件进行排序
- VS2019配置opencv详细图文教程和测试代码
- ubuntun 16.04环境安装Caffe过程
- ubuntu 20.04 下安装使用clash for windows
- 【Pytorch】X.view(-1)操作
- 软件外部接口和内部接口_java中的内部类内部接口详解
- Mybatis(5)自定义Mybatis分析以及自定义实现
- Anaconda安装tensorflow遇到的wrapt、load error、Twisted问题
- H5 水球加载动画 - canvas应用篇
- 一款漂亮的赞助打赏单页界面美化版源码