抢先式多线程网络蜘蛛

Vzla Engine 立即下载
作者:Sim Ayers 翻译:刘建强R88(dEK  
Win32 API 支持抢先式多线程网络,这是编写MFC网络蜘蛛非常有用的地方。SPIDER工程(程序)是一个如何用抢先式多线程技术实现在网上用网络蜘蛛/机器人聚集信息的程序。 DBu)xr}7A  
该工程产生一个象蜘蛛一样行动的程序,该程序为断开的URL链接检查WEB站点。链接验证仅在href指定的链接上进行。它在一列表视图CListView中显示不断更新的URL列表,以反映超链接的状态。本工程能用作收集、索引信息的模板,该模板将这些信息存入到可以用于查询的数据库文件中。 mp&Le YYn  
a -z23$3  
搜索引擎在WEB上使用叫作Robots(也叫爬虫,蜘蛛,蠕虫,漫步者,滑行者等等)的程序收集信息,它从WEB上自动地聚集和索引信息,接着将这些信息存入数据库。(注意:一个机器人将搜索一个页面,然后把这个页面上的链接作为将要索引的新的URL的起点)用户可创建查询去查询这些数据库以发现他们需要的信息。 ROJ'-Vde9  
n.Ur-ot  
通过抢先式多线程地使用,你能索引一个基于URL链接的WEB页面,启动一个新的线程跟随每个新的URL链接,索引一个新的URL起点。本工程使用和自定义的MDI子框架一起使用的MDI 文档类,在下载WEB页面时显示一个编辑视图,在检查URL连接时显示一个列表视图。另外,本工程使用了CObArray,CInternetSession,CHttpConnection,ChttpFile和CWinThread MFC类。CWinThread类用于产生多线程来代替在CInternetSession类中的异步模式,这种模式是从insock的16位windows平台保留下来的。SPIDER工程使用简单的工作线程去检查URL链接,或者下载一个Web页面。CSpiderThread类是从CWinThread类中派生的,所以,每个CSpiderThread对象可以使用CWinThread 的MESSAGE_MAP()函数。通过在CSpiderThread类中声明"DECLARE_MESSAGE_MAP()",用户接口可以响应用户的输入。这意味着你可以在一个Web服务器上检查URL链接的同时,你可以从另一个Web服务器上下载或打开一个Web页面。只有在线程数超过定义为64的MAXIMUM_WAIT_OBJECTS时,用户接口将不会响应用户的输入。在每个CSpiderThread对象的构造函数中,我们提供了ThreadProc函数以及将传送到ThreadProc函数的线程参数。 ZaukMEq  
wzNt c)~i  
CSpiderThread* pThread; SU_] C+  
pThread = NULL; 1OiZNuI:E  
pThread = new CSpiderThread(CSpiderThread::ThreadFunc,pThreadParams); // 创建一个新的 CSpiderThread 对象; :o.x=c B  
m>Z/ rqOK  
在类CSpiderThread 构造函数中我们在线程参数中设置指针CWinThread* m_pThread ,于是我们可以指向这个线程正确的事例: /C ,>  
pThreadParams->m_pThread = this; [c KI0  
;)= z vr17  
The CSpiderThread ThreadProc Function cDQw`ORP*g  
%<ptkZK#  
// 简单的工作线程函数 Cs1%g  
UINT CSpiderThread::ThreadFunc(LPVOID pParam) ;@ll  
{ #Zavdkw=d  
ThreadParams * lpThreadParams = (ThreadParams*) pParam; H'= i  
CSpiderThread* lpThread = (CSpiderThread*) lpThreadParams->m_pThread; e2h k  
Ppb2"Ik  
lpThread->ThreadRun(lpThreadParams); e~ 78'UH  
k}0  
// 这里使用SendMessage代替PostMessageUse,以保持当前线程数同步。 2,e|,N"zN  
// 如果线程数大于 MAXIMUM_WAIT_OBJECTS (64), 本程序将变得不能响应用户输入 q}A3"$-F  
cCbr-Z&  
::SendMessage(lpThreadParams->m_hwndNotifyProgress, w*ktx{  
WM_USER_THREAD_DONE, 0, (LPARAM)lpThreadParams); }]GK@nn7  
// 删除lpThreadParams 和减少线程总数 __n"DLW  
gV44PI6h  
return 0; qhf/B)  
} 5h^qtK  
^a5~FI:  
这个结构传递给CSpiderThread ThreadProc函数 |-Klh  
typedef struct tagThreadParams (X'K)*G#  
{ >'g60R[  
HWND m_hwndNotifyProgress; ~2 ;y4%K  
HWND m_hwndNotifyView; w5R9/<3 L  
CWinThread* m_pThread; ~t$VzL1  
CString m_pszURL; %tjEVQa  
CString m_Contents; ' 7%9Sqx  
CString m_strServerName; KJ |1zCM  
CString m_strObject; Cr"hu;  
CString m_checkURLName; f5eX%FR  
CString m_string; U^S0H(>  
DWORD m_dwServiceType; 0J B"@U&-  
DWORD m_threadID; NiF*h~ q  
DWORD m_Status; a7R7Ks|q  
URLStatus m_pStatus; 4H)a7 <,  
INTERNET_PORT m_nPort; Ex{]<6UAu  
int m_type; "=)`*"rr  
BOOL m_RootLinks; TOs|f8ay  
Qoc-ZC"<6  
}ThreadParams; DuaOi1Gw  
u<[Y6m  
CSpiderThread对象创建后,我们用CreatThread函数开始一个新的线程对象地执行。 BQ(`MM@  
8V@3T/}  
if (!pThread->CreateThread()) //开始一 CWinThread 对象地执行 V@F~Cx  
{ ]Kd:ZmJ  
AfxMessageBox("Cannot Start New Thread"); y3l sAe#  
delete pThread; XWk^$"  
pThread = NULL; 9G&l{7=  
delete pThreadParams; M!,WU[mP  
return FALSE; {' JoVJKv  
} YOqBIbp~&)  
一旦新的线程正在运行,我们使用::SengMessage函数发送消息到 CDocument’s-> CListView ,这个消息带有URL链接的状态结构。 8|gwH2 st~  
if(pThreadParams->m_hwndNotifyView != NULL) XfharJ_b  
::SendMessage(pThreadParams->m_hwndNotifyView,WM_USER_CHECK_DONE, 0, (LPARAM) &pThreadParams->m_pStatus); @#;2P'KL  
Pi`}-GUe,  
URL状态的结构: JHBX'1GQa  
0@k)C z[0;  
typedef struct tagURLStatus K_; '-B  
{ e'Njl?>3  
CString m_URL; u 6A!Sw  
CString m_URLPage; ;hzm&My  
CString m_StatusString; B*B}eXUph  
CString m_LastModified; =r=?N/7I  
CString m_ContentType; [ H|ifi  
CString m_ContentLength; _e4%<!1  
DWORD m_Status; QTe>EJ12  
}URLStatus, * PURLStatus; 4rDa Jd>,  
J)I|Xot  
每个新的线程建立一个新的CMyInternetSession类(派生于CInternetSession)对象,并把 EnableStatusCallback设置为TRUE,于是,我们可以在所有的InternetSession回调时检查状态。将回调使用的dwContext ID设置为线程ID。 &GKtD)  
pXap<T  
BOOL CInetThread::InitServer() <&4 7W  
{ QJ%[6S  
D #Ku5~j  
try Bj1{=Pvl  
{ X}5}M+'~  
m_pSession = new CMyInternetSession(AgentName,m_nThreadID); =k0qj_  
int ntimeOut = 30; // 很重要!如果设置太小回引起服务器超时,如果设置太大则回引起线程挂起。 =[Z uE0c  
/* 3U/| E  
网络连接请求时间超时值在数毫秒级。如果连接请求时间超过这个超时值,请求将被取消。 9L+g;Js$4  
缺省的超时值是无限的。 ;D>*Pzj  
*/ -RK R. ,  
m_pSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,1000* ntimeOut); " > ]{t[Ib  
=Ul{#R z  
/* 在重试连接之间的等待的延时值在毫秒级。*/ F15Yn  
m_pSession->SetOption(INTERNET_OPTION_CONNECT_BACKOFF,1000); !=SBeq  
vOV$Hle  
/* 在网络连接请求时的重试次数。如果一个连接企图在指定的重试次数后仍失败,则请求被取消。 缺省值为5。 */ ? j^:jV  
m_pSession->SetOption(INTERNET_OPTION_CONNECT_RETRIES,1); lFT` WO  
m_pSession->EnableStatusCallback(TRUE); 7%)KB4(/_  
{$P')> /  
} mi'3ibCG  
catch (CInternetException* pEx) 9kby-A4  
{ )Rc  
// catch errors from WinINet /{%p%Q[X  
//pEx->ReportError(); F1GFn|OA  
m_pSession = NULL; q~6a$8+t  
pEx->Delete(); =Ohro '  
return FALSE ; moCr4*jDX,  
} p>h}k_s  
0lLg uBW@  
return TRUE; d$B+xW  
} OLE@35"v]  
<,</ Ge  
在一个单或多线程程序中使用MFC WinIne类,关键是要在所有MFC WinInet类函数周围使用try和catch块。因为互连网有时很不稳定,或者你访问的Web页面已不存在,则这种情况下,将抛出一个CInternetException错误。 9t+:L(*pK  
!laOiH  
xcX^L84/  
try wpa^]l  
{ MrhJk  
// some MFC WinInet class function T#ehJq 5  
} ,8+Jt@L  
catch (CInternetException* pEx) VE*& t>I  
{ z6'l" D'h  
// catch errors from WinINet 0b+End#mp  
//pEx->ReportError(); 0]2@T=*kTY  
pEx->Delete(); <%=@Ue  
return FALSE ; <26Jif:  
} ItwJL`  
最初线程数最大设置为64,你可以将它设置为从1到100的任何数。设置太高会使链接失败,意味着你将不得不重新检查URL链接。在/cgi-bin/目录下一个连续不断地迅猛地HTTP请求会使服务器崩溃。SPIDER 程序在1秒中发送四个HTTP请求,1分钟240个。这也将会使服务器崩溃。在任何服务器上你检查时放仔细一点。每个服务器都有一个请求Web文件的请求代理IP地址的日志。你或许会收到来自Web服务器管理员的龌龊的邮件。 9pq-"?vHY0  
~k/GmH  
7A4_b8  
你可以为一些目录建立robots.txt 文件来防止这些目录被索引。这个机制通常用于保护/cgi-bin/ 目录。CGI脚本占用更多的要检索的服务器资源。当SPIDER程序检查URL链接时,它的目标是不太快地请求太多的文档。SPIDER程序坚持机器人拒绝的标准。这个标准是机器人开发者之间的协议,允许WWW站点限制URL上的机器人的请求。通过使用这个限制访问的标准,机器人将不检索Web服务器希望拒绝的任何文档。在检查根URL前,程序检查看是否有robots.txt文件在主目录下。如果SPIDER程序发现robots.txt文件,将放弃搜索。另外,程序也检查所有Web页面中的META标记。如果发现一个META标记,它的NAME="ROBOTS" CONTENT ="NOINDEX,NOFOLLOW",则不索引那个页面上的URL。 eC*-/$D  
AOR(1Qyo  
创建: 4 X6_p(  
Windows 95 7N I~47s|v  
MFC/VC++ 5.0 0v'FE35~s  
WinInet.h 时间 9/25/97 K*fh`Kz  
WinInet.lib 时间 9/16/97 } 2P,Z6L  
WinInet.dll 时间 9/18/97 >Mc,c(CvU  
oJbMUEQQq  
+-+%6O<C  
问题: K84Ve Ae  
i $:QOMA  
允许 32,767 个URL 链接在 CListView 中。 c1L0#L/F6"  
不能分析 URL的正确性 。 d2XS w>  
|E#+X  
>^5U XQr  
资料: PH]/*LEj  
Internet tools - Fred Forester c&AJFED]<  
Multithreading Applications in Win32 ?@uyqi~:U  
Win32 Multithreaded Programming -h?ed'e/zz   
http文件服务器 多线程 并发处理 相比之前的http文件服务器,此版本支持多线程处理响应请求,支持多请求同时下载功能,中文文件名会乱码,仅支持英文文件名称 立即下载

相关推荐

C语言实现高并发http文件上传下载服务器【源码下载】VS2010工程

C 语言实现的http文件上传下载服务 系统平台:windows 开发工具:vs2010 开发语言:C 程序为单线程,使用I/O多路复用实现并发 抽取libevent的最最最基础框架,自己封装event 使用BSD tree.h的红黑树

MFC 发起 HTTP Post 请求 发送MES消息

首先获取WebApi 的Token。生成的JSON 数据大致如下。执行请求Token函数。

weixin_45672157的博客 1412

【具身算法】VLA算法-Diffusion Policy

《扩散策略:多模态机器人控制的新方法》摘要 本文提出了一种基于扩散模型的机器人控制策略(DiffusionPolicy),用于解决视觉运动控制中的多模态行为、高维动作空间和训练稳定性问题。该方法利用去噪扩散概率模型(DDPM)生成动作序列,通过迭代优化处理复杂动作分布,显著提升了性能。实验表明,在15项机器人操作任务中,扩散策略平均性能提升46.9%,有效解决了传统显式/隐式策略的局限性。其核心优势在于:1)优雅建模多模态动作分布;2)适应高维动作空间;3)训练过程稳定。未来工作将探索与强化学习的结合及计算

puzhinan7781的博客 1390

DLL 中 new CInternetSession 异常!

【问题分析】 在new CInternetSession时出错的代码: m_pSession = new CInternetSession; if (m_pSession) { m_pSession-&gt;SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 300); m_pHttpConn = m_pSession-&gt;GetHttpConnec...

HelloKandy's Blog 916

顶刊《会计研究》数据复现|最新上市公司数智化数据

本文基于Python文本分析方法构建了中国A股上市公司数智化指标(1991-2024),通过识别年报中的"机器学习""智能医疗"等关键词,量化企业数字化与智能化融合程度。研究发现数智化企业更倾向于非正式渠道的定性披露以规避风险,该指标为监管完善信披规则提供了参考。研究还揭示了数智化对企业信息披露策略的转变,并提出了未来研究方向,包括数智化对绿色创新、ESG表现等影响机制。数据覆盖非金融类上市公司,采用文本挖掘技术构建结构化指标,为相关领域研究提供了微观基础。

PPdata_Academy的博客 1487

车辆动力学仿真模型的可信度评估方法

以转向工况测试为例,实车采集的方向盘转角作为车辆动力学模型的输入,记录车辆动力学模型的横摆角速度的输出结果,计算横摆角速度的幅频特性,根据《GB/T 6323-2014 转向盘角脉冲试验》的方法,获取横摆角速度峰值、横摆角速度谐振峰频率、横摆角速度谐振峰水平,与采集的实车结果对比,并计算车辆动力学模型和实车对于关键对比参数的相对误差。由公式(2)计算可得,在制动工况和转向工况测试下,车辆动力学模型和实车的纵向车速、制动减速度、制动距离、横摆角速度基本一致,精度> 85%,具有较好的精度。

wangchen900705的博客 1958

使用 CInternetSession 封装多线程 http 文件下载

  使用 CInternetSession 封装多线程 http 文件下载整理:Ackarlix 源代码下载  如何下载一个http文件?我们当然可以用socket自己实现http协议去做,但费时费力还易出bug,对于一个客户端程序稳定易维护是第一位的,所幸MS给我们提供了功能强大的internet API函数族,MFC的CInternetSession对它们进行了一些简单

Ackarlix的专栏 1515

遥感常用相关指数和计算方法(植被指数/水体指数/雪和冰指数/矿物指数/地表温度指数/云和阴影指数/农业指数)

遥感常用相关指数和计算方法(植被指数/水体指数/雪和冰指数/矿物指数/地表温度指数/云和阴影指数/农业指数)

m0_64361769的博客 1万+

抢先式多线程网络蜘蛛 (转)

抢先式多线程网络蜘蛛 (转)[@more@]抢先式多线程网络蜘蛛作者:Sim Ayers 翻译:刘建强 win32 api 支持抢先式多线程网络,这是编写MFC网络蜘蛛非常有用的地方。SPideR工程(程序)是一个如何用抢先式多...

csd3176的博客 107

Dinic算法的复杂度分析及证明

一般图 复杂度主要取决于dfs增广的过程。 将dfs部分的复杂度分成两部分来分析:1)修改增广路上边的流量。至多会增广mmm次,一条增广路的长度至多是nnn,所以这一部分的复杂度是O(nm)O(nm)O(nm)。2)dfs遍历时找增广路失败时经过的边。由于一旦从某条边出发找最短路失败了,我们就不会再走那条边(当前弧优化),所以这一部分的复杂度是O(m)O(m)O(m)的。故而dfs增广的复杂度是O...

这个博客已经搬到了:zhongyuwei.github.io 4392

第三方 API 调用 OpenClaw 出现 LLM request timed out 的解决方案

本文主要介绍了第三方 API 调用 OpenClaw 出现 LLM request timed out 的解决方案,希望能对使用OpenClaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

简谈搜索引擎工作流程

互联网是一个宝库,搜索引擎是打开宝库的一把钥匙。然而,绝大多数网民在搜索引擎的相关知识及使用技巧上能力不足。国外的一次调查结果显示,约有71%的人对搜索的结果感到不同程度的失望。作为互联网的第二大服务,这种状况应该改变。 互联网的迅速发展,导致了网上信息的爆炸性增长。全球目前的网页超过20亿,每天新增加730万网页。要在如此浩瀚的信息海洋里寻找信息,就像“大海捞针”一样困难。搜索引擎正是为

在水一方 836

09 SAP CPI 访问公共API接口

我在网上找了一个公共API,入参输入汉字返回拼音。至此,一个真正的访问API的接口就做好了。点击保存时可看到红叉报错。

SAP CPI 477

编写可靠的多线程蜘蛛程序

编写可靠的多线程蜘蛛程序Thursday, 24. August 2006, 05:52:14技术 〔此篇专为QQ群[17371752]“搜索引擎.数据.蜘蛛”中的朋友做主题研讨之用〕1. 蜘蛛程序长啥样? 蜘蛛程序的是搜索引擎中最关键的后台程序之一,它必须十分可靠,可以长期运行而无需经常维护。但是我往往看到许多朋友开始做蜘蛛程序的时候总是将很多精力放到了界面上。个人觉得这是没有必要

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 2336

利用 SAP Joule 提升 ABAP 开发效率的前提条件与限制全解析

综上,想要在 ABAP Development Tools 中顺利使用 SAP Joule,既要准备好 BTP、IAS、ABAP 系统与 ADT 的版本与信任链,也要理解许可证、配额、语法范围等限制。只有在这些前提全部满足后,Joule 才能真正发挥生成式 AI 的价值,帮助 ABAP 开发者从繁琐模板中解放出来,把注意力投入在业务创新与 Clean Core 改造之上。未来 SAP 还将扩展中文语境、自动修复建议以及跨系统智能代理等功能,值得持续关注。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 663

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

抢先式多线程网络爬虫spider在智能搜索引擎中的实现

转自:《计算机工程》 文/ 董瑞洪,张秋余,唐静兵,张涛线程        线程是描述进程内的执行,正是线程负责执行包含在进程的地址空间中的代码。单个进程可能包含几个线程,它们可以同时执行进程的地址空间中的代码。每个线程有自己的一组cpu寄存器和堆。线程可以看成“一段代码的执行”也就是一系列有jvm执行的二进制指令。这里面没有对象甚至没有方法的概念。线程是有序的指令,而不是方法。

在优快云寻找woshizn 1309

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

逃避搜索引擎的法眼

作者:晓风·残月日期:2004-05-11 为什么我们要逆着常理来这样做?   如果你是一个站长,估计你总在千方百计的让你的网站能在搜索引擎里面找到,并且能够在搜索引擎里面排名靠前,但有时,你可能并没登陆过任何搜索引擎,可却莫名其妙的发现可以通过它搜索到你的网站。或许有的主页内容你乐于世人皆知,但有的内容你却不愿被洞察、索引。可能你要求用户验证,但这并不能逃避搜索引擎的搜索,只要在搜索引擎

turlim的专栏 938

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

转:搜索引擎如何抓取互联网页面

先说说搜索引擎的原理吧。搜索引擎是把互联网上的网页内容存在自己的服务器上,当用户搜索某个词的时候,搜索引擎就会在自己的服务器上找相关的内容,这样就是说,只有保存在搜索引擎服务器上的网页才会被搜索到。哪些网页才能被保存到搜索引擎的服务器上呢?只有搜索引擎的网页抓取程序抓到的网页才会保存到搜索引擎的服务器上,这个网页抓取程序就是搜索引擎的蜘蛛.整个过程分为爬行和抓取。   一、 蜘蛛   搜索引擎

3815

Spider的实现细节

注:文章比较零乱,很多地方的表达方式不符合中文的习惯,可以看出是由英文翻译而来,中文的原创资料还是太少了。  Spider的实现细节a. URL 的组织和管理考虑到系统自身的资源和时间有限,Spider程序应尽可能的对链接进行筛选,以保证获取信息的质量和效率。spider程序对新URL 的选择往往与搜索引擎的类型、口标集合、能够处理信息的类型、资源的限制

penghe03的专栏 919
上一篇: HttpScan
下一篇: Worm.Magistr.g
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值