今天学习爬取的网址是2016里约奥运会参赛运动员的信息
网址是:http://info.2016.163.com/2016/athlete/list/
使用了第三方库 requests
1. 第一步:
# 构造headers信息
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
2. 第二步:
从网页源代码中观察出,这里有点意思,于是用正则解析
def get_url_page():
"""
从主界面解析出每个运动员个人网址,返回列表
"""
url = 'http://info.2016.163.com/athlete/list/' # 目标网址
try:
response = requests.get(url, headers=headers) # 请求获取网页信息
except:
print('服务器请求失败')
response.encoding = response.apparent_encoding # 编码格式
res = re.findall(r"""<div class="logo">\s+<a title='(.*?)' href='/athlete/(\d+).html' target="_blank">.*?</a>""",
response.text, re.S) # 利用正则表达式提取信息
id_list = []
for i in res:
id_list.append(i[1])
return id_list
3. 第三步:
这里可以看到有我们需要的信息
def get_content(id):
"""
进入到每个网址获取信息
"""
url = 'http://info.2016.163.com/athlete/{}.html'.format(id)
try:
time.sleep(random.randint(0, 3)) # 控制访问速度
response = requests.get(url, headers=headers)
except:
return None
response.encoding = response.apparent_encoding
res = re.compile('<li ><strong>(\S+):</strong>(\S+)</li>')
result = res.findall(response.text)
name_list = re.findall('<h1>(\S+) <span>(.*?)</span></h1>', response.text, re.S)[0]
return result, name_list
4. 第四步:文件存储
def main():
count = 0
f = open('/tmp/yundongyuan.csv', 'w', encoding='utf-8') # 创建一个csv文件
writer = csv.writer(f, delimiter='\t', quoting=csv.QUOTE_ALL)
row = ['姓名', '英文名', '性别', '国家', '出生日期', '身高', '体重', '项目', '籍贯', '注册单位'] # 设置行首
writer.writerow(row)
id_list = get_url_page()
for i in id_list:
result, result2 = get_content(i)
if result is not None:
x = dict((result))
x.update({'姓名': result2[0], '英文名': result2[1]})
count += 1
for j in row:
if j not in x.keys():
x.update({j: None})
writer.writerow(
[x['姓名'], x['英文名'], x['性别'], x['国家'], x['出生日期'], x['身高'], x['体重'], x['项目'], x['籍贯'], x['注册单位']])
print(count)
f.close()
5. 总结:
完整代码如下:
# -*- coding: utf-8 -*-
import re
import requests
import time
import random
import csv
# 构造headers信息
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
def get_url_page():
"""
从主界面解析出每个运动员个人网址,返回列表
"""
url = 'http://info.2016.163.com/athlete/list/' # 目标网址
try:
response = requests.get(url, headers=headers) # 请求获取网页信息
except:
print('服务器请求失败')
response.encoding = response.apparent_encoding # 编码格式
res = re.findall(r"""<div class="logo">\s+<a title='(.*?)' href='/athlete/(\d+).html' target="_blank">.*?</a>""",
response.text, re.S) # 利用正则表达式提取信息
id_list = []
for i in res:
id_list.append(i[1])
return id_list
def get_content(id):
"""
进入到每个网址获取信息
"""
url = 'http://info.2016.163.com/athlete/{}.html'.format(id)
try:
time.sleep(random.randint(0, 3)) # 控制访问速度
response = requests.get(url, headers=headers)
except:
return None
response.encoding = response.apparent_encoding
res = re.compile('<li ><strong>(\S+):</strong>(\S+)</li>')
result = res.findall(response.text)
name_list = re.findall('<h1>(\S+) <span>(.*?)</span></h1>', response.text, re.S)[0]
return result, name_list
def main():
count = 0
f = open('/tmp/yundongyuan.csv', 'w', encoding='utf-8') # 创建一个csv文件
writer = csv.writer(f, delimiter='\t', quoting=csv.QUOTE_ALL)
row = ['姓名', '英文名', '性别', '国家', '出生日期', '身高', '体重', '项目', '籍贯', '注册单位'] # 设置行首
writer.writerow(row)
id_list = get_url_page()
for i in id_list:
result, result2 = get_content(i)
if result is not None:
x = dict((result))
x.update({'姓名': result2[0], '英文名': result2[1]})
count += 1
for j in row:
if j not in x.keys():
x.update({j: None})
writer.writerow(
[x['姓名'], x['英文名'], x['性别'], x['国家'], x['出生日期'], x['身高'], x['体重'], x['项目'], x['籍贯'], x['注册单位']])
print(count)
f.close()
if __name__ == '__main__':
main()
如发现可以改进的地方或者哪里做得不好,希望大家能够提出多多交流。