我知道有些二次元肥仔就是喜欢看这些二次元东西,反正我是没看过,不知道你们怎么样呢?
今天就给大家分析一下他的视频列表页
首先呢,打开网页,借用开发者工具,检查分析,看一下网页源代码中有没有你想要的信息,有的话直接解析,没有的话点开网络,查看请求,根据关键字搜索,看一下请求返回的数据是什么样的。如果是json的话,直接向这个请求的url发起请求。
然后,将请求来的数据用json.loads()方法转成json数据
再根据key取出你要获取的数据。
最后将数据保存下来。
我获取的是前10页的数据,数据不多,仅供参考
在此给各位提个醒,爬虫需谨慎,最好挂个代理,以防被封
代码如下:
import csv
import json
import time
import requests
class Bili(object):
def __init__(self):
self.retry = 0
self.page = 0
self.html = ''
self.url = 'https://api.bilibili.com/x/web-interface/newlist?pn=1&ps=20&_=1546868687676&rid=33&type=0&jsonp=jsonp'
self.headers = {
'Cookie': '你的cookie',
'Host': 'api.bilibili.com',
'Referer': 'https://www.bilibili.com/v/anime/serial/?spm_id_from=333.334.b_7072696d6172795f6d656e75.8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',
'Connection': 'keep-alive'
}
self.save_header()
def save_header(self):
"""保存到csv中的表头"""
headers = [['番剧名', '图片链接', '播放量', '弹幕量', '投稿时间']]
with open('bili.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerows(headers)
def save_csv(self, data_list):
"""将数据保存到csv中"""
with open('bili.csv', 'a', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerows(data_list)
def get_html(self, url):
"""获取网页源码"""
try:
self.retry += 1
response = requests.get(url, headers=self.headers)
self.html = response.text
# print(self.html)
except Exception as e:
if self.retry > 3:
print(f'请求失败,正在尝试第{self.retry}次重新请求')
time.sleep(3)
return
self.get_html(self.url)
else:
self.retry = 0
def get_data(self):
"""获取数据"""
data_list = []
result = json.loads(self.html)
datas = result["data"]["archives"]
for d in datas:
data = []
data.append(d["title"])
data.append(d["pic"])
data.append(d["stat"]["view"])
data.append(d["stat"]["danmaku"])
# 创建时间
time_local = time.localtime(d["ctime"])
ctime = time.strftime("%Y-%m-%d %H:%M:%S", time_local)
data.append(ctime)
data_list.append(data)
self.save_csv(data_list)
def run(self):
for x in range(1, 11):
time.sleep(2)
print(f'正在爬取第{x}页数据,请稍后')
url = f'https://api.bilibili.com/x/web-interface/newlist?pn={x}&ps=20&_=1546868687676&rid=33&type=0&jsonp=jsonp'
self.get_html(url)
self.get_data()
if __name__ == '__main__':
bili = Bili()
bili.run()
注:本文为原创,未经本人授权,禁止转载,交流可加群:872404578