先决条件:
Python环境然后装了下模块
Beautifulsoup4,lxml,requests
笔者当然推荐Anaconda了,在此基础上pip或者conda安装就行
如,
C:\>conda install lxml beautifulsoup4 requests
其实爬下来倒不是很难,不管是requests还是urllib,一下就能把页面download下来,在抓下来之后的数据清理及整合显得更重要!!!
因为互联网上的网页千奇百怪,所以,抓取之前一定得踩踩点。
打开网页:http://baike.baidu.com/view/16667.htm
可以瞧见最外层div的class是main-content
至于td th tr 是什么的得自己瞧瞧html的一些教程,这里就不做介绍了
Html教程参考:http://www.w3school.com.cn/html/
下面就是步骤了
from bs4 import BeautifulSoup import requests import pandas as pd from pandas import Series,DataFrame
url = "http://baike.baidu.com/view/16667.htm" rets = requests.get(url) conts = rets.content soup = BeautifulSoup(conts,"lxml")
关于beautiful官方教程写得真细真好,而且有中文版的。
bs教程:http://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
###匹配div,class等于main-content的
summary = soup.find("div",{‘class‘:"main-content"})
###在上面的基础上,find_all抓出所有table
tables = summary.find_all("table")
###你会发现有15个table
len(tables)
###因为这个页面里有很多的table所以当然得打印出我们要的表格在第几个啦
for i in range(len(tables)): ths = tables[i].findAll("th") for j in ths: if u"名次" in j.text: print i
#创建一个data列表用来存所有的tr信息 data = [] #columns_list存字段名,如名次,国家上面的,dic_data用来生成一个一字段名为key,字段值为values的字典,后面你会了解为什么要这样 columns_list = [] dic_data = {} ###14就是上面打印的i,即我们所要的表格数据的在tables里的索引 rows = tables[14].findAll(‘tr‘) ths = tables[14].findAll("th")
##遍历出所有的字段名 for cols in ths: print cols.text columns_list.append(cols.text) ##遍历出所有的tr值 for tr in rows: cols = tr.findAll(‘td‘) for td in cols: text = td.find(text=True) print text, data.append(text)
###索引data从0到最后所有的数值,间隔为6,你会发现是一个名次的列表~
data[::6]
[u‘1‘,
u‘2‘,
u‘3‘,
u‘4‘,
u‘5‘,
u‘6‘,
u‘7‘,
u‘8‘,
u‘9‘,
....
u‘81‘,
u‘\u603b\u8ba1‘]
##以1起始当然是国家名啦,依次类推,分别是名次,国家,奖牌总数等
data[1::6]
[u‘\u4e2d\u56fd‘,
u‘\u7f8e\u56fd‘,
u‘\u4fc4\u7f57\u65af‘,
u‘\u82f1\u56fd‘,
....
u‘\u591a\u54e5‘,
u‘\u59d4\u5185\u745e\u62c9‘,
u‘\u3000‘]
##让我们把他们集合到一起 for i in range(len(columns_list)): dic_data[columns_list[i]] = data[i::6]
##然后整理成DataFrame吧 df = DataFrame(dic_data) df
怎么数据分析可以参考鄙人的
python数据分析实战之泰坦尼克号统计
http://youerning.blog.51cto.com/10513771/1711371
python数据分析之股票实战
http://youerning.blog.51cto.com/10513771/1712775
那么简单瞧瞧:
###所有的字段名
df.columns
Index([u‘名次 ‘, u‘国家/地区\n‘, u‘奖牌总数\n‘, u‘金牌数\n‘, u‘铜牌数\n‘, u‘银牌数\n‘], dtype=‘object‘)
###谁获得了金牌数大于10的
df[u‘金牌数\n‘] = df[u‘金牌数\n‘].astype("int32")
df[df[u‘金牌数\n‘] > 10]
##画画排名前十金牌的柱状图
ax = df.head(10).plot(kind=‘bar‘,x=u‘国家/地区\n‘,y= u‘金牌数\n‘,title=u"前十排名图")
哎~~乱码的问题我也搞着头疼,先放着,会的指导一下,写的仓促还望见谅
其他的一些分析就看个人发挥了。。。
本文出自 “又耳的笔记本” 博客,请务必保留此出处http://youerning.blog.51cto.com/10513771/1714789
原文地址:http://youerning.blog.51cto.com/10513771/1714789