获取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了。