当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 7 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [python]如何抓取网页的更新
帖子发表于 : 2009-02-23 12:22 
头像

注册: 2007-01-16 21:27
帖子: 76
地址: 上海
送出感谢: 0 次
接收感谢: 0 次
很多网页都会自动更新一些内容上去
比如说:http://www.opensolaris.org/os/community/on/flag-days/all/

我想知道怎么用python写个脚本自动抓取那个网页上的更新内容
自己有一点点思路,就是把把网页的内容抓下来,然后和原来的内容比较(一开始保存一个网页内容作为比较对象,需要时就更新这个文件),把更新的内容提取出来 最后mail出去
但是我现在只会一点python的简单语法,怎么抓取网页和分析html都不大会
请大虾指点,谢谢~


_________________
_______________________________________
Ubuntu is not my all
But it makes me enjoy all my life


页首
 用户资料  
 
2 楼 
 文章标题 : Re: [python]如何抓取网页的更新
帖子发表于 : 2009-02-23 21:44 
头像

注册: 2007-01-16 21:27
帖子: 76
地址: 上海
送出感谢: 0 次
接收感谢: 0 次
search了一下午
误打误撞弄了一个基本能用的:
代码:
#coding=utf-8
#需要BeautifulSoup 支持:http://crummy.com/software/BeautifulSoup

import re
import urllib
import urllib2
import xml.dom.minidom
from xml.sax.saxutils import unescape
from BeautifulSoup import BeautifulSoup          # For processing HTML

def formalize(text):
    result = ''
    lines = text.split(u'\n')
    for line in lines:
        line = line.strip()
        if len(line) == 0:
            continue
        result += line + u'\n'
    return result

def formalize_better(text):
    result = ''
    version = ''
    tmp = ''
    lines = text.split(u'\n')
    lens = len(lines)
    i = 0
    while i < lens:
        line = lines[i].strip()
        if len(line) == 0:
            i = i + 1
        elif re.match('Build [0-9]+',line) is not None:
            version = line
            i = i + 1
        else:
            tmp = version + u' ' + line + u' ' + lines[i+1].strip() + u'\n'
            result += tmp
            i = i + 2
    return result

def remove_tag(origin):
    minisoup = BeautifulSoup(origin)
    text = ''.join([e for e in minisoup.recursiveChildGenerator() if isinstance(e, unicode)])
    text = urllib.unquote(unescape(text, {'&quot;':'"'}))
    print "begin to fomalize~"
    text = formalize_better(formalize(text)).encode("utf-8")
    return text


updatefile = open("opensolaris_update.txt", "w")
count = 0
proxy_support = urllib2.ProxyHandler({"http" : "http://proxy01.pd.intel.com:911"})
opener = urllib2.build_opener(proxy_support)
# install it
urllib2.install_opener(opener)

url = "http://www.opensolaris.org/os/community/on/flag-days/all/"
data = urllib2.urlopen(url).readlines()
soup = BeautifulSoup("".join(data))
updates = str(soup.findAll('tbody')[0])

text = remove_tag(updates)
print >> updatefile, text
updatefile.close()

updatefile = open("opensolaris_update.txt", "r")
backupfile = open("opensolaris_backup.txt", "r")
resultfile = open("opensolaris_update_result", "w")

backup_contents = backupfile.readline()

for update_contents in updatefile.readlines():
    if update_contents == backup_contents or update_contents == '':
        break
    else:
        print >> resultfile, update_contents

updatefile.close()
backupfile.close()
resultfile.close()



下一步是通过结果把更新发出去~


_________________
_______________________________________
Ubuntu is not my all
But it makes me enjoy all my life


页首
 用户资料  
 
3 楼 
 文章标题 : Re: [python]如何抓取网页的更新
帖子发表于 : 2009-02-25 1:31 
头像

注册: 2007-03-01 20:46
帖子: 2393
地址: 湖南长沙
送出感谢: 0 次
接收感谢: 0 次
不错,不过检测网页更新,建议楼主可以看看Information Retrieval相关的文章

网页更新检测有许多算法,其中一个我知道的是用哈希来做的~~
原理简单说来就是:将网页与某个Hash建立映射,在网页更新的时候,再次生成这个Hash的时候会与原来的不一样。这个算法的重点在于哈希函数的定义,如何能够定义出使网页的哈希唯一而又高效的一个哈希函数是重要的,不过很多人已经提出了各种哈希函数~~

在知道网页更新了以后,提取内容就是另一个问题了,呵呵~~最简单的就是用diff啦~~


页首
 用户资料  
 
4 楼 
 文章标题 : Re: [python]如何抓取网页的更新
帖子发表于 : 2009-12-08 22:33 

注册: 2009-12-08 22:23
帖子: 1
送出感谢: 0 次
接收感谢: 0 次
请问3楼 Information Retrieval是什么?是一个可供检索的库么?谢谢。


页首
 用户资料  
 
5 楼 
 文章标题 : Re: [python]如何抓取网页的更新
帖子发表于 : 2009-12-09 23:49 
头像

注册: 2007-03-01 20:46
帖子: 2393
地址: 湖南长沙
送出感谢: 0 次
接收感谢: 0 次
0000069958 写道:
请问3楼 Information Retrieval是什么?是一个可供检索的库么?谢谢。


额……这位是马甲吧……
不管了,Information Retrieval简单点说是自然语言处理的一个技术,例如搜索引擎就是一种Information Retrieval


页首
 用户资料  
 
6 楼 
 文章标题 : Re: [python]如何抓取网页的更新
帖子发表于 : 2009-12-09 23:54 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
网站,不是都有rss订阅嘛。你这折腾干嘛。


_________________
● 鸣学


页首
 用户资料  
 
7 楼 
 文章标题 : Re: [python]如何抓取网页的更新
帖子发表于 : 2009-12-10 0:39 

注册: 2009-12-10 0:36
帖子: 3
送出感谢: 0 次
接收感谢: 0 次
我也做了一个
但是不知道为什么
老是获取不到新的内容
在浏览器上已经可以看到更新的内容了
但是urlopen。read()出来的还是以前的内容!!
郁闷啊!!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 7 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译