zoukankan      html  css  js  c++  java
  • 爬虫技术 -- 进阶学习(七)简单爬虫抓取示例(附c#代码)

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

    通过给定一个初始的地址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过滤就行。

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

  • 相关阅读:
    优化tableView加载cell与model的过程
    java.net.UnknownHostException: master
    Give root password for maintenance(or type control -D to continue)
    软件自动化部署脚本
    关于yum网络版仓库(本地yum仓库的安装配置,如果没网了,做一个局域网内的yum仓库)
    一脸懵逼学习keepalived(对Nginx进行热备)
    一脸懵逼学习Nginx及其安装,Tomcat的安装
    一脸懵逼学习Linux的Shell编程
    一脸懵逼学习KafKa集群的安装搭建--(一种高吞吐量的分布式发布订阅消息系统)
    一脸懵逼学习Storm的搭建--(一个开源的分布式实时计算系统)
  • 原文地址:https://www.cnblogs.com/lmei/p/3485649.html
Copyright © 2011-2022 走看看