采集网站之利器wget和批量替换内容

wget采集:

wget --mirror -p --convert-links -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6" http://www.hao535.com/

 

批量替换内容,主要要到网站所在目录下执行:

find -type f|xargs perl -i -pe s%查找内容%替换后内容%g

有了这两个法宝,纯静态的网站,一般都能顺利采集完

告别我的两个域名

toupaimen和gailvshai,陪伴一年多的两个域名,第一个非常适合做图片站,可惜没用心去做,采集了一个插边的图片站后,放在那里就一直没动,放了年把,竟然每天也有200ip,周末pv也有千把,有几个还算热门的关键词在百度上能排到第一页第一屏,可见要是用心去经营一下,还是能做出点流量的。

第二个纯粹是看中有备案,可以少费点事,毕竟备案还要百把块钱,昨天到金名网上看了一下,好的三拼也值个3、4K,有人说toupaimen能值10K,在我看来也要有人识货才会值这个钱,域名就是看缘分,既然有人觉得好,正好我也缺这几个小钱,忍痛割爱。

再见了,两个域名,尤其是偷拍门/头牌们。

站点移到国内百度收录是不是会好一点

前段时间搞了份手机号码归属地的数据,顺手搭了个手机号码查询的站:www.wanhongrui.com

到百度提交了首页,结果只收录了首页,其他页面迟迟没有收录,谷歌倒是收录了一万多个页面,幸好有备案,先转移到国内,看看百度是不是会收录更多。

eclips和汉化包

下了个eclips,最新版本:Kepler Service Release 1

不过是英文版的,不太习惯,找到汉化包,http://download.eclipse.org/technology/babel/babel_language_packs/R0.11.0/kepler/kepler.php

有各种语言版本的,找到中文简体版,BabelLanguagePack-eclipse-zh

解压覆盖,重新启动,熟悉的中文就出来了。

至少菜单层面看,汉化的比较彻底。

xhEditor上传文件功能

xhEditor是一款不错的js超文本编辑器,感觉还是不错的,默认是不提供文件上传功能的,需要设定参数,才会开启。

