先决条件:
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"前十排名图")
哎~~乱码的问题我也搞着头疼,先放着,会的指导一下,写的仓促还望见谅
其他的一些分析就看个人发挥了。。。