零、前言
之前写过获取baidu搜索结果的Py脚本,但是越来越觉得baidu在搜索上跟google还是有很大差距的,尤其是google支持很多搜索语法,非常强大。所以这里这里写了个简单的获取google搜索结果的脚本。但是google做了防爬取限制,使用一般的正则匹配是不行的,这里用的是google的ajax的接口,但是使用起来还是有些问题,没有完全解决。
一、修改hosts文件上google
Hosts是一个没有扩展名的系统文件,其基本作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统再会将网址提交DNS域名解析服务器进行IP地址的解析,如果发现是被屏蔽的IP或域名,就会禁止打开此网页!
也就是说通过hosts文件可以自定义google的代理ip,这样就能上google,这里有个hosts文件定期更新的网站
http://blog.my-eclipse.cn/host-google.html
按照上面的教程更改即可
二、获取google搜索结果的Python代码
#! /usr/bin/env python #coding=utf-8 import urllib2,urllib import msvcrt import simplejson import sys def CatchURL(key,num):#抓取链接 url = ('https://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=%s&rsz=8&start=%s') % (key,num) try: request = urllib2.Request(url) response = urllib2.urlopen(request) results = simplejson.load(response) URLinfo = results['responseData']['results'] except Exception,e: print e else: for info in URLinfo: result.append(info['url']) def RemoveRepeat(List):#列表去重 New_List = [] for i in List: if i not in New_List: New_List.append(i) return New_List def save(List): f = open("result","w") for i in List: f.write(i+"\n") f.close() if __name__ == '__main__': searchstr = raw_input() pagenum = input() result = [] for i in range(1,pagenum+1): CatchURL(searchstr,i) result = RemoveRepeat(result) save(result) print "DONE!"
运行程序,第一行输入搜索的内容,第二行输入搜索的页数,然后会在程序同目录下生成result文件,里面是获取并且去重后的url,但是程序运行的时候可能会出现如下的情况
那是因为google检测到非正常的请求,导致无法获取搜索结果,暂时未能解决。