用户注册



邮箱:

密码:

用户登录


邮箱:

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

发表随想


还能输入: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、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

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

加载中,请稍后...