前段时间做一个产品,盈利方式也就是卖数据给用户,用wpf包装一下,当然数据提供方是由公司定向爬虫采集的,虽然在实际工作
中没有接触这一块,不过私下可以玩一玩,研究研究。
既然要抓取网页的内容,肯定我们会有一个startUrl,通过这个startUrl就可以用广度优先的方式遍历整个站点,就如我们学习数据结
构中图的遍历一样。
既然有“请求网页”和“解析网页”两部分,在代码实现上,我们得需要有两个集合,分别是Todo和Visited集合,为了简单起见,我们
从单机版爬虫说起,说起爬虫,就必然逃避不了海量数据,既然是海量数据,那么性能问题不容忽视,在Todo和Visited集合的甄别
上,我们选择用Queue和HashSet,毕竟HashSet在定位查找方面只需常量的时间,下面我们用活动图来阐述一下。
在广度优先的时候,我们需要注意两个问题:
①:有的时候网页是相对地址,我们需要转化为绝对地址。
②:剔除外链。
看看其中我们一个部门的官网,广度遍历一下,看看有多少链接,当然是剔除外链的。
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Net;
6 using System.IO;
7 using System.Text.RegularExpressions;
8
9 namespace ConsoleApplication1
10 {
11 public class Program
12 {
13 static void Main(string[] args)
14 {
15 var crawler = new Crawler("http://www.weishangye.com/");
16
17 crawler.DownLoad();
18
19 //show 一下我们爬到的链接
20 foreach (var item in Crawler.visited)
21 {
22 Console.WriteLine(item);
23 }
24 }
25 }
26
27 public class Crawler
28 {
29 //基地址
30 public static Uri baseUri;
31 public static string baseHost = string.Empty;
32
33 /// <summary>
34 /// 工作队列
35 /// </summary>
36 public static Queue<string> todo = new Queue<string>();
37
38 //已访问的队列
39 public static HashSet<string> visited = new HashSet<string>();
40
41 public Crawler(string url)
42 {
43 baseUri = new Uri(url);
44
45 //基域
46 baseHost = baseUri.Host.Substring(baseUri.Host.IndexOf('.'));
47
48 //抓取首地址入队
49 todo.Enqueue(url);
50 }
51
52 public void DownLoad()
53 {
54 while (todo.Count > 0)
55 {
56 var currentUrl = todo.Dequeue();
57
58 //当前url标记为已访问过
59 visited.Add(currentUrl);
60
61 var request = WebRequest.Create(currentUrl) as HttpWebRequest;
62
63 var response = request.GetResponse() as HttpWebResponse;
64
65 var sr = new StreamReader(response.GetResponseStream());
66
67 //提取url,将未访问的放入todo表中
68 RefineUrl(sr.ReadToEnd());
69 }
70 }
71
72 /// <summary>
73 /// 提取Url
74 /// </summary>
75 /// <param name="html"></param>
76 public void RefineUrl(string html)
77 {
78 Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>");
79
80 MatchCollection mc = reg.Matches(html);
81
82 foreach (Match m in mc)
83 {
84 var url = m.Groups["url"].Value;
85
86 if (url == "#")
87 continue;
88
89 //相对路径转换为绝对路径
90 Uri uri = new Uri(baseUri, url);
91
92 //剔除外网链接(获取顶级域名)
93 if (!uri.Host.EndsWith(baseHost))
94 continue;
95
96 if (!visited.Contains(uri.ToString()))
97 {
98 todo.Enqueue(uri.ToString());
99 }
100 }
101 }
102 }
103 }
当然还有很多优化的地方,既然是开篇也就这样了,快速入门才是第一位。
分享到:
相关推荐
本文件中包含PPT与源码,主要讲解Python爬虫入门知识。
网站爬虫——图片抓取小工具
天籁数学——数列篇(1) 图形图像(1)玩玩图形图像——第一篇:图片灰度化 小爬虫系列(4)玩玩小爬虫——抓取时的几个小细节 玩玩小爬虫——抓取动态页面 玩玩小爬虫——试搭小架构 玩玩小爬虫——入门
基于消息队列的分布式爬虫——以电商产品数据为例.pdf
多个应用的 小红书 爬虫
基于消息队列的分布式爬虫——以电商产品数据为例
1082838225293101Python爬虫——快速批量抓取表格数据并保存至Excel中.rar
刚入门写的非常简单的爬虫练习代码,获取www.51yuansu.com的图片
一个Python爬虫实例,爬取微信公众号中的数据,实用性较强。
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...
实现自动逐层爬取网页,并将所爬网页中的链接写入文件
Python项目案例开发从入门到实战源代码第5章 爬虫应用——校园网搜索引擎
Python爬虫源码大放送:抓取数据,轻松搞定! 想轻松抓取网站数据,却苦于技术门槛太高?别担心,这些源码将助你轻松搞定数据抓取,让你成为网络世界的“数据侠盗”。 它们还具有超强的实用价值。无论你是想要分析...
Python爬虫入门教程Python爬虫入门教程Python爬虫入门教程Python爬虫入门教程Python爬虫入门教程Python爬虫入门教程Python爬虫入门教程Python爬虫入门教程Python爬虫入门教程Python爬虫入门教程Python爬虫入门教程...
爬取微博热门评论,可以自由选择需要爬取的微博以及要爬取的页数,需要安装谷歌浏览器
1.导入需要的库 import time from selenium import webdriver 2.浏览器获取驱动 需要下载跟chrome浏览器相匹配的驱动driverchrome.exe,详情见:根据电脑浏览器的版本下载相应的驱动chromedriver.exe,环境变量的...
python网络爬虫,抓取新浪新闻信息,包括新闻标题、时间、来源、正文等
反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等...
萌新入坑代码,大佬勿喷