当前位置:首页 » 网站资讯 » 如何爬网站的所有路径
扩展阅读
为什么叫网站打不开 2025-09-30 04:25:54
网络正常wifi无网络 2025-09-30 04:09:12

如何爬网站的所有路径

发布时间: 2023-02-09 18:36:33

如何寻找网站后台(小白必看)

【查找网站后台的方法】

1.猜解常用路径

常用后台路径:

Admin

Adminlogin

Admin/admin_login.asp

Admin/admin_login.php

Manage

User

System

大部分网站默认都是admin目录后台。

2.Robots.txt

Robots是防止搜索引擎抓取敏感目录和文件的的一个指引文件。

Admin/

很多管理员为了防止后台被搜索引擎抓取,所有会把后台路径放进robots.txt里

类似robots.txt sitemap.xml

3.扫描工具

如果字典内有目标的后台路径,那么就可以扫出来(可能会有复杂的情况,禁止扫描等 不过很少)

4.爬行(Awvs  burp suite 整站爬行工具)

扫描:暴力猜解  利用字典

爬行:

访问网站首页:

A界面存在很多链接

    抓取A界面的所有链接,分别变成B C D 等等

            继续抓取B C D界面,一直循环。直到爬行完。

5.查看图片属性

什么会爆出后台路径?

当我们上传点在后台目录后面,很有可能导致这种情况。

一般编辑器放在后台目录后面,基本上都可以用这种方法找到后台。

6.谷歌语法 site:目标站 intitle:后台 管理 登录 管理员 管理中心  inurl:admin|login|user

site:zlgc.usx.e.cn

7.网站位置暴露管理入口

背景:

尤其是多个管理员的网站,一般学校和行政单位居多。为了方便登录后台,会在前台留一个入口。

⑵ 知道图片的路径,怎么做爬虫爬取网站的所有

图片路径没必要让爬虫抓,除非你就是个素材型网站,那ALT一定要去设置,让爬虫抓取,到站长平台主动推送或者做sitemap地图给平台就O了

⑶ 如何查看百度蜘蛛路径

