分类: Python/Ruby
2010-09-21 00:36:00
好久没有更新自己的GAE站点了,之前做过的一个小功能,就是在增加bookmark的时候,会去根据URL把这个page抓下来,并压缩保存到GAE的 model里去。大致实现方法如下:
1. 根据URL抓网页:
content = service.getContent(url)
def getContent(url):
try:
urlopen = MyOpener()
fp = urlopen.open(url)
content = fp.read()
fp.close()
content = zlib.compress(content, 9)
except:
content = None
return content
user_agents = [
'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
'Opera/9.25 (Windows NT 5.1; U; en)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9'
]
class MyOpener(URLopener, object):
version = choice(user_agents)
service 提供了 getContent(url)方法,需要通过urlopen.open方法去取内容,这里urlopen是自己定制的一个类,是URLOpener的子 类。这里主要是设置version,以达到欺骗某些网站会屏蔽程序抓取网页的功能。我曾经直接用URLOpener,结果无法抓取javaeye论坛。当 然如果有些网站采用更为严厉的防抓取手段的话,这个也就不管用了。
抓取回来的内容通过zlib.compress来压缩,存储。
2. 显示抓取内容:
class ShowContent(webapp.RequestHandler):
def get(self, id):
bookmark = CoolBookmark.get_by_id(int(id))
if bookmark:
self.response.headers['Content-Type'] = "text/html"
decomp = zlib.decompressobj()
content = decomp.decompress(bookmark.zipcontent)
self.response.out.write(content)
这里只要注意把压缩的内容进行解压,然后再用response.out就可以了。