这是我的第一个爬虫代码。。。算是一份测试版的代码。大牛大神别喷。。。

通过给定一个初始的地址startPiont然后对网页进行捕捉,然后通过正则表达式对网址进行匹配。

List<string> todo :进行抓取的网址的集合

List<string> visited :已经访问过的网址的集合

下面实现的是,给定一个初始地址,然后进行爬虫,输出正在访问的网址和已经访问的网页的个数。

需要注意的是,下面代码实现的链接匹配页面的内容如图一、图二所示:

  • 图一:

  • 图二:

简单代码示范如下:(测试版)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Web.Security;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
using System.Web; namespace Demo1
{ public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Test1 a = new Test1();
a.getCurrentURL();
} public class Test1
{
List<string> todo = new List<string>();
List<string> visited = new List<string>();
string startPoint = "http://www.cnblogs.com/lmei/";

public void getCurrentURL()
{
RequestSite(startPoint); while (todo.Count > 0)
{
string currentURL = todo[0]; RequestSite(currentURL); if (visited.Contains(currentURL)) //注释1
{
Console.WriteLine("已经访问过了" + currentURL);
todo.Remove((currentURL));
}
else
{
Console.WriteLine("现在正在访问:===> " + currentURL);
visited.Add(currentURL); Console.WriteLine("目前已经访问了:===> " + visited.Count + "个网页" );
todo.Remove((currentURL));
}
}
} public void RequestSite(string url)
{
WebRequest req = WebRequest.Create(url);
HttpWebResponse res;
try{
res = (HttpWebResponse)(req.GetResponse());
}
catch (WebException ex) { res = (HttpWebResponse)ex.Response; } Stream st = res.GetResponseStream();
StreamReader rdr = new StreamReader(st);
string s = rdr.ReadToEnd();
todo.AddRange(GetLink(s));
} List<string> GetLink(string htmlPage)
{ Regex regx =
new Regex("http://www\\.cnblogs\\.com\\/lmei\\/p\\/[0-9a-zA-Z]+\\.html*" ,RegexOptions.IgnoreCase);
MatchCollection matches = regx.Matches(htmlPage); List<string> results = new List<string>();
foreach (Match match in matches)
{
if (!visited.Contains(match.Value)) //注释2
{
results.Add(match.Value);
}
}
return results;
}
} }
}

注释1 :是将已经访问过的网址排除。

注释2 :是将已经访问过的网址排除,但是可能由于同个网页中包含的两个(或两个以上)相同的链接,而且都没被访问过的,这样使得todo队列中会有相同的网址,所以需要注释1那部分进行再次过滤排除。其实也可以将注释2那部分删去,直接让注释1过滤就行。

接下来会进一步补充爬虫抓取的内容。。。

爬虫技术(四)-- 简单爬虫抓取示例(附c#代码)的更多相关文章

  1. 【Python3 爬虫】01_简单页面抓取

    运行平台:Winodows 10 Python版本:Python 3.4.2 IDE:Sublime text3 网络爬虫 网络爬虫,也叫网络蜘蛛(Web Spider),如果把互联网比喻成一个蜘蛛网 ...

  2. python爬虫构建代理ip池抓取数据库的示例代码

    爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...

  3. iOS—网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  4. iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  5. 爬虫学习一系列:urllib2抓取网页内容

    爬虫学习一系列:urllib2抓取网页内容 所谓网页抓取,就是把URL地址中指定的网络资源从网络中读取出来,保存到本地.我们平时在浏览器中通过网址浏览网页,只不过我们看到的是解析过的页面效果,而通过程 ...

  6. python爬虫之分析Ajax请求抓取抓取今日头条街拍美图(七)

    python爬虫之分析Ajax请求抓取抓取今日头条街拍美图 一.分析网站 1.进入浏览器,搜索今日头条,在搜索栏搜索街拍,然后选择图集这一栏. 2.按F12打开开发者工具,刷新网页,这时网页回弹到综合 ...

  7. Python网络爬虫(Get、Post抓取方式)

    简单的抓取网页 import urllib.request url="http://google.cn/" response=urllib.request.urlopen(url) ...

  8. arpspoof+driftnet+ ARP欺骗简单图片抓取

    arpspoof+driftnet+ ARP欺骗简单图片抓取 driftnet是一款简单而使用的图片捕获工具,可以很方便的在网络数据包中抓取图片.该工具可以实时和离线捕获指定数据包中是图片 环境 受害 ...

  9. [python应用]python简单图片抓取

    前言 emmmm python简单图片抓取 1 import requests 2 import threading 3 import queue 4 from subprocess import P ...

  10. 抓取oschina上面的代码分享python块区下的 标题和对应URL

    # -*- coding=utf-8 -*- import requests,re from lxml import etree import sys reload(sys) sys.setdefau ...

随机推荐

  1. Leetcode#49 Anagrams

    原题地址 Anagram:变位词.两个单词是变位词关系的条件是:组成单词的字符相同,只是顺序不同 第一次看这道题看了半天没明白要干嘛,丫就不能给个样例输入输出么..后来还是看网上其他人的总结知道是怎么 ...

  2. 【bzoj1010】[HNOI2008]玩具装箱toy

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9281  Solved: 3719[Submit][St ...

  3. vector存入共享内存(了解)

    昨天在上篇blog里描写了如何把STL容器放到共享内存里去,不过由于好久不写blog,发觉词汇组织能力差了很多,不少想写的东西写的很零散,今天刚好翻看自己的书签,看到一篇挺老的文章,不过从共享内存到S ...

  4. ubuntu安装后没有root密码

    新安装的ubuntu没有设置root密码,也就不能登录到root账户下.要想设置root密码需要在当前账户下输入sudo passwd,然后输入当前用户的密码,然后输入两次root的新密码,即可完成r ...

  5. delphi快捷键

    分类 快捷键 解释 备注 组 件 设 计 类 Escape 选择当前组件容器     Shift + Click 选择多个组件:选择窗体     Tab 选择下一个组件     Shift + Tab ...

  6. 就地交叉数组元素[a1a2b1b2]->[a1b1a2b2]

    问题描述: If [a1,a2,a3...,an,b1,b2...bn] is given input change this to [a1,b1,a2,b2.....an,bn] , solutio ...

  7. iOS视频压缩

    // // ViewController.m // iOS视频测试 // // Created by apple on 15/8/19. // Copyright (c) 2015年 tqh. All ...

  8. **关于PHP如何定义一个空对象(REST API如何处理空对象和空数组)

    在写接口的过程当中,手机端有需求说不让返回json数组,要返回一个对象. 那么我们可以怎么做呢? 其实很简单,强制转换即可. 声明空对象: $empty_object=(object)array(); ...

  9. java 哪些情况下会使对象锁释放

    Java_多线程_锁释放 问:Java多线程运行环境中,在哪些情况下会使对象锁释放?答:由于等待一个锁的线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不再需要锁的时候及时释放锁是很重要的 ...

  10. iOS开发--git

    http://blog.chinaunix.net/uid-26495963-id-3474178.html 相关知识 gnu interactive tools 一句话概括git: Git is a ...