2006年12月7日星期四

百度和Google的编程接口比较

  百度和Google做为知名的搜索引擎,有非常丰富的搜索资源信息,很多人都希望编写程序调用搜索引擎的宝贵数据,昨天我写的那个程序是调用百度的搜索接口,为什么使用百度的呢,这中间其实也是有原因的。

  我最开始打算调用Google的接口,Google本身也提供了Google SOAP Search API供程序员调用,一天可以进行一千次搜索调用,由于API是通过Web Service提供的,因此最佳调用是通过Java调用,然而不知何故我调试时候,搜索英文没问题,搜索中文就老报数组溢出错误。

  由于我的调用程序需要访问Access数据库,因此我还是打算使用VB来编写,通过VB直接访问Google的搜索页面,于是我就很快写了一个通过VB直接调用Google查询的程序,一运行,发现竟然失败了,这令我很惊讶,因为我去年六月曾经也写过类似的调用程序,少量的直接调用Google搜索,当时是可以成功的。而现在调用失败,说明此功能已经被完全禁止。出现的错误界面如下所示。

Google禁止的界面

  其中的信息提到一个地址,就是“适用于个人的Google服务条款”,其中有一条:“不得执行自动查询 :未经 Google 事先明确许可,不得将任何形式的自动查询发到 Google 系统。请注意,‘自动查询’包括通过使用软件向 Google 发送查询来确定搜索不同内容时网站的 Google 排名。”

  这一条也就禁止用户编写程序直接调用Google,而必须通过类似Google SOAP Search API这样的接口来调用,每天查询次数被限制为1000次以下。

  然而我通过同样的原理调用百度搜索引擎的时候,却发现调用完全正常,百度可以返回正确的搜索结果,虽然有时候搜索结果里会带有竞价广告。我尝试增加调用频率,在短时间内进行五千次以上的程序搜索,发现程序依旧工作正常,百度依旧会返回查询结果。

  搜索引擎开放程序直接调用,的确方便了很多程序员,这样,即使百度不提供类似Google的API,我们也可以编程访问其搜索资源。

  当然,我也猜测,百度这样做也不一定真的是为了造福大众,因为百度以前曾经推广过一些搜索插件程序,类似紫光拼音输入法也会绑定百度的插件,因此会存在大量通过客户端程序而不是浏览器对于百度的访问,而百度对这方面很难进行判断识别,因此就开放了应用程序的直接调用搜索。而Google没有推广过类似的客户端插件,因此为了节省服务器资源,索性就完全关闭了客户端的直接调用。

  客户端的这种调用,对百度来说也是有一定压力的,如果大家滥用这些资源,那么百度也有可能会学Google一样关闭客户端的直接调用,因此不可滥用资源,例如我昨天提供的程序就限制了每次最多只能进行500次查询,以免对搜索服务器造成过大负载。

2006年12月6日星期三

防止文章被复制的网络分析软件

  很多Blogger都遇到过自己文章被其他人非法复制的情况,为了让大家能快速将恶意转载者找出来,我根据搜索引擎的一些原理,利用百度搜索引擎的数据,开发了一个可以自动分析查找那些对自己有“实质伤害”的复制人的地址。

防止文章被抄袭的网络分析软件

  这是一个独立的可执行的程序,完全免费,基于ACCESS数据库,目前支持Z-Blog系统,其实支持其他ASP的Blog修改也很简单,有需要的可以联系一下我。(注:其他Blog程序的使用方法:先建立一个Access文件,然后建立一个表,表名为blog_Article,表中增加字段log_ID和log_Title,log_ID为自动编号,log_Title为文章标题,然后将你Blog上的文章标题都复制过来,一篇文章对应一条记录,只复制标题即可,然后在本程序中选择这个数据库)

  数据挖掘我是直接通过调用搜索引擎来实现的。原先打算使用Java下调用Google SOAP API来实现,不过不知什么原因,Google SOAP API搜索英文没有任何问题,一搜索中文就报数组超界,不知道什么原因。只好去调用百度的搜索引擎。

  百度的搜索引擎没有API,不过我还是有办法间接调用的。调用的时候发现中文的确没有什么问题,也没有错误,很顺利就调通了程序。

  我目前搜索的时候,采用了“实质伤害”这个概念,因为目前文章转载的情况会非常多,每一个都去处理会很麻烦。因此我们只去寻找情况恶劣的即可。这个可以通过搜索引擎排名来实现。只寻找那些转载地址对于原文影响最坏的。

  这个程序使用起来很简单,先选择数据库文件,再选择Z-Blog系统,然后填写你自己的域名,点搜索即可开始执行。搜索完成后会自动生成一个名为list.txt的文件,就是搜索结果。此程序对于部分标题的文章会有误判,最好文章标题个性化浓一些。软件的界面看起来不是很好,因为我没有美工嘛。

  点击下载软件:转载文章搜索器

