新建一个py 文件,写一个保存数据的类,也可以不新建,个人习惯
class Bibi_top100():
def __init__(self,title,top_num,rank,view_counts,up_name,up_id,url):
self.title = title
self.top_num = top_num
self.rank = rank
self.view_counts = view_counts
self.up_name = up_name
self.up_id = up_id
self.url = url
#生成一条一条的list数据
def save_data(self):
return [self.top_num,self.title,self.up_name,self.up_id,self.rank,self.view_counts,self.url]
@staticmethod #静态方法
def csv_title():
return ['排名','视频标题','up主名','up主ID','视频得分','播放量','url']
爬虫代码py里 引入
# 爬取哔哩哔哩热门视频排行榜
import datetime
import csv
import requests #python3.6 内置
from bs4 import BeautifulSoup #没有就安装:pip3 install beautifulsoup4
from blog.cvs_python import Bibi_top100 #引入模型类
#爬取目标网址
url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
#获取目标html内容
data_html = requests.get(url).text
#BeautifulSoup可以将html内容解析处理 'html.parser' 告诉它是什么类型
soup = BeautifulSoup(data_html,'html.parser')
#获取所有的li
#find_all 找到所有的li标签,但是有些li比标签不是我们需要的,观察发现
#这些需要的li标签的class都是rank-item,所谓我们在后面加上条件
li_list = soup.findAll('li',{'class':'rank-item'})
bibi_top100 = []
#遍历li_list,
#text 显示文本内容
for i in li_list:
# 视频标题,因为每个的标题都是li标签下的a标签里,并且class="title"
title = i.find('a',{'class':"title"}).text
# 视频排名
top_num = i.find('div',{'class':"num"}).text
# 视频得分
rank = i.find('div',{'class':"pts"}).find('div').text
# 播放量,
#view_counts = i.find('div',{'class':"detail"}).find('span',{'class':'data-box'}).text
view_counts = i.find('span',{'class':'data-box'}).text #因为span标签的 class唯一,上句可以简写
#up主名
#up_name = i.find('div', {'class': "detail"}).find('a').find('span',{'class':"data-box"}).text
# up主名,上句可以这样:因为每一条li里有3个a,全部找出来取第3个内容
up_name = i.find_all('a')[2].text
#获取up的ID,利用get获取url,然后解析出id,利用字符串切片
up_id = i.find_all('a')[2].get('href')[len('//space.bilibili.com/'):]
#视频url
url = i.find('a',{'class':"title"}).get('href')
#每一条数据都存入进去
bibi_tops = Bibi_top100(title=title,top_num=top_num,rank=rank,view_counts=view_counts,up_name=up_name,up_id=up_id,url=url)
bibi_top100.append(bibi_tops)
# 文件命名
file_name =datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S')
# 打开文件
with open('bibi视频排行榜100_%s'%file_name, 'w',encoding='utf-8',newline='') as f:
# 实例化一个对象
writer = csv.writer(f)
# 写入表的标题栏
writer.writerow(Bibi_top100.csv_title())
# 将对应的数据一条一条循环出来 写入
for i in bibi_top100:
writer.writerow(i.save_data())
运行这个文件,发现已经爬取下来。
bibi视频排行榜100_2020-02-23_15_33_48.csv
如果想改成excl,这样:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl
import openpyxl #pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl
#实例化一个对象
mywb = openpyxl.Workbook()
#设置活动的表格
sheet = mywb.active
#设置这个活动表格名称
sheet.title = 'MyNewTitle'
#获取需要写入数据的表格
mysheet = mywb.get_sheet_by_name('MyNewTitle')
#写入表的头部栏
mysheet.append(Bibi_top100.csv_title())
#逐条写入数据
for i in bibi_top100:
mysheet.append(i.save_data())
#保存到本地,excl的名字
mywb.save('NewExcelFile.xlsx')
参考文档:https://blog.csdn.net/weixin_38336920/article/details/82703209
登陆后方可评论