通过分析IIS日志查看网络蜘蛛路径
一、IIS日志的重要作用
1.通过IIS日志可以了解蜘蛛对网站的基本爬取情况,可以知道蜘蛛的爬取轨迹和爬取量,通过我们的IIS日志,外链的多和少和网站蜘蛛的爬取量是有直接影响的,我们所说的链接诱饵就是如果你做了一个外链,蜘蛛在爬取这个外链页面并把页面放出来时,蜘蛛可以通过你留的这个链接来爬取你的网站,而IIS 日志正是会记录下蜘蛛的这次爬取行动。
2.网站的更新频率也和IIS日志中蜘蛛抓取的频率有关,一般来说更新频率越高,蜘蛛的抓取频率越高,而我们网站的更新不仅仅只是新内容的添加同时还有我们的微调操作。
3.我们可以根据IIS日志的反应情况,对我们的空间的某些事情和问题提前进行预警,因为服务器如果出问题的话在IIS日志中会第一时间反映出来,要知道服务器的稳定速度和打开速度两者都会直接影响我们的网站。
4.通过IIS日志我们可以知道网站的那些页面是很受蜘蛛欢迎的,而哪些页面是蜘蛛连碰都不去碰的,同时我们还能发现有一些蜘蛛由于是过度爬取对我们的服务器资源损耗是很大的,我们要进行屏蔽工作。
二、如何下载日志及日志设置注意事项
1.首先我们的空间要支持IIS日志下载,这一点是很重要的,在我们购买空间之前必须要先问好支不支持IIS日志下载,因为有的服务商是不提供这项服务的,如果支持的话空间后台一般都有日志WebLog日志下载这个功能把它下载到根目录在用FTP传到本地就可以,服务器的话可以设置将日志文件下载到指定路径。
2.这里有个很重要的问题,IIS日志强烈建议设置成每小时生成一次,小型的企业站和页面内容较少的网站可以设置成一天,它默认是一天,如果内容多或者大型站设置成一天生成一次,那么一天只生成一个文件,这个文件会相当的大,我们有时电脑打开是会造成死机,设置的话找空间商协调设置即可。
三、IIS日志的分析
1.日志的后缀名是log的我们用记事本打开,选择格式里的自动换行这样看起来方便,同时用搜索功能搜索BaiSpider和Googlebot这两个蜘蛛。
例如:
网络蜘蛛
2012-03-1300:47:10W3SVC177116.255.169.37GET/-80-220.181.51.144Baispider-favo+(+/search/spider)2000015256197265?
谷歌机器人
2012-03-1308:18:48W3SVC177116.255.169.37GET/robots.txt-80-222.186.24.26Googlebot/2.1+(+google/bot)2000098520031?
我们分段来解释
2012-03-1300:47:10蜘蛛爬取的日期和时间点
W3SVC177这个是机器码这个是惟一的我们不去管它
116.255.169.37这个IP地址是服务器的IP地址
GET代表事件
GET后面就是蜘蛛爬取的网站页面,斜杠就代表首页
80是端口的意思
220.181.51.144这个IP则是蜘蛛的IP,这里告诉大家一个鉴别真假网络蜘蛛的方法,我们电脑点击开始运行输入cmd打开命令提示符,输入nslookup空格加蜘蛛IP点击回车,一般真网络蜘蛛都有自己的服务器IP而假蜘蛛则没有。
如果网站中出现了大量的假蜘蛛则说明有人冒充网络蜘蛛来采集你的内容,你就需要注意了,如果太猖獗那会很占用你的服务器资源,我们需要屏蔽他们的IP.
20000这里是状态码状态码的意思可以在网络里搜索下
197265最后两个数字则代表着访问和下载的数据字节数。
2.我们分析的时候先看看状态码200代表下载成功,304代表页面未修改,500代表服务器超时,这些是一般的其他代码可以网络一下,对于不同的问题我们要处理。
3.我们要看蜘蛛经常爬取哪些页面,我们要记录下来,分析他们为什么会经常被蜘蛛爬取,从而分析出蜘蛛所喜欢内容。?
4.有时候我们的路径不统一出现带斜杠和不带斜杠的问题,蜘蛛会自动识别为301跳转到带斜杠的页面,这里我们就发现了搜索引擎是可以判断我们的目录的,所以我们要对我们的目录进行统一。
5.我们分析日志分析时间长了,我们能够看出蜘蛛的抓取规律,同一目录下面的单个文件的抓取频率间隔和不同目录的抓取频率间隔都可以看出来,这些抓取频率间隔时间是蜘蛛根据网站权重和网站更新频率来自动确定的。
6.蜘蛛对于我们的页面的抓取是分等级的,是根据权重依次递减的,一般顺序为首页、目录页、内页。
7.不同IP的蜘蛛他们的抓取频率也是不相同的。

⑷ scrapy爬取整个网页时如何避免链接失效

最近在使用scrapy爬取网页时遇到很多图片不能正常显示、a标签链接失效的情况,多是因为爬下来的网页和图片路径已经失去了原有的结构,网页无法根据标签的src或者标签的href找到对应的资源,下面就这个问题展开一个小研究。

首先,做这个工作是一定要修改网页的,所以我们引入BeautifulSoup库对网页进行解析。

其次,在本文中 所有的网页以域名为目录名进行保存

下面我们 分情况讨论

大体上看,网页中的链接有以下几种格式:

第一种情况,链接直接以/开头,很明显是从网站的根目录开始检索,那么我们直接将该网站的存储路径加在page前即可(home_path代表当前网页在我们系统中保存的路径,包含域名):

