每个大网站都会限制蜘蛛的访问频率,一旦发现那么对应蜘蛛所在IP就会被封锁一段时间
如何应对这种问题发生呢?有几个方法
1,程序中使用代理,即使被封仍可让服务使用其它代理抓取内容,目前基本都采用这种方法,毕竟网上可以找好多代理,唯一需要调整的策略就是代理的选择与更新
2,使用对应网站提供的接口抓取,例如用百度的BAE来部署抓取百度自身内容程序,因为程序是对集群操作,所以可以当成天然的代理使用(唯一不知道是否百度也会对自身集群进行IP封锁)
如下我仅说明一下2的方法过程:
1,注册百度帐号
2,进入百度开放平台: http://developer.baidu.com/bae
3,右上角“快速创建应用”
4,创建web应用,例如应用名称为your_app_name
5,上传本地写好的蜘蛛程序:例如baidu.zip(下列文件内容)
6,上线测试
baidu 文件夹下有如下文件
1,fetcher.php
<?php
//确定url
if(isset($_GET['url'])){
$url = urldecode($_GET['url']);
}else{
echo "url empty!";
return;
}
//设置抓取选项
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//开始抓取
$chData = curl_exec($ch);
if (!curl_errno($ch)) {
$info = curl_getinfo($ch);
curl_setopt($ch, CURLOPT_URL, "http://blog.csdn.net/timegoesby001");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
//echo 'fecthurl test ' . $info['url'];
//返回内容
echo $chData;
} else {
echo 'Curl error: ' . curl_error($ch);
}
//结束抓取
curl_close($ch);
?>
app.conf内容如下
handlers:
- url : ^/s
script: fetcher.php
- url : /(.*)
script: index.php /内容可与fetcher.php一致
- expire : .jpg modify 10 years
- expire : .swf modify 10 years
- expire : .png modify 10 years
- expire : .gif modify 10 years
- expire : .JPG modify 10 years
- expire : .ico modify 10 years
然后然baidu文件夹打成baidu.zip上传到BAE平台上
上线即可
比如你用python中的urllib2.open来打开url地址那么可以
直接在python程序中使用data = urllib2.urlopen("http://your_app_name.duapp.com/s?url=your_url_address").read()
这样data中即为百度集群帮你抓取的内容