2006年12月5日星期二

申请Google AdSense for Feeds

  今天从困兽那里听到一个消息,说“Google已经开始接受AdSense for Feeds申请,只要你的网站 feed 订阅数在100以上,并且拥有 AdSense 帐户,就可以参加 AdSense for feeds (BETA)。申请地址:https://services.google.com/ads_inquiry/aff 。”

  我对此很感兴趣,于是也点击上面的链接申请,显示的页面是英文的,我选择填写自己的信息后提交,大概几分钟后,收到Google发来的一封邮件,内容如下:

  Thank you for your interest in AdSense for feeds.

  Unfortunately, we're unable to accept your application for the program at this time. Because AdSense for feeds is currently in beta, we're unable to accept all applicants into the program. If we're able to extend our service to you in the future, we'll be sure to let you know.

  自动被拒了。看来,中文Blog申请Google AdSense for Feeds还是有困难的,估计这个服务还是只对英文用户开放的。至少等英文用户使用稳定后,才可能考虑中文用户。

  大家有兴趣也可以去申请试试,看看能否申请成功。

2006年12月3日星期日

通过Web Service调用Google SOAP Search API

  我曾经介绍过“使用Axis开发Web Service程序”的一些步骤,做为一个更有特色的应用范例,本次我将介绍使用Axis通过Web Service调用Google SOAP Search API,实现Google搜索、Google快照、Google拼写这三项功能,包括示例源代码。

  一、环境配置

  首先,没有Java开发环境的,需要安装一下环境,点这里查看《Java开发环境的详细配置方法》,其实,本示例安装JDK 1.42以及Eclipse 3.2就可以了。

  二、将Apache Axis相关包文件放在WEB-INFlib目录下

  从Apache的主页上下载Axis包文件,复制到lib目录下。

  三、申请Google SOAP Search API license key

  要使用Google的服务,必须要有“license key”,如果你有Gmail帐号,点这里就可以申请license key,这个license key是一段很长的字符串,每个key可以支持每天1000次的Google搜索。

  四、下载WSDL文件,生成客户端Java代码

  WSDL文件的下载地址参见:http://api.google.com/GoogleSearch.wsdl

  生成客户端代码的批处理文件如下:

set Axis_Lib=D:workspace estWEB-INFlib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Output_Path=D:workspace estsrc
set Package=com.google.api
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% GoogleSearch.wsdl

  最后会生成下列代码文件:

DirectoryCategory.java
GoogleSearchBindingStub.java
GoogleSearchPort_PortType.java
GoogleSearchResult.java
GoogleSearchService.java
GoogleSearchServiceLocator.java
ResultElement.java

  五、编写程序,调用Google SOAP Search API

  在上面那个包下,编写你自己的Java程序,就可以调用Google SOAP Search API.目前可以使用的Google服务有:网页搜索,网页快照,拼写检查这三个。

  Java示例代码如下,请使用前将clientKey替换为你自己的。替换后直接运行即可得出结果。

package com.google.api;

import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;

public class ClientGoogle {