第二种情况,链接直接以http开头,结尾可能有'/'也可能没有,此时我们直接将其索引至域名目录下的index.html或index.jsp,具体看你要爬的网页的特征,此处只做示例, dir_website为我们保存爬取的网页的路径,不包含域名

第三种情况,链接仍以http开头,结尾是资源的具体路径,这时候我们不仅要提取域名,还要提取出资源的位置。

注意,这个域名一定要从链接中提取,而不是直接插入当前爬取的网站域名,这是因为 href里的链接不一定来源于当前网站 ,有可能索引到其他的网站,这时候如果我们同时爬取了它索引到的网站,通过这种方法我们仍然能够正常访问。

第四种情况——'#content',href里的链接以'#'开头,代表你点击这个链接后在当前页面内查找id='content'的元素,并切换到该元素所在的位置。这种链接我们并不需要处理,直接continue即可。

第五种和第六种情况我们可以一起处理,这得益于python中path模块的一个方法:

这个方法是什么意思呢,它可以把传入的url的格式调整为正确的格式,比如:

有了这个方法,我们可以直接转换第五种和第六种情况的链接。

至于第七种情况,很明显这种链接是通过向后端的Servlet发送请求来获取页面,而我们爬下来的网页是没有后端的,但是我们确实能够通过scrapy爬到这个网页,那我们就把爬下来的网页加上.html的后缀,然后给这个链接也加上后缀,我们就可以通过点击链接来访问目标资源了。

当然,在那之前,我们得去掉网页链接里的'/',因为我们保存的网页文件名字里是不可能包含'/'的。

至此,我们已经解决了大多数爬下来的网页资源不可达的问题了,以上是对于<a>标签做的处理,<img>标签同理,就不再赘述。

还有一种比较少见的情况,就是网页内的资源url是经过编码的,比如'%'会变成'%25',此时我们只要将保存文件的名称进行解码后再保存即可,相关函数是urllib.unquote()。而网页内的链接无须解码,因为它们在访问资源时会自动解码。

⑸ 精通Python网络爬虫之网络爬虫学习路线

欲精通Python网络爬虫,必先了解网络爬虫学习路线,本篇经验主要解决这个问题。部分内容参考自书籍《精通Python网络爬虫》。

作者:韦玮

转载请注明出处

随着大数据时代的到来,人们对数据资源的需求越来越多,而爬虫是一种很好的自动采集数据的手段。

那么,如何才能精通Python网络爬虫呢?学习Python网络爬虫的路线应该如何进行呢?在此为大家具体进行介绍。

1、选择一款合适的编程语言

事实上,Python、PHP、JAVA等常见的语言都可以用于编写网络爬虫,你首先需要选择一款合适的编程语言,这些编程语言各有优势,可以根据习惯进行选择。在此笔者推荐使用Python进行爬虫项目的编写,其优点是:简洁、掌握难度低。

2、掌握Python的一些基础爬虫模块

当然,在进行这一步之前,你应当先掌握Python的一些简单语法基础,然后才可以使用Python语言进行爬虫项目的开发。

在掌握了Python的语法基础之后,你需要重点掌握一个Python的关于爬虫开发的基础模块。这些模块有很多可以供你选择,比如urllib、requests等等,只需要精通一个基础模块即可,不必要都精通,因为都是大同小异的,在此推荐的是掌握urllib,当然你可以根据你的习惯进行选择。

3、深入掌握一款合适的表达式

学会了如何爬取网页内容之后,你还需要学会进行信息的提取。事实上,信息的提取你可以通过表达式进行实现,同样,有很多表达式可以供你选择使用,常见的有正则表达式、XPath表达式、BeautifulSoup等,这些表达式你没有必要都精通,同样,精通1-2个,其他的掌握即可,在此建议精通掌握正则表达式以及XPath表达式,其他的了解掌握即可。正则表达式可以处理的数据的范围比较大,简言之,就是能力比较强,XPath只能处理XML格式的数据,有些形式的数据不能处理,但XPath处理数据会比较快。

