[python学习] 简单爬取维基百科程序语言消息盒

你可以看到从A到Z的各种程序语言,如A# .NET、ActionScript、C++、易语言等,当然可能其中很多语言都没有完善或没有消息盒Infobox。同样如果你想查询世界各个国家的信息,输入URL如下: 世界政区索引 通过如下代码可以获取静态的html页面:# coding=utf-8import urllibimport timeimport re#第一步 获取维基百科内容#程序设计语言列表keyname="程序设计语言列表"temp=''+str(keyname)content = urllib.urlopen(temp).read()open('wikipedia.html','w+').write(content)print 'Start Crawling pages!!!' 获取的本地wikipedia.html界面如下图所示:

2. 正则表达式获取URL超链接

现在需要通过Python正则表达式获取所有语言的超链接URL。 网页中创建超链接需要使用A标记符,结束标记符为</A>.它的最基本属性是href,用于指定超链接的目标,通过href属性指定不同的值,可以创建不同类型的超链接.href = '<p><a href="" title="csdn">CSDN</a></p>'link = re.findall(r"(?<=href=\&;).+?(?=\&;)|(?<=href=\&;).+?(?=\&;)", href)print link 上面是获取网页URL的正则表达式代码,输出结果是:[‘www.csdn.cn’]。 但是获取“程序设计语言列表”中所有语言时,我是通过人工确定起始位置“0-9”和结束位置“参看”进行查找的,,代码如下:

# coding=utf-8import urllibimport timeimport re#第一步 获取维基百科内容#程序设计语言列表keyname="程序设计语言列表"temp=''+str(keyname)content = urllib.urlopen(temp).read()open('wikipedia.html','w+').write(content)print 'Start Crawling pages!!!'#第二步 获取网页中的所有URL#从原文中"0-9"到"参看"之间是A-Z各个语言的URLstart=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:print url 输出的结果HTML源码主要包括以下几种形式:<a href="#A">A</a><a href="/wiki/C%EF%BC%83" title="C#" class="mw-redirect">C#</a> <a href="/w/index.php?title=…" class="new" title="A Sharp (.NET)(页面不存在)">A# .NET</a>输出:#A/wiki/C%EF%BC%83/w/index.php?title=A%2B%2B&amp;action=edit&amp;redlink=1. 此时获取了href中URL,很显然“”加上获取的后缀就是具体的一门语言信息,如:

#

(.NET)

它会转换成C%EF%..等形式。而index.php?此种形式表示该页面维基百科未完善,相应的Infobox消息盒也是不存在的。下面就是去到每一个具体的URL获取里面的title信息,同时下载相应的静态URL。

3. 获取程序语言title信息及下载html

首先通过拼接成完整的URL,在通过open函数下载对应的程序语言html源码至language文件夹下;再通过正则表达式r'(?<=<title>).*?(?=</title>)’可以获取网页的title信息。代码如下:# coding=utf-8import urllibimport timeimport re#第一步 获取维基百科内容#程序设计语言列表keyname="程序设计语言列表"temp=''+str(keyname)content = urllib.urlopen(temp).read()open('wikipedia.html','w+').write(content)print 'Start Crawling pages!!!'#第二步 获取网页中的所有URL#从原文中"0-9"到"参看"之间是A-Z各个语言的URLstart=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-Zif url.find('wiki')>=0 or url.find('index.php')>=0:fileurl.write(url+'\n')#print urlnum=num+1fileurl.close()print 'URL Successed! ',num,' urls.'#第三步 下载每个程序URL静态文件并获取Infobox对应table信息#国家:阿布哈茲#语言:info=open('infobox.txt','w')info.write('****************获取程序语言信息*************\n\n')j=1for url in link_list:if url.find('wiki')>=0 or url.find('index.php')>=0:#下载静态htmlwikiurl=''+str(url)print wikiurllanguage = urllib.urlopen(wikiurl).read()name=str(j)+' language.html'#注意 需要创建一个country的文件夹 否则总报错No such file or directoryopen(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]#设置下载数量j=j+1time.sleep(1)if j==20:break;else:print 'Error url!!!'else:print 'Download over!!!' 输出结果如下图所示,其中获取20个程序语言URL的标题输入infobox.txt如下:

然后是获取每门语言HTML下载至本地的language文件夹下,需要自己创建一个文件夹。其中一门语言代码如下,标题就是下图左上方的ACL2:

4. 爬取class=Infobox的table信息不求与人相比,但求超越自己,要哭就哭出激动的泪水,要笑就笑出成长的性格。

[python学习] 简单爬取维基百科程序语言消息盒

相关文章:

你感兴趣的文章:

标签云: