设计思路

主要基于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

.NET-App/NetSpider/

C# 爬虫小程序的更多相关文章

  1. 一个python爬虫小程序

    起因 深夜忽然想下载一点电子书来扩充一下kindle,就想起来python学得太浅,什么“装饰器”啊.“多线程”啊都没有学到. 想到廖雪峰大神的python教程很经典.很著名.就想找找有木有pdf版的 ...

  2. nodeJs爬虫小程序练习

    //爬虫小程序 var express = require('express'); //superagent是一个http的库,可以发起get和post请求 var superagent = requ ...

  3. 适合新手的Python爬虫小程序

    介绍:此程序是使用python做的一个爬虫小程序  爬取了python百度百科中的部分内容,因为这个demo是根据网站中的静态结构爬取的,所以如果百度百科词条的html结构发生变化 需要修改部分内容. ...

  4. 福利贴——爬取美女图片的Java爬虫小程序代码

    自己做的一个Java爬虫小程序 废话不多说.先上图. 目录命名是用标签缩写,假设大家看得不顺眼能够等完成下载后手动改一下,比方像有强迫症的我一样... 这是挂了一个晚上下载的总大小,只是还有非常多由于 ...

  5. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(协程池版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from gevent import monkey monkey.patch_all() from gevent.pool i ...

  6. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(线程池版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from queue import Queue import requests from lxml import etree ...

  7. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(多线程版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from queue import Queue import requests from lxml import etree ...

  8. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(多进程版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 import requests from lxml import etree from multiprocessing imp ...

  9. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正from selenium import webdriver import time class Douyu: "&q ...

  10. java实现一个简单的爬虫小程序

    前言 前些天无意间在百度搜索了一下以前写过的博客 我啥时候在这么多不知名的网站上发表博客了???点进去一看, 内容一模一样,作者却不是我... 然后又去搜了其他篇博客,果然,基本上每篇都在别的网站上有 ...

随机推荐

  1. ssh访问服务器端visdom

    在服务器端启动visdompython -m visdom.server在windows端,将服务器的8097端口重定向到windows端(做了映射绑定):ssh -L 8097:127.0.0.1: ...

  2. DQN(Deep Reiforcement Learning) 发展历程(一)

    目录 马尔可夫理论 马尔可夫性质 马尔可夫过程(MP) 马尔可夫奖励过程(MRP) 值函数(value function) MRP求解 马尔可夫决策过程(MDP) 效用函数 优化的值函数 贝尔曼等式 ...

  3. Django Rest Framework源码剖析(七)-----分页

    一.简介 分页对于大多数网站来说是必不可少的,那你使用restful架构时候,你可以从后台获取数据,在前端利用利用框架或自定义分页,这是一种解决方案.当然django rest framework提供 ...

  4. 20155318 《网络攻防》 Exp7 网络欺诈防范

    20155318 <网络攻防> Exp7 网络欺诈防范 基础问题 通常在什么场景下容易受到DNS spoof攻击 DNS spoof攻击即执行DNS欺骗攻击,通过使用Ettercap来进行 ...

  5. 汇编 for循环

    知识点: for循环生成代码1 for循环生成代码2 inc指令 一.一般情况下的for循环汇编代码分析 ;i<=;i++) { printf("%d,",i); } ...

  6. Photoshop CS4破解方法

    先在网上下载Photoshop CS4的版本,安装后按如下步骤操作即可. 激活码: 1330-1082-3503-2270-3738-6738 1330-1776-8671-6289-7706-291 ...

  7. [SHOI2012]随机树[期望dp]

    题意 初始 \(1\) 个节点,每次选定一个叶子节点并加入两个儿子直到叶子总数为 \(n\),问叶子节点深度和的平均值的期望以及最大叶子深度的期望. \(n\leq 100\) . 分析 对于第一问, ...

  8. Linux下设置和查看环境变量

    Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1 永久的:需要修改配置文件,变量永久生效. 2 临时的:使用export命令声明即可,变量在关闭shell时失效. 设置变量 ...

  9. 【原】python3.7 无法pip安装提示ssl错误解决方案

    问题 pip is configured with locations that require TLS/SSL, however the ssl module in Python is not av ...

  10. 微软职位内部推荐-Software Development Engineer II_Commerce

    微软近期Open的职位: Are you looking for a high impact project that involves processing of billions of dolla ...