4、深入掌握抓包分析技术

事实上,很多网站都会做一些反爬措施,即不想让你爬到他的数据。最常见的反爬手段就是对数据进行隐藏处理,这个时候,你就无法直接爬取相关的数据了。作为爬虫方,如果需要在这种情况下获取数据,那么你需要对相应的数据进行抓包分析,然后再根据分析结果进行处理。一般推荐掌握的抓包分析工具是Fiddler,当然你也可以用其他的抓包分析工具,没有特别的要求。

5、精通一款爬虫框架

事实上,当你学习到这一步的时候,你已经入门了。

这个时候,你可能需要深入掌握一款爬虫框架,因为采用框架开发爬虫项目,效率会更加高,并且项目也会更加完善。

同样,你可以有很多爬虫框架进行选择,比如Scrapy、pySpider等等,一样的,你没必要每一种框架都精通,只需要精通一种框架即可,其他框架都是大同小异的,当你深入精通一款框架的时候,其他的框架了解一下事实上你便能轻松使用,在此推荐掌握Scrapy框架,当然你可以根据习惯进行选择。

6、掌握常见的反爬策略与反爬处理策略

反爬,是相对于网站方来说的,对方不想给你爬他站点的数据,所以进行了一些限制,这就是反爬。

反爬处理,是相对于爬虫方来说的,在对方进行了反爬策略之后,你还想爬相应的数据,就需要有相应的攻克手段,这个时候,就需要进行反爬处理。

事实上,反爬以及反爬处理都有一些基本的套路,万变不离其宗,这些后面作者会具体提到,感兴趣的可以关注。

常见的反爬策略主要有:

IP限制

UA限制

Cookie限制

资源随机化存储

动态加载技术

……

对应的反爬处理手段主要有:

IP代理池技术

用户代理池技术

Cookie保存与处理

自动触发技术

抓包分析技术+自动触发技术

……

这些大家在此先有一个基本的思路印象即可,后面都会具体通过实战案例去介绍。

7、掌握PhantomJS、Selenium等工具的使用

有一些站点,通过常规的爬虫很难去进行爬取,这个时候,你需要借助一些工具模块进行,比如PhantomJS、Selenium等,所以,你还需要掌握PhantomJS、Selenium等工具的常规使用方法。

8、掌握分布式爬虫技术与数据去重技术

如果你已经学习或者研究到到了这里,那么恭喜你,相信现在你爬任何网站都已经不是问题了,反爬对你来说也只是一道形同虚设的墙而已了。

但是,如果要爬取的资源非常非常多,靠一个单机爬虫去跑,仍然无法达到你的目的,因为太慢了。

所以,这个时候,你还应当掌握一种技术,就是分布式爬虫技术,分布式爬虫的架构手段有很多,你可以依据真实的服务器集群进行,也可以依据虚拟化的多台服务器进行,你可以采用urllib+redis分布式架构手段,也可以采用Scrapy+redis架构手段,都没关系,关键是,你可以将爬虫任务部署到多台服务器中就OK。

至于数据去重技术,简单来说,目的就是要去除重复数据,如果数据量小,直接采用数据库的数据约束进行实现,如果数据量很大,建议采用布隆过滤器实现数据去重即可,布隆过滤器的实现在Python中也是不难的。

以上是如果你想精通Python网络爬虫的学习研究路线,按照这些步骤学习下去,可以让你的爬虫技术得到非常大的提升。

至于有些朋友问到,使用Windows系统还是Linux系统,其实,没关系的,一般建议学习的时候使用Windows系统进行就行,比较考虑到大部分朋友对该系统比较数据,但是在实际运行爬虫任务的时候,把爬虫部署到Linux系统中运行,这样效率比较高。由于Python的可移植性非常好,所以你在不同的平台中运行一个爬虫,代码基本上不用进行什么修改,只需要学会部署到Linux中即可。所以,这也是为什么说使用Windows系统还是Linux系统进行学习都没多大影响的原因之一。