默认初始化:$(‘#content’).xheditor();

如果想开启图片上传,那么要这样:

$(‘#content’).xheditor({upImgUrl:”upload.php?immediate=1″,upImgExt:”jpg,jpeg,gif,png”});

上传url地址里的immediate参数是给xhEditor的,表示立即上传,php端可直接忽略。

图片处理upload.php接收图片文件数据要注意了,默认是html5上传,不是普通的表单上传,所以是没有_FILES数组的,要通过file_get_contents(‘php://input’)获取文件内容。

最后要注意的是返回的数据,采用json格式,具体格式如下:

$arr = array("err" => "","msg" => "http://pic.jpg");
echo json_encode($arr);

 

wordpress更新不了主题的元凶:scandir

这个博客自从搭好以后,就没更新过主题,随着一次次迁移,都是直接拷贝文件拷库,根本就没遇到过更新不了主题的问题。

今天就遇到了,在另外一台上装了个wp,传几个主题后,后台主题管理竟然什么东西也没有,还以为是版本不兼容,后来发现原来wp是直接读theme目录,用了scandir函数,而大部分安全相关和目录操作函数在本机都是被禁掉的,读不了主题目录,也就没有主题出来了。

不过wp应该提示一下,提示也没有,这点是不对的。

jsonp和应用实例-2000万开房查询接口

jsonp,我个人的理解就是一个可以跨域的js接口,这个接口直接返回一个本地的function调用,其参数一般是json格式,数据来源于接口。好像比较费解。实例说明:

前段时间爆出2000万开房数据的漏洞,这里就是一个获取数据的jsonp接口:http://www.2dianying.net/kaifang.php?fun=callback&id=310104198405232812

提供了两个参数fun和id,其中id是身份证号码,接口会按照指定id返回json格式的开房数据,fun参数是关键,可以看到这个url直接返回的是一个js函数调用,而这个函数名又是调用方指定的,当然也需要在调用方的页面上实现具体的功能。

下面是一个简单的调用方接口实现代码:

function callback(json){
		for(var i=0; i < json.length; i++){
			document.write(json[i]["name"]+json[i]["address"]+json[i]["phone"]+json[i]["time"]);
		}
	}

看起来好像很简单啊,问题是怎样查询不同的id,并且实时返回数据呢?如果只是用script标签用src指定一个固定的接口地址,那只能获取一个固定的id的开房情况。

这个时候就要用到动态生成script标签的功能了,主流浏览器都支持的:

var otherid = "xxxxx";
var script = document.body.appendChild(document.createElement("script"));
script.src = "http://www.2dianying.net/kaifang.php?fun=callback&id="+otherid;

至此一个完整的jsonp应用实例就完成了。

Fatal error: Allowed memory size of 134217728 bytes exhausted

什么时候php会报内存不够呢?涉及到大文件操作的时候,比如下载文件。

用curl采集文件,有的可能特别大,php.ini默认的memory_limit为128M,文件大一点,就会报这个错误了,解决办法是内存限制改大一点,修改php.ini或者用ini_set(‘memory_limit’, ‘1024M’);

适当的加大即可。

另附上采集的curl脚本:

function getcontent($url){
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_REFERER, "http://www.xxx.com/"); 
	curl_setopt($curl, CURLOPT_HEADER, 0);
	curl_setopt ($curl, CURLOPT_TIMEOUT, 600 );
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	$data = curl_exec($curl);
	curl_close($curl);
	return $data;
}

 

基于jquery的无刷新多文件上传

有几个关键点:

1、无刷新

2、多文件上传

无刷新,就是不显示提交表单,file控件有改变就触发文件上传,且页面不刷新,很高级的感觉。

多文件上传,点击file控件,弹出的选择文件系统对话框,可以选择多个文件并上传。

这些都基于jquery,这是好东西,这个上传的js如下:

(function($) {
	var context = new Array();
	var gUploadId = 0;
	var settings = null;
	var index = 0;

	var onProgress = function(ev) {
		console.debug("progress");
		if (ev.lengthComputable) {
			var id = ev.target.upfile_id;
			var uploadId = ev.target.upload_id;
			settings = context[uploadId]['settings'];			
			var percent = Math.round(ev.loaded * 100 / ev.total);
			console.debug("percent=" + percent);
			console.debug("progress");
			if (settings.progress != null)
				settings.progress(id, percent);
		}
	}

	var onLoad = function(ev) {
		var id = ev.target.upload.upfile_id;
		var uploadId = ev.target.upload.upload_id;
		settings = context[uploadId]['settings'];
		console.debug(ev.target.responseText);
		json = eval("(" + ev.target.responseText + ")");
		console.debug("success");
		if (settings.success != null)
			settings.success(id, json);
	}

	var fetch = function(uploadId, upfile) {
		settings = context[uploadId]['settings'];
		console.debug("fetch.settings=" + settings.url);
		console.debug("fetch");
		console.debug("add(" + index + ")");
		if (settings.add != null)
			settings.add(index);
		var fd = new FormData();
		fd.append(settings.fieldName, upfile);
		var xhr = new XMLHttpRequest();
		xhr.addEventListener("load", onLoad, false);
		xhr.upload.addEventListener("progress", onProgress, false);
		xhr.upload.upfile_id = index;
		xhr.upload.upload_id = uploadId;
		xhr.open("POST", settings.url, true);
		xhr.send(fd);
		index++;
	}

	$.fn.upload = function(options) {

		settings = jQuery.extend({
			url: null,
			add: null,
			success: null,
			fieldName: 'upload_file',
			progress: null,
		}, options);
		context[gUploadId] = new Array();
		context[gUploadId]['settings'] = settings;
		$(this).attr('g-upload-id', gUploadId);
		gUploadId++;
		this.each(function() {
			var $el = $(this);
			$(this).bind('change', function() {
				var fileList = $el.get(0).files;
				for (var i = 0; i < fileList.length; i++) {
					var uploadId = $(this).attr('g-upload-id');
					fetch(uploadId, fileList[i]);
				}
			});

		});

		return this;
	}

})(jQuery);

用法:

$('input[type=file]').upload({
	url: 'http://upload.chengxufan.com/upload',
	add: function(id) {
		$('#box').append('<li id="'+id+'"><img src="/default.png" /></li>')
	},
	success: function(id, json) {
		$('#box').find("li[id='+id+']").html('<img src="'+json.data+'" />');
	},
	progress: function(id, percent) {
		$('#box').find("li[id='+id+']").html('progress is %' + percent);
	}
 });

如果有多个file控件,那么就要定义多个upload绑定