爬虫案例2——爬取NBA球员排行

简介:个人学习分享,如有错误,欢迎批评指正

任务从虎扑体育中爬取NBA球员得分数据排行

目标网页地址:https://nba.hupu.com/stats/players

一、思路和过程

目标网页具体内容如下:
​​​​​​在这里插入图片描述
我们的任务是将上图红色框框里面的内容爬取下来,保存为txt文件。

1.定义目标URL

由于网页普遍具有反爬程序,不加修饰的直接访问网页可能会失败,所以第一步学会伪装自己。
如何伪装自己呢,可以通过找到正常访问网页时的访问状态,将自己的这次爬虫模拟成一次正常访问网页,因此我们的目标是找到正常访问网页时的User-Agent。User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。User-Agent就是你访问网页的身份证明。具体操作如下:

首先打开目标网页,然后点击鼠标右键后选择检查打开网页的HTML 页面。
在这里插入图片描述

在HTML 页面里面依次点击网络,然后任意点一条网络请求(如果没有显示任何网络请求可以点击网页左上角的刷新),然后选择标头,下拉列表找到User-Agent,User-Agent后面那段内容就是我们用来伪装自己的身份码。

在这里插入图片描述

2.发送GET请求获取网页内容

通过上面的步骤我们获得了
url = ‘https://nba.hupu.com/stats/players’

User-Agent:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0’

接下来发起网页访问请求,代码如下:

import requests  # 引入requests库,用于发送HTTP请求
from lxml import etree  # 引入lxml库中的etree模块,用于解析HTML文档

# 定义目标URL,即要爬取的网页地址
url = 'https://nba.hupu.com/stats/players'

# 定义HTTP请求头,其中包括User-Agent信息,用于伪装成浏览器进行访问
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
}

# 发送GET请求获取网页内容,并将响应内容存储在resq变量中
resq = requests.get(url, headers=headers)
# 打印响应内容,检查获取到的HTML文本
print(resq.text)

查看print结果,我们发现成功获得了网页相关的html表达,
在这里插入图片描述

3.分析网页内容

接下来对html进行解析获得我们目标内容。
这里,我们需要借助工具xpath来辅助内容解析,xpath安装教程

安装成功后,按Ctrl+Shift+Alt 启动 xpath,网页上方出现如下图所示框,
在这里插入图片描述
找到目标内容方法
例:我们的目标是找到凯文杜兰特在html中的位置。点击如下图左边标记(1),该命令的含义是在网页中选择一个元素以进行检查,即当你把鼠标放在网页的某一位置,下面也会自动定位到html中该内容所在位置,如图所示,把鼠标放在凯文-杜兰特(2),下面显示凯文-杜兰特在html中所在位置(3)。
在这里插入图片描述

明确目标内容的位置。具体的,如下图所示“德文-布克”,它位于players_table中的tr层中的td层中的a里面。

在这里插入图片描述
因此,我们可以通过这个层层关系来找到目标“德文-布克”,借助刚才安装的工具xpath,一步步演示层层查找过程。
首先,添加players_table,可以发现下面整个框以绿色被选中,
在这里插入图片描述
其次,加上筛选条件tr得
在这里插入图片描述
再者,再加上筛选条件td得
在这里插入图片描述
进一步发现,从上往下每一个td代表表中的一个指标
在这里插入图片描述
在这里插入图片描述

进一步通过xpath验证,td[1]得到了第一列的数据。
在这里插入图片描述
因此,通过xpath的可视化辅助,得上面地址//table[@class="players_table"]//tr//td可以获取目标数据

4.获取目标数据

上一步得到了目标数据的地址,接下来就是分别获得到目标数据,代码如下:

# 使用etree.HTML方法将HTML文本解析为一个HTML文档对象
e = etree.HTML(resq.text)

# 使用XPath语法从HTML文档中提取出球员排名数据(第一列)
nos = e.xpath('//table[@class="players_table"]//tr//td[1]/text()')
# 使用XPath语法从HTML文档中提取出球员姓名数据(第二列)
names = e.xpath('//table[@class="players_table"]//tr//td[2]/a/text()')
# 使用XPath语法从HTML文档中提取出球员所在球队数据(第三列)
teams = e.xpath('//table[@class="players_table"]//tr//td[3]/a/text()')
# 使用XPath语法从HTML文档中提取出球员得分数据(第四列)
scores = e.xpath('//table[@class="players_table"]//tr//td[4]/text()')

5.保存数据

存为一个txt文件

# 打开一个名为'nba.txt'的文件,使用utf-8编码进行写入
with open('nba.txt', 'w', encoding='utf-8') as f:
    # 使用zip函数将排名、姓名、球队和得分数据组合在一起,逐行写入文件
    for no, name, team, score in zip(nos, names, teams, scores):
        # 写入格式为:排名:{no} 姓名:{name} 球队:{team} 得分:{score}
        f.write(f'排名:{no} 姓名:{name} 球队:{team} 得分:{score}\n')

二、完整python代码

import requests  # 引入requests库,用于发送HTTP请求
from lxml import etree  # 引入lxml库中的etree模块,用于解析HTML文档

# 定义目标URL,即要爬取的网页地址
url = 'https://nba.hupu.com/stats/players'

# 定义HTTP请求头,其中包括User-Agent信息,用于伪装成浏览器进行访问
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
}

# 发送GET请求获取网页内容,并将响应内容存储在resq变量中
resq = requests.get(url, headers=headers)
# 打印响应内容,检查获取到的HTML文本
print(resq.text)

# 使用etree.HTML方法将HTML文本解析为一个HTML文档对象
e = etree.HTML(resq.text)

# 使用XPath语法从HTML文档中提取出球员排名数据(第一列)
nos = e.xpath('//table[@class="players_table"]//tr//td[1]/text()')
# 使用XPath语法从HTML文档中提取出球员姓名数据(第二列)
names = e.xpath('//table[@class="players_table"]//tr//td[2]/a/text()')
# 使用XPath语法从HTML文档中提取出球员所在球队数据(第三列)
teams = e.xpath('//table[@class="players_table"]//tr//td[3]/a/text()')
# 使用XPath语法从HTML文档中提取出球员得分数据(第四列)
scores = e.xpath('//table[@class="players_table"]//tr//td[4]/text()')

# 打开一个名为'nba.txt'的文件,使用utf-8编码进行写入
with open('nba.txt', 'w', encoding='utf-8') as f:
    # 使用zip函数将排名、姓名、球队和得分数据组合在一起,逐行写入文件
    for no, name, team, score in zip(nos, names, teams, scores):
        # 写入格式为:排名:{no} 姓名:{name} 球队:{team} 得分:{score}
        f.write(f'排名:{no} 姓名:{name} 球队:{team} 得分:{score}\n')

结~~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值