`
fxsjy
  • 浏览: 35580 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

头文字D,Spider

    博客分类:
  • d
阅读更多
贴一段我用D写的Spider的代码。
越来越爱D了。

import std.stdio;
import std.string;
import std.conv;
import std.socket;
import std.socketstream;
import std.stream;
import std.regexp;
import std.thread;
import std.c.time;

char[][] g_queue;
int g_task_amount=0;
const char[] homepage="http://mobile.younet.com/";
const ushort max_thread=20;

alias std.string.find strfind;

char[] getHTML(char[] url){
	
	char[] domain,html;
	ubyte[1024] buf;
	ushort port=80;
	if(!isURL(url))return null;
	int i=strfind(url,"://")+3;
	url=url[i..$];
	int j=strfind(url,":");
	int e=strfind(url,"/");
	if(e<0){
		e=url.length;
	}
	if(j>0){
		port=toUshort(url[j+1..e]);
		domain=url[0..j];
	}
	else{
		domain=url[0..e];
	}

	if(e==url.length){
		url="/";
	}
	else{
		url=url[e..$];
	}

	debug(younet){
		writefln(toString(port) ~"  "~ domain ~"  "~ url);
	}

	Socket sock=new TcpSocket(new InternetAddress(domain,port));
	Stream ss=new SocketStream(sock);
	ss.writeString("GET " ~ url ~ " HTTP/1.0\r\n"
		 "Host: " ~ domain ~ "\r\n"
		 "Connection: close\r\n"
		 "Referer: http://" ~ domain ~ url ~ "\r\n"
		 "\r\n\r\n\r\n\r\n");
	int recv_amount=ss.read(buf);
	while(recv_amount>0){
		html ~= cast(char[])buf[0..recv_amount];
		recv_amount=ss.read(buf);
	}

	ss.close();
	sock.close();
	
	char[][] mc=RegExp("(URL=|Location: )(.*?)[\"\r]").match(html);
	if(mc.length==3){
		char[] new_location=mc[2];
		html=getHTML(new_location);
		return html;
	}
	int start_pos=strfind(html,"\r\n\r\n") ;
	
	html=html[start_pos+4 .. $];
	return html[0..$];
}

int crawl(void * p){
	while(true){
		char[] url,html;
		synchronized{
			if(g_queue.length==0)
				sleep(1);
			if(g_queue.length==0)
				break;
			url=g_queue[0];
			
			writefln("begin:" ~ url);
			if(g_queue.length>0)
				g_queue=g_queue[1..$];	
		}
		try{
			html=getHTML(url);
		}
		catch(Exception ex){
			synchronized{
				if(g_task_amount>0)
					g_task_amount-=1;
			}
			writefln(ex);
			writefln("failed:" ~ url);
			writefln("remains" ~ toString(g_task_amount));
			continue;
		}
		debug(younet){
			printf(toStringz("!!!" ~ html[0..200]));
		}
		if(strfind(url,"files/list")<0){
			synchronized{
				foreach(m;RegExp("files/list_\\d+\\.html").search(html)){
					g_queue ~= homepage ~ m.match(0);
					g_task_amount+=1;
				}
				g_task_amount-=1;
			}
			writefln("done:" ~ url);
			debug(younet){
				writefln(g_queue);
			}
		}
		else{
			writefln("done:" ~ url);
			synchronized{
				g_task_amount-=1;
				writefln("remains" ~ toString(g_task_amount));
			}
		}
		
	}
	return 1;
}
int main(char[][] args){
	//writefln("Hello");
	g_queue ~= homepage;
	g_task_amount+=1;
	Thread[] tds;
	for(int i=0;i<max_thread;i++){
		Thread t=new Thread(&crawl,null);
		t.start();
		tds ~= t;
	}
	sleep(5);
	while(true){
		sleep(1);
		if(g_task_amount<=0)break;
	}
	return 0;
}
分享到:
评论
2 楼 ideage 2008-10-04  
缺少引用的库了.
试试
dmd Spider.d ws2_32.lib
1 楼 reddust 2008-09-23  
编译提示如下错误:

OPTLINK (R) for Win32  Release 8.00.1
Copyright (C) Digital Mars 1989-2004  All rights reserved.
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _getprotobyname@4
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _getprotobynumber@4
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _getservbyname@8
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _getservbyport@8
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _WSAGetLastError@0
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _gethostbyname@4
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _gethostbyaddr@12
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _inet_addr@4
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _inet_ntoa@4
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _ioctlsocket@12
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _getsockopt@20
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _bind@12
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _connect@12
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _listen@8
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _accept@12
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _closesocket@4
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _shutdown@8
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _getpeername@12
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _getsockname@12
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _send@16
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _sendto@24
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _recv@16
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _recvfrom@24
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _setsockopt@20
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _socket@12
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _WSAStartup@8
D:\d\dmd\bin\..\lib\phobos.lib(socket)
Error 42: Symbol Undefined _WSACleanup@0
--- errorlevel 27

相关推荐

    Black_Spider_1.7.2.zip_Black Spider 1.7.2_Black_Spider_1.7.2_bla

    Black Spider 1.7.2 是一款网络安全工具,主要用于上传shell和检查系统漏洞。这个版本的更新可能包含了一些新的功能和改进,使得它在黑客防御和渗透测试中更加强大和有效。"Black_Spider_1.7.2.zip" 是这个工具的...

    Spider 用于网络分析

    3. **请求与反爬策略**:了解如何设置请求头、处理Cookie、使用代理,以及应对网站的反爬机制,如验证码、IP限制和User-Agent检测。 4. **异步编程**:为了提高抓取效率,学习使用异步IO,如Python的asyncio库或第...

    spider

    "Spider"在这里指的是一个在Matlab环境下实现的机器学习工具箱,主要用于分类和回归任务。在机器学习领域,"Spider"可能是一个自定义的库,集合了多种算法以供研究和应用。以下将详细探讨与这个工具箱相关的知识点:...

    Article_Spider_spider_

    【标题】:文章爬虫(Spider)开发指南 在信息技术领域,网络爬虫(Web Spider)是一种自动遍历网络并抓取网页信息的程序。在这个案例中,我们关注的是一个特定于“Article Spider”的项目,它专注于从cnblogs.com...

    JDspider_jdspider_python爬虫_京东_

    【标题】"JDspider_jdspider_python爬虫_京东_" 涉及的主要知识点是使用Python编程语言构建一个名为JDspider的爬虫程序,该程序专门针对京东(JD.com)的商品页面进行数据抓取,尤其是关注商品的优惠价格信息。...

    python-spidermonkey

    《用perl解析JavaScript之JavaScript模块的安装--SpiderMonkey》 安装依赖软件: 安装pyrex:sudo apt-get install python-pyrex 安装g++:sudo apt-get install g++ 安装libjs.so: $ tar zxvf js-1.7.0.tar...

    spider-admin-pro 一个集爬虫Scrapy+Scrapyd爬虫项-spider-admin-pro.zip

    6. **配置管理**:配置Scrapy项目的设置,如请求头、代理IP、下载延迟等。 7. **版本控制**:支持版本管理,可以回滚到之前的代码版本。 8. **权限控制**:对于多用户环境,可能有用户注册、登录和权限管理功能。 *...

    wechat_spider 微信公众号爬虫

    ignore_haved_crawl_today_article_account: true # 忽略已经抓取到今日发布文章的公众号,即今日不再监测该公众号 redis_task_cache_root_key: wechat # reids 中缓存任务的根key 如 wechat: zombie_ac

    spider原理资料

    【Spider原理详解】 Spider,又称为网络爬虫或网络机器人,是互联网中一种自动化程序,其主要任务是在互联网上抓取网页信息。Spider的基本工作原理是通过跟随网页上的超链接,像一只蜘蛛在巨大的蜘蛛网上爬行一样,...

    spider_spider_spiderpython官网_爬虫_

    本项目"spider_spider_spiderpython官网_爬虫_"是一个使用Python编写的豆瓣网数据爬取小程序。在本文中,我们将深入探讨Python爬虫的基础知识、涉及的库以及如何使用它们来实现豆瓣网的数据抓取。 首先,Python爬虫...

    JSpider Web Spider引擎

    J-Spider:是一个完全可配置和定制的Web Spider引擎.你可以利用它来检查网站的错误(内在的服务器错误等),网站内外部链接检查,分析网站的结构(可创建一个网站地图),下载整个Web站点,你还可以写一个JSpider插件来扩展...

    Spider.pdf for java

    Spider.pdf for java

    开源webspider网络蜘蛛webspider-1.0.0.6.tar.gz

    【开源Webspider网络蜘蛛1.0.0.6】是一个功能强大的网络抓取工具,专为高效地抓取互联网信息而设计。该版本(1.0.0.6)体现了其稳定性和可靠性,能够同时处理多个网站的抓取任务,以满足大数据时代的广泛需求。Web...

    weibo_spider_爬虫python_关键词爬虫_python_python爬虫_spider_源码.rar

    标题中的"weibo_spider"表明这是一个针对微博的爬虫项目,主要使用的编程语言是Python。关键词"python爬虫"和"spider_源码"暗示我们这里将深入探讨Python编程语言中的网络爬虫技术,特别是针对微博平台的数据抓取。...

    spiderMonkey_js-1.5-rc6a.tar.gz_SpiderMonkey_openVXI_spiderMonke

    SpiderMonkey是Mozilla公司开发的一款JavaScript引擎,它是Firefox浏览器的核心组成部分之一。这个名为"spiderMonkey_js-1.5-rc6a.tar.gz"的压缩包文件包含了SpiderMonkey的1.5版本的源代码,其中rc6a代表的是...

    spidermonkey引擎 源码

    C++ js 互相调用 spider monkey

    spider.py, spider.py.zip

    spider.py, spider.py 关于该爬虫( 爬虫有坑。初学时编写,仅供参考)程序运行示例:Spider.py -u url -d深度日志文件默认当前目录,名字:spider。log##主要参考:http://bbs.chinaunix.net

    Scrapy框架中Spider的用法

    Scrapy 框架中 Spider 的用法 Scrapy 框架中 Spider 的用法是指在 Scrapy 里面要抓取网站的链接配置、抓取逻辑、解析逻辑里都是在 Spider 里面去完成的。在实现 Scrapy 爬虫项目里面,最核心的就是 Spider 类了,它...

    通过MOZILLA的javascript引擎(SpiderMonkey)执行js代码

    Mozilla的SpiderMonkey是第一个JavaScript引擎,由Mozilla基金会开发,用于支持Firefox浏览器和其他Mozilla相关项目。这个引擎实现了ECMAScript标准,使得JavaScript代码能够被高效地解析和执行。 SpiderMonkey的...

    spider_news_all, Scrapy Spider for 各种新闻网站.zip

    在"spider_news_all"项目中,开发人员创建了一个Scrapy蜘蛛,专门用于抓取各种新闻网站的内容。这个开源项目意味着任何人都可以查看、学习或在现有代码基础上进行修改。 首先,我们要了解Scrapy的基础架构。Scrapy...

Global site tag (gtag.js) - Google Analytics