用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - python代码库

简单爬取维基百科程序语言消息盒

2015-04-18 作者: 易居山举报

[python]代码库

# coding=utf-8 
import urllib 
import time 
import re 
   
#第一步 获取维基百科内容 
#http://zh.wikipedia.org/wiki/程序设计语言列表 
keyname="程序设计语言列表" 
temp='http://zh.wikipedia.org/wiki/'+str(keyname) 
content = urllib.urlopen(temp).read() 
open('wikipedia.html','w+').write(content) 
print 'Start Crawling pages!!!' 
   
#第二步 获取网页中的所有URL 
#从原文中"0-9"到"参看"之间是A-Z各个语言的URL 
start=content.find(r'0-9'
end=content.find(r'参看'
cutcontent=content[start:end] 
link_list = re.findall(r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')", cutcontent) 
fileurl=open('test.txt','w'
for url in link_list: 
    #字符串包含wiki或/w/index.php则正确url 否则A-Z 
    if url.find('wiki')>=0 or url.find('index.php')>=0:      
        fileurl.write(url+'\n'
        #print url 
        num=num+1 
fileurl.close() 
print 'URL Successed! ',num,' urls.' 
   
#第三步 下载每个程序URL静态文件并获取Infobox对应table信息 
#国家:http://zh.wikipedia.org/wiki/阿布哈茲 
#语言:http://zh.wikipedia.org/wiki/ActionScript 
info=open('infobox.txt','w'
info.write('****************获取程序语言信息*************\n\n'
j=1 
for url in link_list: 
    if url.find('wiki')>=0 or url.find('index.php')>=0
        #下载静态html 
        wikiurl='http://zh.wikipedia.org'+str(url) 
        print wikiurl 
        language = urllib.urlopen(wikiurl).read() 
        name=str(j)+' language.html' 
        #注意 需要创建一个country的文件夹 否则总报错No such file or directory 
        open(r'language/'+name,'w+').write(language) #写方式打开+没有即创建 
        #获取title信息 
        title_pat=r'(?<=<title>).*?(?=</title>)' 
        title_ex=re.compile(title_pat,re.M|re.S) 
        title_obj=re.search(title_ex, language) #language对应当前语言HTML所有内容 
        title=title_obj.group() 
        #获取内容'C语言 - 维基百科,自由的百科全书' 仅获取语言名 
        middle=title.find(r'-'
        info.write('【程序语言  '+title[:middle]+'】\n'
        print title[:middle] 
   
        #第四步 获取Infobox的内容 
        #标准方法是通过<table>匹配</table>确认其内容,找与它最近的一个结束符号 
        #但此处分析源码后取巧<p><b>实现 
        start=language.find(r'<table class="infobox vevent"') #起点记录查询位置 
        end=language.find(r'<p><b>'+title[:middle-1])    #减去1个空格 
        infobox=language[start:end] 
        #print infobox 
   
        #第五步 获取table中属性-属性值 
        if "infobox vevent" in language: #防止无Infobox输出多余换行 
            #获取table中tr值 
            res_tr = r'<tr>(.*?)</tr>' 
            m_tr =  re.findall(res_tr,infobox,re.S|re.M) 
            for line in m_tr: 
                #print unicode(line,'utf-8') 
               
                #获取表格第一列th 属性 
                res_th = r'<th scope=.*?>(.*?)</th>' 
                m_th = re.findall(res_th,line,re.S|re.M) 
                for mm in m_th: 
                    #如果获取加粗的th中含超链接则处理 
                    if "href" in mm: 
                        restr = r'<a href=.*?>(.*?)</a>' 
                        h = re.findall(restr,mm,re.S|re.M) 
                        print unicode(h[0],'utf-8'
                        info.write(h[0]+'\n'
                    else
                        #报错用str()不行 针对两个类型相同的变量 
                        #TypeError: coercing to Unicode: need string or buffer, list found 
                        print unicode(mm,'utf-8') #unicode防止乱 
                        info.write(mm+'\n'
   
                #获取表格第二列td 属性值 
                res_td = r'<td .*?>(.*?)</td>' 
                m_td = re.findall(res_td,line,re.S|re.M) 
                for nn in m_td: 
                    if "href" in nn: 
                        #处理超链接<a href=../rel=..></a> 
                        res_value = r'<a .*?>(.*?)</a>' 
                        m_value = re.findall(res_value,nn,re.S|re.M) #m_td会出现TypeError: expected string or buffer 
                        for value in m_value: 
                            print unicode(value,'utf-8'), 
                            info.write(value+' '
                        print ' ' #换行 
                        info.write('\n'
                    else
                        print unicode(nn,'utf-8'
                        info.write(nn+'\n'
            print '\n' 
            info.write('\n\n'
        else
            print 'No Infobox\n' 
            info.write('No Infobox\n\n\n'
   
        #设置下载数量 
        j=j+1 
        time.sleep(1
        if j==40
            break
    else
        print 'Error url!!!' 
else
    print 'Download over!!!'


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...