网络爬虫之爬一爬2008奥运会的赛事结果

先决条件:

Python环境然后装了下模块

Beautifulsoup4,lxml,requests


笔者当然推荐Anaconda了,在此基础上pip或者conda安装就行

如,

C:\>conda install lxml beautifulsoup4 requests

 

其实爬下来倒不是很难,不管是requests还是urllib,一下就能把页面download下来,在抓下来之后的数据清理及整合显得更重要!!!

 

因为互联网上的网页千奇百怪,所以,抓取之前一定得踩踩点。

打开网页:http://baike.baidu.com/view/16667.htm

wKiom1ZNkd6z5XXmAADeU5ftSjM558.png 

 

可以瞧见最外层divclassmain-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

 

###匹配divclass等于main-content

summary = soup.find("div",{'class':"main-content"})


###在上面的基础上,find_all抓出所有table

tables = summary.find_all("table")


###你会发现有15table

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)


 

###索引data0到最后所有的数值,间隔为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


wKiom1ZNkfKTn4ccAAAqgLAelEg224.png 

 

最后数据分析什么的就好说了啦~~~~j_0001.gif

怎么数据分析可以参考鄙人的

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]

wKiom1ZNmLLTmdDGAAAmYEPufA8599.png


##画画排名前十金牌的柱状图

ax = df.head(10).plot(kind='bar',x=u'国家/地区\n',y= u'金牌数\n',title=u"前十排名图")

wKioL1ZNm3SD_jjgAAA8txk3OHQ163.png


哎~~乱码的问题我也搞着头疼,先放着,会的指导一下,写的仓促还望见谅j_0041.gif


其他的一些分析就看个人发挥了。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值