本篇文章主要是为那些想学习Python网络爬虫,但是又不知道从何学起,怎么学下去的朋友而写的。希望通过本篇文章,可以让你对Python网络爬虫的研究路线有一个清晰的了解,这样,本篇文章的目的就达到了,加油!

本文章由作者韦玮原创,转载请注明出处。

⑹ Python中怎么用爬虫爬

Python爬虫可以爬取的东西有很多,Python爬虫怎么学?简单的分析下:
如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,让爬虫变得简单、容易上手。
利用爬虫我们可以获取大量的价值数据,从而获得感性认识中不能得到的信息,比如:
知乎:爬取优质答案,为你筛选出各话题下最优质的内容。
淘宝、京东:抓取商品、评论及销量数据,对各种商品及用户的消费场景进行分析。
安居客、链家:抓取房产买卖及租售信息,分析房价变化趋势、做不同区域的房价分析。
拉勾网、智联:爬取各类职位信息,分析各行业人才需求情况及薪资水平。
雪球网:抓取雪球高回报用户的行为,对股票市场进行分析和预测。
爬虫是入门Python最好的方式,没有之一。Python有很多应用的方向,比如后台开发、web开发、科学计算等等,但爬虫对于初学者而言更友好,原理简单,几行代码就能实现基本的爬虫,学习的过程更加平滑,你能体会更大的成就感。
掌握基本的爬虫后,你再去学习Python数据分析、web开发甚至机器学习,都会更得心应手。因为这个过程中,Python基本语法、库的使用,以及如何查找文档你都非常熟悉了。
对于小白来说,爬虫可能是一件非常复杂、技术门槛很高的事情。比如有人认为学爬虫必须精通 Python,然后哼哧哼哧系统学习 Python 的每个知识点,很久之后发现仍然爬不了数据;有的人则认为先要掌握网页的知识,遂开始 HTMLCSS,结果入了前端的坑,瘁……
但掌握正确的方法,在短时间内做到能够爬取主流网站的数据,其实非常容易实现,但建议你从一开始就要有一个具体的目标。
在目标的驱动下,你的学习才会更加精准和高效。那些所有你认为必须的前置知识,都是可以在完成目标的过程中学到的。这里给你一条平滑的、零基础快速入门的学习路径。
1.学习 Python 包并实现基本的爬虫过程
2.了解非结构化数据的存储
3.学习scrapy,搭建工程化爬虫
4.学习数据库知识,应对大规模数据存储与提取
5.掌握各种技巧,应对特殊网站的反爬措施
6.分布式爬虫,实现大规模并发采集,提升效率

⑺ 如何应对网站反爬虫策略如何高效地爬大量数据

应对反爬策略的方法:1、模拟正常用户。反爬虫机制还会利用检测用户的行为来判断,例如Cookies来判断是不是有效的用户。

2、动态页面限制。有时候发现抓取的信息内容空白,这是因为这个网站的信息是通过用户的XHR动态返回内容信息。解决这种问题就要爬虫程序对网站进行分析,找到内容信息并抓取,才能获取内容。

3、降低IP访问频率。有时候平台为了阻止频繁访问,会设置IP在规定时间内的访问次数,超过次数就会禁止访问。所以绕过反爬虫机制可以降低爬虫的访问频率,还可以用IPIDEA代理IP换IP解决限制。

⑻ 怎么查看谷歌蜘蛛爬行网站的路径

用一些站长工具模拟

⑼ 爬虫 打开网址

