轰轰烈烈而又满是槽点的里约奥运会已经结束好久了(吗),莘莘学子也迎来了又一年的开学季,即将投入到紧张的学习中去,然而,暑假收获的那一大堆老公老婆已经深深地烙进了我们的心中,跟着我们一起去学习,去努力,去奋斗......(额,编不下去了),总之呢,不管怎样,我就是写了个小爬虫,来爬取下今年参加奥运会的运动员信息(信息就在官网上,不算泄露吧???)
第一次写文章,好紧张,啊喂,废话好像太多了,开始放大招(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)
这样,我们的程序就算完成了,然后运行,看着数字一个一个蹦出来好开心,也不枉这么长时间的学习,刚学爬虫的小伙伴们赶紧试起来吧~