  public static void main(String[] args) throws ServiceException,
    RemoteException {
    String clientKey = "kkkkkkkkkkkkkkkkkkkkkkkkkkey";
    GoogleSearchServiceLocator service = new GoogleSearchServiceLocator();
    GoogleSearchPort_PortType gsp = service.getGoogleSearchPort();

    //Google Search API
    GoogleSearchResult searchResult = gsp.doGoogleSearch(clientKey,
        "www.williamlong.info", 0, 10, false, "", false, "", "latin1",
        "latin1");
    System.out.println("Google Search Results:");
    System.out.println("======================");
    ResultElement results[] = searchResult.getResultElements();
    for (int counter = 0; counter < results.length; ++counter) {
      ResultElement result = results[counter];
      String returnResult = "('" + result.getTitle() + "','"
          + result.getURL() + "','" + result.getSnippet() + "')";
      System.out.println("Return Result");
      System.out.println(returnResult);
    }

    //Google CachedPage
    byte[] cachedBytes = gsp.doGetCachedPage(clientKey,
        "http://www.williamlong.info/");
    System.out.println("Cached page:");
    System.out.println("============");
    String cachedString = new String(cachedBytes);
    System.out.println(cachedString);

    //Google SpellingSuggestion
    String suggestion = (String) gsp.doSpellingSuggestion(clientKey,
        "williamlong");
    System.out.println(suggestion);

  }

}

  当然,你也可以不使用Apache Axis,Google自己也提供了一个API包可以做为客户端调用,下载地址参见这里

  最后声明一下,Google SOAP Search API是属于实验产品,每个license每天最多只允许搜索一千次,其许可协议注明不能使用于商业模式的网站,而对于个人研究来说,每天一千次的搜索也就足够了。

  相关专业名词解释:

  Web Service:是一种革命性的分布是计算技术。它使用基于XML的消息处理作为基本的数据通讯方式,消除使用不同组件模型、操作系统和编程语言的系统之间存在的差异,使异类系统能够作为计算网络的一部分协同运行。开发人员可以使用像过去创建分布式应用程序时使用组件的方式,创建由各种来源的Web服务组合在一起的应用程序。由于Web服务是建立在一些通用协议的基础上,如HTTP(Hypertext Transfer Protocol, WWW服务程序所用的协议),SOAP(Simple Object Access Protocol,简单对象访问协议),XML,WSDL(Web Services Description Language,Web服务描述语言),UDDI(Universal Description,Discovery,and Integration,通用描述发现和集成协议)等,这些协议在涉及到操作系统、对象模型和编程语言的选择时,没有任何倾向,因此Web服务将会有很强的生命力。

  SOAP:是“Simple Object Access Protocol”的缩写,SOAP是消息传递的协议,它规定了Web Services之间是怎样传递信息的。简单的说,SOAP规定了:

  1. 传递信息的格式为XML.这就使Web Services能够在任何平台上,用任何语言进行实现。

  2. 远程对象方法调用的格式。规定了怎样表示被调用对象以及调用的方法名称和参数类型等。

  3. 参数类型和XML格式之间的映射。这是因为,被调用的方法有时候需要传递一个复杂的参数,例如,一个Person对象。怎样用XML来表示一个对象参数,也是SOAP所定义的范围。

  WSDL:是“Web Services Description Language”的缩写。WSDL是Web Services的定义语言。当实现了某种服务的时候(如:股票查询服务),为了让别的程序调用,必须告诉大家服务接口。例如:服务名称,服务所在的机器名称,监听端口号,传递参数的类型,个数和顺序,返回结果的类型等等。这样别的应用程序才能调用该服务。WSDL协议就是规定了有关Web Services描述的标准。

  UDDI:是“Universal Description, Discovery,and Integration”的缩写。简单说,UDDI用于集中存放和查找WSDL描述文件,起着目录服务器的作用。

  XML:(eXtensible Markup Language,可扩展标记语言)是Internet上数据表示和数据交换的新标准。它是ISO(International Organization for Standardization,国际标准化组织)的SGML(Standard for General Markup Language,通用标记语言标准)的一个简化子集。XML关注信息本身,是Web上表示结构化信息的一种标准文本格式。与传统的注重页面信息显示的HTML(Hypertext Markup Language, 超文本链接标示语言)相比,关注于内容的XML具有以下诸多优点:良好的可扩展性,语言简单有效,可自行定义标记;内容与形式的分离,主要刻画数据内容,不考虑显示效果;有严格的语法要求,便于分析统一和与数据库信息转换;便于传输,为纯文本形式,可通过Http协议直接传输,可跨越防火墙;等等。XML的出现和发展对于Internet和Intranet产生了巨大的影响。

2006年12月2日星期六

Google Blogger Beta中文界面启用

  昨天,ReallyFindIt留言给我一个消息,说Google Blogger Beta的后台管理的中文界面已经全面启用了。由于我以前一直用Email发帖子,登录后台较少,所以我立刻登录了一下Blogger Beta,发现界面的确已经全部是中文了。

  Blogger今年来在国内的服务断断续续,被折腾的也够呛,不过我依旧认为Blogger是最好的博客服务之一,速度快,功能多,Blogger Beta的一个最大的优势就是发表文章后不用重建了。这样发文章的速度就快多了。Blogger还有一个优势是操作简单,不用编辑HTML代码,只需要在设置界面上点几下鼠标,就可以完成界面部件的新增和修改,对于普通用户来说十分方便。另外Blogger还有很多实用的小技巧,所以,现在中文用户已经到了将Blogger升级到Blogger Beta的时机了。

  不过,如果你是通过FTP来发布Blogger的,那么还是不要升级好一些,反正FTP发布是肯定需要重建的。

