玩玩小爬虫——入门

简介:

   前段时间做一个产品,盈利方式也就是卖数据给用户,用wpf包装一下,当然数据提供方是由公司定向爬虫采集的,虽然在实际工作

中没有接触这一块,不过私下可以玩一玩,研究研究。

    既然要抓取网页的内容,肯定我们会有一个startUrl,通过这个startUrl就可以用广度优先的方式遍历整个站点,就如我们学习数据结

构中图的遍历一样。

既然有“请求网页”和“解析网页”两部分,在代码实现上,我们得需要有两个集合,分别是Todo和Visited集合,为了简单起见,我们

从单机版爬虫说起,说起爬虫,就必然逃避不了海量数据,既然是海量数据,那么性能问题不容忽视,在Todo和Visited集合的甄别

上,我们选择用Queue和HashSet,毕竟HashSet在定位查找方面只需常量的时间,下面我们用活动图来阐述一下。

在广度优先的时候,我们需要注意两个问题:

①:有的时候网页是相对地址,我们需要转化为绝对地址。

②:剔除外链。

看看其中我们一个部门的官网,广度遍历一下,看看有多少链接,当然是剔除外链的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    public class Program
    {
        static void Main(string[] args)
        {
            var crawler = new Crawler("http://www.weishangye.com/");

            crawler.DownLoad();

            //show 一下我们爬到的链接
            foreach (var item in Crawler.visited)
            {
                Console.WriteLine(item);
            }
        }
    }

    public class Crawler
    {
        //基地址
        public static Uri baseUri;
        public static string baseHost = string.Empty;

        /// <summary>
        /// 工作队列
        /// </summary>
        public static Queue<string> todo = new Queue<string>();

        //已访问的队列
        public static HashSet<string> visited = new HashSet<string>();

        public Crawler(string url)
        {
            baseUri = new Uri(url);

            //基域
            baseHost = baseUri.Host.Substring(baseUri.Host.IndexOf('.'));

            //抓取首地址入队
            todo.Enqueue(url);
        }

        public void DownLoad()
        {
            while (todo.Count > 0)
            {
                var currentUrl = todo.Dequeue();

                //当前url标记为已访问过
                visited.Add(currentUrl);

                var request = WebRequest.Create(currentUrl) as HttpWebRequest;

                var response = request.GetResponse() as HttpWebResponse;

                var sr = new StreamReader(response.GetResponseStream());

                //提取url,将未访问的放入todo表中
                RefineUrl(sr.ReadToEnd());
            }
        }

        /// <summary>
        /// 提取Url
        /// </summary>
        /// <param name="html"></param>
        public void RefineUrl(string html)
        {
            Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>");

            MatchCollection mc = reg.Matches(html);

            foreach (Match m in mc)
            {
                var url = m.Groups["url"].Value;

                if (url == "#")
                    continue;

                //相对路径转换为绝对路径
                Uri uri = new Uri(baseUri, url);

                //剔除外网链接(获取顶级域名)
                if (!uri.Host.EndsWith(baseHost))
                    continue;

                if (!visited.Contains(uri.ToString()))
                {
                    todo.Enqueue(uri.ToString());
                }
            }
        }
    }
}

 

当然还有很多优化的地方,既然是开篇也就这样了,快速入门才是第一位。

相关文章
|
1月前
|
数据采集 存储 前端开发
【爬虫pyspider教程】1.pyspider入门与基本使用
爬虫框架pyspider入门和基本用法。
43 0
|
1月前
|
数据采集 Web App开发 数据处理
Ruby网络爬虫教程:从入门到精通下载图片
Ruby网络爬虫教程:从入门到精通下载图片
|
3月前
|
数据采集 存储 机器人
Scrapy网络爬虫框架——从入门到实践
网络爬虫已经成为了信息获取的必备工具之一,而Scrapy作为Python中最流行的网络爬虫框架之一,具有高效、可扩展、易用等特点。本文将深入介绍Scrapy框架的概念和实践,帮助读者快速掌握构建高质量网络爬虫的方法。
57 0
|
3月前
|
数据采集 存储 调度
Scrapy:从入门到实践的网络爬虫框架
Scrapy是一款强大的Python网络爬虫框架,可以帮助开发者更高效地抓取互联网上的数据。本文将介绍Scrapy的概念和基本原理,详细讲解如何使用Scrapy框架实现一个简单的网络爬虫,并分享一些实战经验和技巧。
|
4月前
|
数据采集 XML 数据格式
python爬虫入门篇:如何解析爬取到的网页数据?试下最简单的BeautifulSoup库!
前面笔记解析了如何使用requests模块向网站发送http请求,获取到网页的HTML数据。这篇我们来如何使用BeautifulSoup模块来从HTML文本中提取我们想要的数据。Beautiful Soup,简称bs4,是Python的一个HTML或XML的解析库,一般用它来从网页中提取数据。
58 1
|
8月前
|
数据采集 存储 JSON
【Python入门系列】第十二篇:Python网络爬虫和数据抓取
网络爬虫是一种自动化程序,通过模拟人类浏览器的行为,自动访问网页并提取数据。Python提供了许多库和工具,使得编写网络爬虫变得相对简单。其中,常用的库包括requests、BeautifulSoup和Scrapy等。
209 2
|
11月前
|
数据采集 存储 机器人
网络爬虫的入门及爬取图片,文章,音频
>持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,[点击查看活动详情](https://juejin.cn/post/7147654075599978532 "https://juejin.cn/post/7147654075599978532") # 引言 今天带来一篇python的网络爬虫 # 网络爬虫的介绍 > 网络爬虫(又称为网页蜘蛛,[网络](https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C/143243?fromModule=lemma_inlink)机器人,在[FOAF](https://bai
|
数据采集 XML NoSQL
「Python」爬虫-1.入门知识简介
> 本文主要介绍了爬虫相关的入门知识。 > 本文目录 > > - 爬取小猫的图片 > - 写入文件相关 > - 正则表达式简介 > - bs4解析
132 0
|
数据采集 XML 前端开发
Python爬虫入门BeautifulSoup模块
Python爬虫入门BeautifulSoup模块
114 0