python爬虫生活不易 我用python

一个简单的小爬虫——奥运健儿信息爬取

2016-08-30  本文已影响151人  李作

轰轰烈烈而又满是槽点的里约奥运会已经结束好久了(吗),莘莘学子也迎来了又一年的开学季,即将投入到紧张的学习中去,然而,暑假收获的那一大堆老公老婆已经深深地烙进了我们的心中,跟着我们一起去学习,去努力,去奋斗......(额,编不下去了),总之呢,不管怎样,我就是写了个小爬虫,来爬取下今年参加奥运会的运动员信息(信息就在官网上,不算泄露吧???)
第一次写文章,好紧张,啊喂,废话好像太多了,开始放大招(zhuang bi)吧~
首先,网址放上来:http://www.olympic.cn/zt/Rio2016/chinateam/
这个网站下是各个项目的一个汇总,每点取一个项目后进入该项目下的运动员总体信息网页,然后再选定运动员到达个人信息网页,所以我们要从第一个网址获取团体运动员信息链接,然后再从这个链接获取运动员个人信息链接。
第一步,解析汇总网页并得到团队信息的链接:

url="http://www.olympic.cn/zt/Rio2016/chinateam/"
#请求网址
wb_data=requests.get(url)
#解析网址
soup=BeautifulSoup(wb_data.text.encode("utf8"),"lxml")
#根据网页的CSS路径得到下一个网址的链接
links=soup.select('body > div.page_bodyer > div > div.sports_list > div > a')
for link in links:  
       url=link.get('href')  

这样,我们就得到了每一个团体的链接信息,然后据其得到每个运动员的链接信息,为了方便,我们需要定义一个函数,如下:

#得到运动员个人信息链接
#url为上一级传过来的参数
def more_news(url):   
        wb_data = requests.get(url)   
        soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")                    
        presons_links=soup.select('body > div.page_bodyer > div > div >  div.sports_team_player_list > div > a')    
        more_link=link.get('href') 
        #由于得到的链接不全,在这里我们要把它补全   
        url="http://2016chinateam.olympic.cn/"+more_link       

接下来,我们就可以到运动员个人信息的网站耍耍啦~

def person_data(url): 
      wb_data = requests.get(url)    
      soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")
      #观察网址后我们发现,所有的运动员信息都在一个td标签下,所以用一个find_all函数就可以解决了
      names=soup.find_all("td")
     #定义一个列表,用来存储爬取的信息
      person = []
      for name in names:    
              ming=name.get_text()   
              person.append(ming)
    #为了存储方便,将列表中的信息存入一个字典
      for data in person:       
              detial={           
                   "name":person[0],            
                    "sex":person[1],           
                    "both":person[2],            
                    "stature":person[4],            
                    "weight":person[5],            
                    "title":person[6],            
                    "registered":person[7],           
                    "project":person[8],           
                    "homeplace": person[3],      
                    }  
    #然后,我们还要把爬取的信息存入一个记事本中
     with open('1.txt', 'a') as f:   
               f.write("\n")    
               for each in detial:        
                        write_str = str(each) + ': ' + detial[each] + '      '                         
                        f.write(write_str)            

这样,一个简单的爬虫框架似乎就完成了,接下来,我们就要在这个框架上添加东西,把他们有效的组织起来。

#导入我们需要的库
import requests
from bs4 import BeautifulSoup
import time

#第一个函数,根据团体信息获取个人信息链接
def more_news(url):   
      wb_data = requests.get(url)    
      soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml") 
     #得到标签中的信息      
      presons_links=soup.select('body > div.page_bodyer > div > div > div.sports_team_player_list > div > a')  
     #这是一个延时函数 
      time.sleep(2)    
      for link in presons_links:  
               #提取链接信息     
               more_link=link.get('href') 
               #组装链接,得到个人信息的链接             
               url="http://2016chinateam.olympic.cn/"+more_link
               #将链接传入获取个人信息的函数           
               person_data(url)

#第二个函数,获取个人信息的函数
def person_data(url): 
     #将i定义为全局变量   
      global i    
      wb_data = requests.get(url)    
      soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml") 
      #找到td标签下的个人信息,并存入一个列表中        
      names=soup.find_all("td")    
      person = []    
      for name in names:        
                ming=name.get_text()        
                person.append(ming)
      #由于在爬取的过程中遇到编码问题,我们用一个try绕过他   
       try:      
               #正常情况,存入字典,并保存至记事本 
                for data in person:           
                           detial={               
                                    "name":person[0],            
                                    "sex":person[1],           
                                    "both":person[2],            
                                    "stature":person[4],            
                                    "weight":person[5],            
                                    "title":person[6],            
                                    "registered":person[7],           
                                    "project":person[8],           
                                     "homeplace": person[3],            
                                  }        
                  with open('1.txt', 'a') as f:           
                             f.write("\n")            
                             for each in detial:               
                                      write_str = str(each) + ': ' + detial[each] + '      '                
                                      f.write(write_str)  
                                      #每存入一个信息,便输出一个相应的数字      
                                      i=i+1        
                                      print(i)  
        #异常情况,并将出错的地方输出 
        except UnicodeEncodeError:                         
           print(person)

i=0
#第一页链接信息
url="http://www.olympic.cn/zt/Rio2016/chinateam/"
#请求并解析网页
wb_data=requests.get(url)
soup=BeautifulSoup(wb_data.text.encode("utf-8"),"lxml")
links=soup.select('body > div.page_bodyer > div > div.sports_list > div > a')
#将得到的每一个团队链接进行循环,并传入more_news函数
for link in links:  
       url=link.get('href')   
       more_news(url)

这样,我们的程序就算完成了,然后运行,看着数字一个一个蹦出来好开心,也不枉这么长时间的学习,刚学爬虫的小伙伴们赶紧试起来吧~

上一篇 下一篇

猜你喜欢

热点阅读