C#特别适合于构造蜘蛛程序,这是因为它已经内置了HTTP访问和多线程的能力,而这两种能力对于蜘蛛程序来说都是非常关键的。下面是构造一个蜘蛛程序要解决的关键问题:
⑴ HTML分析:需要某种HTML解析器来分析蜘蛛程序遇到的每一个页面。
⑵ 页面处理:需要处理每一个下载得到的页面。下载得到的内容可能要保存到磁盘,或者进一步分析处理。
⑶ 多线程:只有拥有多线程能力,蜘蛛程序才能真正做到高效。
⑷ 确定何时完成:不要小看这个问题,确定任务是否已经完成并不简单,尤其是在多线程环境下。
一、HTML解析

本文提供的HTML解析器由ParseHTML类实现,使用非常方便:首先创建该类的一个实例,然后将它的Source属性设置为要解析的HTML文档:

ParseHTML parse = new ParseHTML();
parse.Source = "<p>Hello World</p>";
接下来就可以利用循环来检查HTML文档包含的所有文本和标记。通常,检查过程可以从一个测试Eof方法的while循环开始:

while(!parse.Eof())
{
char ch = parse.Parse();

Parse方法将返回HTML文档包含的字符--它返回的内容只包含那些非HTML标记的字符,如果遇到了HTML标记,Parse方法将返回0值,表示现在遇到了一个HTML标记。遇到一个标记之后,我们可以用GetTag()方法来处理它。

if(ch==0)
{
HTMLTag tag = parse.GetTag();
}

一般地,蜘蛛程序最重要的任务之一就是找出各个HREF属性,这可以借助C#的索引功能完成。例如,下面的代码将提取出HREF属性的值(如果存在的话)。

Attribute href = tag["HREF"];
string link = href.Value;

获得Attribute对象之后,通过Attribute.Value可以得到该属性的值。

二、处理HTML页面

下面来看看如何处理HTML页面。首先要做的当然是下载HTML页面,这可以通过C#提供的HttpWebRequest类实现:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(m_uri);
response = request.GetResponse();
stream = response.GetResponseStream();

接下来我们就从request创建一个stream流。在执行其他处理之前,我们要先确定该文件是二进制文件还是文本文件,不同的文件类型处理方式也不同。下面的代码确定该文件是否为二进制文件。

if( !response.ContentType.ToLower().StartsWith("text/") )
{
SaveBinaryFile(response);
return null;
}
string buffer = "",line;

如果该文件不是文本文件,我们将它作为二进制文件读入。如果是文本文件,首先从stream创建一个StreamReader,然后将文本文件的内容一行一行加入缓冲区。

reader = new StreamReader(stream);
while( (line = reader.ReadLine())!=null )
{
buffer+=line+"\r\n";
}

装入整个文件之后,接着就要把它保存为文本文件。

SaveTextFile(buffer);

下面来看看这两类不同文件的存储方式。

二进制文件的内容类型声明不以"text/"开头,蜘蛛程序直接把二进制文件保存到磁盘,不必进行额外的处理,这是因为二进制文件不包含HTML,因此也不会再有需要蜘蛛程序处理的HTML链接。下面是写入二进制文件的步骤。

首先准备一个缓冲区临时地保存二进制文件的内容。 byte []buffer = new byte[1024];

接下来要确定文件保存到本地的路径和名称。如果要把一个myhost.com网站的内容下载到本地的c:\test文件夹,二进制文件的网上路径和名称是http://myhost.com/images/logo.gif,则本地路径和名称应当是c:\test\images\logo.gif。与此同时,我们还要确保c:\test目录下已经创建了images子目录。这部分任务由convertFilename方法完成。

string filename = convertFilename( response.ResponseUri );

convertFilename方法分离HTTP地址,创建相应的目录结构。确定了输出文件的名字和路径之后就可以打开读取Web页面的输入流、写入本地文件的输出流。

Stream outStream = File.Create( filename );
Stream inStream = response.GetResponseStream();

接下来就可以读取Web文件的内容并写入到本地文件,这可以通过一个循环方便地完成。

int l;
do
{
l = inStream.Read(buffer,0,
buffer.Length);
if(l>0)
outStream.Write(buffer,0,l);
} while(l>0);

三、多线程

我们用DocumentWorker类封装所有下载一个URL的操作。每当一个DocumentWorker的实例被创建,它就进入循环,等待下一个要处理的URL。下面是DocumentWorker的主循环:

while(!m_spider.Quit )
{
m_uri = m_spider.ObtainWork();

m_spider.SpiderDone.WorkerBegin();
string page = GetPage();
if(page!=null)
ProcessPage(page);
m_spider.SpiderDone.WorkerEnd();
}

这个循环将一直运行,直至Quit标记被设置成了true(当用户点击"Cancel"按钮时,Quit标记就被设置成true)。在循环之内,我们调用ObtainWork获取一个URL。ObtainWork将一直等待,直到有一个URL可用--这要由其他线程解析文档并寻找链接才能获得。Done类利用WorkerBegin和WorkerEnd方法来确定何时整个下载操作已经完成。

从图一可以看出,蜘蛛程序允许用户自己确定要使用的线程数量。在实践中,线程的最佳数量受许多因素影响。如果你的机器性能较高,或者有两个处理器,可以设置较多的线程数量;反之,如果网络带宽、机器性能有限,设置太多的线程数量其实不一定能够提高性能。

四、任务完成了吗?

利用多个线程同时下载文件有效地提高了性能,但也带来了线程管理方面的问题。其中最复杂的一个问题是:蜘蛛程序何时才算完成了工作?在这里我们要借助一个专用的类Done来判断。

首先有必要说明一下"完成工作"的具体含义。只有当系统中不存在等待下载的URL,而且所有工作线程都已经结束其处理工作时,蜘蛛程序的工作才算完成。也就是说,完成工作意味着已经没有等待下载和正在下载的URL。

Done类提供了一个WaitDone方法,它的功能是一直等待,直到Done对象检测到蜘蛛程序已完成工作。下面是WaitDone方法的代码。

public void WaitDone()
{
Monitor.Enter(this);
while ( m_activeThreads>0 )
{
Monitor.Wait(this);
}
Monitor.Exit(this);
}

WaitDone方法将一直等待,直到不再有活动的线程。但必须注意的是,下载开始的最初阶段也没有任何活动的线程,所以很容易造成蜘蛛程序一开始就立即停止的现象。为解决这个问题,我们还需要另一个方法WaitBegin来等待蜘蛛程序进入"正式的"工作阶段。一般的调用次序是:先调用WaitBegin,再接着调用WaitDone,WaitDone将等待蜘蛛程序完成工作。下面是WaitBegin的代码:

public void WaitBegin()
{
Monitor.Enter(this);
while ( !m_started )
{
Monitor.Wait(this);
}
Monitor.Exit(this);
}

WaitBegin方法将一直等待,直到m_started标记被设置。m_started标记是由WorkerBegin方法设置的。工作线程在开始处理各个URL之时,会调用WorkerBegin;处理结束时调用WorkerEnd。WorkerBegin和WorkerEnd这两个方法帮助Done对象确定当前的工作状态。下面是WorkerBegin方法的代码:

public void WorkerBegin()
{
Monitor.Enter(this);
m_activeThreads++;
m_started = true;
Monitor.Pulse(this);
Monitor.Exit(this);
}

WorkerBegin方法首先增加当前活动线程的数量,接着设置m_started标记,最后调用Pulse方法以通知(可能存在的)等待工作线程启动的线程。如前所述,可能等待Done对象的方法是WaitBegin方法。每处理完一个URL,WorkerEnd方法会被调用:

public void WorkerEnd()
{
Monitor.Enter(this);
m_activeThreads--;
Monitor.Pulse(this);
Monitor.Exit(this);
}

WorkerEnd方法减小m_activeThreads活动线程计数器,调用Pulse释放可能在等待Done对象的线程--如前所述,可能在等待Done对象的方法是WaitDone方法。