C# 爬虫小程序
设计思路
主要基于Http Get请求网页数据,进行分析。涉及递归调用,多线程提高效率,守护线程等。
相关技术
- 抽象类
- 多线程
- 队列
- Http Get请求
- 字符串解析
项目结构
- AbsChain
职责链抽象类,负责定义HTML处理方法,定义递归处理方法等
- AbsThreadManager
线程管理抽象类,负责定义守望线程,管理多线程
- UrlQueue
URL队列对象,管理URL队列
- Crawl
爬虫对象,负责结合URL队列与职责链,运行爬取功能
- HttpGet
HTTP GET请求类,负责获取HTML文本
- ThreadEntity
爬虫线程,实体对象
简单爬虫示例
以下示例为一个简单的获取HTML页面文本示例,可以做到下载文本,并进行分析,可以说是最简单的爬虫
WebClient wc = new WebClient();
byte[] response = wc.DownloadData("http://www.weather.com.cn/weather/101120501.shtml");
string ss = Encoding.UTF8.GetString(response);
项目代码调用示例
- 创建继承类,继承职责链,负责具体爬虫方法
public class NodeChain : AbsChain
{
#region 去除头部的'与"
/// <summary>
/// 去除头部的'与"
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private string RemoveQuotation(string url)
{
if ((url.IndexOf("'") == 0) || (url.IndexOf("\"") == 0))
{
url = url.Remove(0, 1);
if (url.IndexOf("'") != -1)
{
url = url.Remove(url.IndexOf("'"), 1);
}
if (url.IndexOf("\"") != -1)
{
url = url.Remove(url.IndexOf("\""), 1);
}
}
if (url.IndexOf(" ") != -1)
{
url = url.Remove(url.IndexOf(" "));
}
return url;
}
#endregion
#region 处理网页
/// <summary>
/// 处理网页
/// </summary>
/// <param name="html"></param>
protected override void Process(string html)
{
try
{
Regex re = new Regex(@"href=(?<web_url>[\s\S]*?)>|href=""(?<web_url>[\s\S]*?)""|href='(?<web_url>[\s\S]*?)'");
MatchCollection mc = re.Matches(html);
foreach (Match m in mc)
{
string url = m.Groups["web_url"].ToString();
url = this.RemoveQuotation(url);
if (url.IndexOf("http://") != -1)
{
UrlQueue.GetInstance().Enqueue(url);
}
}
string title = string.Empty;
re = new Regex(@"<title[\s\S]*?>(?<title>[\s\S]*?)</title>");
Match temp = re.Match(html.ToLower());
title = temp.Groups["title"].ToString();
if (!string.IsNullOrEmpty(title))
{
Console.WriteLine(string.Format("网页标题:{0}",title));
Console.WriteLine(string.Format("网页URL:{0}", this.Url));
}
}
catch
{
}
}
#endregion
}
- 创建线程管理继承类,负责重写新建职责链对象
public class ThreadManager:AbsThreadManager
{
protected override AbsChain GetChainHeader()
{
return new NodeChain();
}
}
- 设置URL入口,运行爬虫
try
{
Console.Title = System.Configuration.ConfigurationManager.AppSettings["Title"].ToString();
Console.WriteLine("Process is running!");
string url = System.Configuration.ConfigurationManager.AppSettings["URL"].ToString();
UrlQueue.GetInstance().Enqueue(url);
ThreadManager thread = new ThreadManager();
thread.Start();
}
catch (Exception ex)
{
}
GitHub
C# 爬虫小程序的更多相关文章
- 一个python爬虫小程序
起因 深夜忽然想下载一点电子书来扩充一下kindle,就想起来python学得太浅,什么“装饰器”啊.“多线程”啊都没有学到. 想到廖雪峰大神的python教程很经典.很著名.就想找找有木有pdf版的 ...
- nodeJs爬虫小程序练习
//爬虫小程序 var express = require('express'); //superagent是一个http的库,可以发起get和post请求 var superagent = requ ...
- 适合新手的Python爬虫小程序
介绍:此程序是使用python做的一个爬虫小程序 爬取了python百度百科中的部分内容,因为这个demo是根据网站中的静态结构爬取的,所以如果百度百科词条的html结构发生变化 需要修改部分内容. ...
- 福利贴——爬取美女图片的Java爬虫小程序代码
自己做的一个Java爬虫小程序 废话不多说.先上图. 目录命名是用标签缩写,假设大家看得不顺眼能够等完成下载后手动改一下,比方像有强迫症的我一样... 这是挂了一个晚上下载的总大小,只是还有非常多由于 ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(协程池版)
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from gevent import monkey monkey.patch_all() from gevent.pool i ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(线程池版)
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from queue import Queue import requests from lxml import etree ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(多线程版)
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from queue import Queue import requests from lxml import etree ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(多进程版)
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 import requests from lxml import etree from multiprocessing imp ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正from selenium import webdriver import time class Douyu: "&q ...
- java实现一个简单的爬虫小程序
前言 前些天无意间在百度搜索了一下以前写过的博客 我啥时候在这么多不知名的网站上发表博客了???点进去一看, 内容一模一样,作者却不是我... 然后又去搜了其他篇博客,果然,基本上每篇都在别的网站上有 ...
随机推荐
- 关于javascript中对浮点加,减,乘,除的精度分析
大学专业是计算机童鞋或多或小的知道 计算机是由二进制存储和处理数字的,不能精确到处理浮点数,且javascript也没有这样的方法 所以在浏览器计算的时候也会有误差,比如说 我想用 3.3 / 1.1 ...
- Elasticsearch学习笔记2
Elasticsearch is a search engine based on Lucene library. It provides a distributed, multitenant-ca ...
- 20155202《网络对抗》Exp8 Web基础
20155202<网络对抗>Exp8 Web基础 基础问题回答 什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等)输入信息 ...
- Could not obtain transaction-synchronized Session for current thread原因及解决方案
在开发中,碰到到了Could not obtain transaction-synchronized Session for current thread异常,因此特意记录下. 一.问 ...
- POJ1035&&POJ3080&&POJ1936
字符串处理专题,很早就写好了然而忘记写blog了 1035 题意:给你一些单词作为字典.然后让你查找一些单词.对于每个单词,如果在字典中就输出它.否则输出所有它通过删除||增加||替换一个字符能得到的 ...
- 汇编 EBP ,ESP 寄存器
知识点: CALL框架 EBP寄存器 栈底指针 ESP寄存器 栈顶指针 一.EBP栈底指针 EBP是一个特殊的寄存器,通过EBP+偏移量 可以访问CALL里边的局部变量.它的低16位叫BP ...
- JavaScript快速入门-ECMAScript运算符
1.逻辑运算符 逻辑与:&&(and) 逻辑或:||(or) 逻辑非:!(not) 逻辑 AND 运算符(&&) 逻辑 AND 运算的运算数可以是任何类型的,不止是 B ...
- onSaveInstanceState和onRestoreInstanceState触发的时机
先看Application Fundamentals上的一段话: Android calls onSaveInstanceState() before the activity becomes vul ...
- 百炼1001: Exponentiation 解题
链接:http://bailian.openjudge.cn/practice/1001/ 思路 乍一看是很简单的题目,但是答案必须高精度输出,因此需要手动实现一个高精度运算方法.如果直接使用int, ...
- 关于使用单片机读取外部电压ADC阻抗匹配的问题
单片机的基准电压一般为3.3V,如果外部信号超过了AD测量范围,可以采用电阻分压的方法,但是要注意阻抗匹配问题.比如,SMT32的模数输入阻抗约为10K,如果外接的分压电阻无法远小于该阻值,则会因为信 ...