利用百度应用引擎(BAE)抓取百度信息过程

时间:2022-04-23 17:51:24

每个大网站都会限制蜘蛛的访问频率,一旦发现那么对应蜘蛛所在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中即为百度集群帮你抓取的内容