PayPal支持电汇提现

  今天,收到一封邮件提示我的PayPal帐户收到了Review Me的50美元,于是登录了一下PayPal的英文网站,果然发现收到了50美元,同时我还发现另外一个有趣的东西,PayPal的英文网站居然用中文写了一个很大的广告,上书“最快3天,美元到您手-PayPal电汇提现”。这说明PayPal开通了对中国地区的电汇提现功能,中国人收美元又有了一个新方法。

  首先先向大家解释一个问题,就是PayPal和“PayPal贝宝”有什么区别?

  PayPal国际网站(www.paypal.com)是允许用户向世界各国用户发送和接收付款。 可以使用包括美元、加元、欧元、英镑、澳元和日元等币种。不过用户需要在账户添加国际信用卡(比如招行的信用卡)。

  PayPal贝宝(www.paypal.com.cn)只能向中国用户发送和接收付款,只能用人民币交易。用户可以添加一个中国的银行账户,在贝宝账户和银行账户之间进行资金转账。

  因此接收美元必须使用英文的PayPal才可以,中文的贝宝是收不到美元的。

  PayPal的网站上介绍新的电汇提现的一些优点:

  更快:只需3到7个工作日,美金就能到达用户的国内银行双币账号。

  更容易:只需几步便能在PayPal账户内添加用户的银行双币账号,立刻开始提现。

  更直接:无需海外银行账号,更不用申请支票,提现美金直接到达用户的国内银行双币账号。

  不过,我再给其补充上一条:

  更贵:每笔电汇提现需要支付20美元手续费(而且只有打折期间才是20美元) :(

  PayPal还在自己的网站上做了一张提现方案对比的图表:

  电汇

香港银行账户

美国银行账户 美国出具的支票
时间 3-7个工作日 5-7个工作日 3-4个工作日 6星期左右
費用 促销价20美元*
低于5折
提现免费
(可能会有兑换费用)
免费 5美元
收取币种 美元 港币 美元 美元
银行所在地 中国 香港 美国 存入中国银行账户

  注:一般国外银行电汇提现手续费在25至45美元之间。

  图表中可以看出,通过香港的招行一卡通提现是免费的,但是有汇率损失。美元全部转换为港币,用美国银行的帐户则完全免费,使用支票需要5美元费用,国内银行还会再收20元人民币左右的托收费用。

  总的来说,使用支票的方式还是更为实惠一些。当然,如果PayPal帐户资金较多的话,电汇也是不错的选择。

2006年12月1日星期五

百度搜藏的功能缺陷

  百度的网络收藏夹服务“百度搜藏”已经发布了,我也第一时间试用了一下,感觉百度搜藏有不少功能上的缺陷令人感到很遗憾,社会化功能很弱,速度也不是很快,不过搜索功能的确是做的不错。下面我就说一下我个人发现的一些百度搜藏的功能缺陷。

  一、分享地址在哪里?

  使用国外的del.icio.us美味书签的时候,可以很明确的知道任何一个人的书签地址,比如我的地址就是 http://del.icio.us/williamlong ,甚至分类(tags)地址也知道,比如这里是我baidu书签的地址。然而,使用百度搜藏的时候,我却找不到我的地址,或者是百度根本就没有这个功能,只有自己才能看到自己的书签。

分享地址在哪里

  更新:百度已经解决了这个缺陷,我们可以使用类似 http://cang.baidu.com/williamlong  的地址访问自己的搜藏地址。

  二、我的tags能分类吗?

  百度搜藏把tags翻译为“分类”,不过当我们的分类很多的时候,我们就需要一个bundle tags(分类包),我可以将我含义接近的分类再进行一次分类,这样我们的分类就看起来非常清晰了。

我的tags能分类吗

  三、只能进,不能出?

  百度搜藏的导入功能我用了一下,做的的确很不错,我的del.icio.us里的书签,可以连摘要和分类一起全部导入,一个都没有导错,看得出百度在导入这个功能上下了不少功夫,然而可惜的是,我在百度搜藏里面却找不到导出的功能,为什么其他的网络书签系统都提供导出功能,而偏偏百度搜藏却不提供呢?

只能进,不能出

  四、输出在哪里?

  百度搜藏里没有找到RSS输出,这也可以理解,用RSS的人也不多,JavaScript输出也没有找到,写Blog的人难道也不多,HTML输出呢?API呢?全都没有,不知道是因为这些功能没用?还是因为百度认为大家都不会用?

输出在哪里

  总之,用了一遍百度搜藏后,我觉得我还是继续使用我的del.icio.us吧,百度有不错的构思,可惜做的东西缺陷实在太多。