现在的位置: 主页 > 主打产品 > 文章正文

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

作者:武警河南洛阳红丝带网 来源:www.027fck.com 未知发布时间:2017-09-08 22:14:47
[python学习] 简单爬取维基百科程序语言消息盒

文章主要讲述如何通过Python爬取维基百科的消息盒(Infobox),主要是通过正则表达式和urllib实现;后面的文章可能会讲述通过BeautifulSoup实现爬取网页知识。由于这方面的文章还是较少,希望提供一些思想和方法对大家有所帮助。如果有错误或不足之处,欢迎之处;如果你只想知道该篇文章最终代码,建议直接阅读第5部分及运行截图。

一. 维基百科和Infobox

你可能会疑惑Infobox究竟是个什么东西呢?下面简单介绍。
维基百科作为目前规模最大和增长最快的开放式的在线百科系统,其典型包括两个网状结构:文章网络和分类树(以树为主体的图)。该篇博客主要是对维基百科“程序语言”结构进行分析,站群系统,下载网页后提取相关消息盒(Infobox)中属性和对应的值。
Infobox是模板(一系列的信息框),通常是成对的标签label和数据data组成。
下图是维基百科“世界政区索引”中“中国”的部分Infobox信息和“程序设计语言列表”的“ACL2”语言的消息盒。


二. 爬虫实现
1. python下载html网页 首先需要访问维基百科的“程序设计语言列表”,并简单讲述如何下载静态网页的代码。在维基百科中输入如下URL可以获取所有程序语言列表:

通过如下代码可以获取静态的html页面:
# 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!!!' 获取的本地wikipedia.html界面如下图所示:

2. 正则表达式获取URL超链接 现在需要通过Python正则表达式获取所有语言的超链接URL。
网页中创建超链接需要使用A标记符,结束标记符为.它的最基本属性是href,用于指定超链接的目标,通过href属性指定不同的值,可以创建不同类型的超链接.
href = '

CSDN

' link = re.findall(r(?<=href=).+?(?=)|(?<=href=').+?(?='), href) print link 上面是获取网页URL的正则表达式代码,输出结果是:['http://blog.csdn.net/eastmount/article/details/www.csdn.cn']。
但是获取“程序设计语言列表”中所有语言时,我是通过人工确定起始位置“0-9”和结束位置“参看”进行查找的,代码如下: # 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: print url 输出的结果HTML源码主要包括以下几种形式:
输出: #A http://blog.csdn.net/wiki/C%EF%BC%83 /w/index.php?title=A%2B%2B&amp;action=edit&amp;redlink=1. 此时获取了href中URL,很显然“http://zh.wikipedia.org”加上获取的后缀就是具体的一门语言信息,如: http://zh.wikipedia.org/wiki/C# http://zh.wikipedia.org/wiki/A_Sharp_(.NET) 它会转换成C%EF%http://blog.csdn.net/eastmount/article/details/..等形式。而index.php?此种形式表示该页面维基百科未完善,相应的Infobox消息盒也是不存在的。下面就是去到每一个具体的URL获取里面的title信息,同时下载相应的静态URL。 3. 获取程序语言title信息及下载html 首先通过拼接成完整的URL,在通过open函数下载对应的程序语言html源码至language文件夹下;再通过正则表达式r'(?<= )'可以获取网页的title信息。代码如下: # 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+' ') #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('****************获取程序语言信息************* ') 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_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]+'】 ') print title[:middle] #设置下载数量 j=j+1 time.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信息 获取Infobox的table信息,通过分析源代码发现“程序设计语言列表”的消息盒如下:


而“世界政区索引”的消息盒形式如下:

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:潜江网站制作 http://qianjiang.666rj.com

上一篇:ASP.NET下调用ffmpeg与mencoder实现视频转换截屏 下一篇:最后一页