爬取NBA排名

获取URL及其网页源代码

爬取网站: link.
右键检查,然后右键点击网页内东西部排名检查,得到相关html信息的所在地。还可以右键检查网页源代码,查看你所需要爬取的信息是否就在HTML中,若不在,就要去查看js了。在这里插入图片描述
我们要爬取的数据还是存在,这样的话直接用css选择器来获取相关内容。在这里插入图片描述

代码

import requests
import json
from bs4 import BeautifulSoup


class RequestsURL():
    def __init__(self, url):
        self.url = url
        # 比较简单的防爬虫
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:62.0) Gecko/20100101 Firefox/62.0',
        }

    # 有些动态网页的数据是存在js中的,静态的话多数是html
    # 这里默认是html
    def get_response(self, flag=True):
        self.response = requests.get(self.url, headers=self.headers)
        # 响应码是200说明爬取成功
        if self.response.status_code == 200:
            print('正在爬取数据')
            # 默认HTML
            if flag:
                html = self.response.text
                soup = BeautifulSoup(html, 'html.parser')
                return soup
            # js
            else:
                html_bytes = self.response.content
                soup = json.loads(html_bytes)
                return soup
        else:
            print('爬取失败:', self.response.status_code)

简单分析

    # 奇数排名
    data1 = data.find_all(class_='data score-5')
    # 偶数排名
    data2 = data.find_all(class_='data odd score-5')

要爬取的数据都在这个里面,所以直接用find_all找td的数据,直接读出来,然后打印出来,分析处理数据。因为东西部排名的html格式一样,还有一些附加的数据之类,所以打印出来的结果都包含东西部的,只是有奇偶之分,所以需要对获取的数组进行重新排序和处理,这里比较麻烦。
在这里插入图片描述
这个就是对数据处理后的结果,这个是奇数排列的,当然你直接爬取的数据比较混乱,需要进行分析和处理在这里插入图片描述

所有代码


import csv
# 导入上一个代码的类
from example import RequestsURL

# 获取数据,只要前几列数据
def get_data(data, flag):
    team = []
    for d in data:
        for data1 in d.find_all('td'):
            team.append(data1.text.strip())
    # print(team)

    # 这里是为了方便写csv文件,而将一堆数据分成多维数据
    team1 = []
    j = 0
    x = []
    for i in team:
        x.append(i)
        j += 1
        if j == 15:
            j = 0
            team1.append(x)
            x = []
    if flag == 1:
        del team1[16:]
    else:
        del team1[14:]
    print(team1)
    return team1

def spiltWE(x, y):
    # 前8个是东部排名
    east1 = x[:8]
    # 后8个是西部排名
    west1 = x[8:16]
    
    east2 = y[:7]
    west2 = y[7:14]
    
    team_east = []
    team_west = []
    
    # 奇偶排序
    j = 0
    for i in range(8):
        team_east.append(east1[i])
        team_west.append(west1[i])
        # 这里是因为两个数组长度不一致,所以需要忽略该异常
        try:
            team_east.append(east2[i])
            team_west.append(west2[i])
        except IndexError:
            continue
    return team_east, team_west

def save_data(team_east, team_west, name):
    # 注意:open 函数中的newline='' 必不可少。否则会多出空白行。
    f = open('nba.csv', 'w', encoding='utf-8', newline='')
    writer = csv.writer(f)
    writer.writerow(['东部'])
    writer.writerow(name)
    for i in range(len(team_east)):
        writer.writerow(team_east[i])
    writer.writerow(['西部'])
    for i in range(len(team_west)):
        writer.writerow(team_west[i])
    f.close()
    print('保存文件成功')
    pass

def main():
    url = 'https://data.leisu.com/nba'
    func = RequestsURL(url)
    data = func.get_response()
    # 奇数排名
    data1 = data.find_all(class_='data score-5')
    # 偶数排名
    data2 = data.find_all(class_='data odd score-5')

    # 获取列表名称
    name = []
    for n in  data.find_all('th'):
        name.append(n.text)
    del name[15:]
    # print(name)

    x = get_data(data1, 1)
    y = get_data(data2, 2)
    team_east, team_west = spiltWE(x, y)
    # print(team_east)
    # print(team_west)

    save_data(team_east, team_west, name)

if __name__ == '__main__':
    main()

csv文件

在这里插入图片描述
可以用excel打开,不过需要注意,不能直接点击文件打开否则会出先乱码,甚至日期之类的。
打开excel新建,单击从文本/csv,选择csv文件,选择你保存文件所选择的编码方式
在这里插入图片描述
在这里插入图片描述
加载就ok了。

感谢各位的阅读,初次写博客,请多多包涵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值