bilibili完结番剧分区数据抓取并发送到邮箱

 

 

 这是b站的完结番剧界面,它属于b站-番剧分区-完结动画区,今天来爬取b站的完结番剧,来了解他们的播放量和硬币数等。

爬取方法: 

B站是一个对于爬虫是一个很友好的网站,它对于爬虫有专门的接口 

https://github.com/uupers/BiliSpider/wiki


这个网址中有b站各个区域的接口,由于我们爬取的是b站二级分区数据,所以我们可以在这个网页右侧的[Bilibili API 二级分区视频分页数据(投稿时间逆序)]链接中,我们可以看到b站视频数据接口的信息。它是一个json文件。

我们需要用到的就是这部分信息,我们就转而获取视频接口信息的json文件,提取出想要的文件来保存在csv文件中。

我们总的思路是获取视频信息的json文件->提取json数据->保存数据为csv

在爬取过程中,很多网站都有自己的接口,我们可以去寻找接口来让爬取过程变得简单。

具体实现:

 

这个就是我们所需要获取的json文件的地址了

def get_url():
    url = 'http://api.bilibili.com/x/web-interface/newlist?rid=32&pn='
    for i in range(1, 328):
        urls.append(url + str(i) + '&ps=50')

得到json文件中的信息

def get_message(url):
    print(url)
    time.sleep(1)#一秒爬一次,运用了4个线程就是一秒爬4次
    try:
        r = requests.get(url, timeout=5)
        data = json.loads(r.text)['data']['archives']
        for j in range(len(data)):
            content = {}
            content['aid'] = data[j]['aid']
            content['title'] = data[j]['title']
            content['view'] = data[j]['stat']['view']
            content['danmaku'] = data[j]['stat']['danmaku']
            content['reply'] = data[j]['stat']['reply']
            content['favorite'] = data[j]['stat']['favorite']
            content['coin'] = data[j]['stat']['coin']
            comic_list.append(content)
    except Exception as e:
        print(e)

然后写入csv文件

def write_to_file(comic_list):#写入csv文件
    with open(r'bilibili-comic.csv', 'w', newline='', encoding='utf-8') as f:
        fieldnames = ['aid', 'title', 'view', 'danmaku', 'reply', 'favorite', 'coin']
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()
        try:
            writer.writerows(comic_list)
        except Exception as e:
            print(e)

我的电脑是4核的就创建4个线程,然后调用map函数运行get_messsage函数

get_url()
pool = ThreadPool(4)
pool.map(get_message, urls)
pool.close()
write_to_file(comic_list)

整体的代码

import requests
import json
import csv
from multiprocessing.dummy import Pool as ThreadPool#导入多线程库
import time
import os


comic_list = []
urls = []
6

def get_url():
    url = 'http://api.bilibili.com/x/web-interface/newlist?rid=32&pn='
    for i in range(1, 328):
        urls.append(url + str(i) + '&ps=50')


def get_message(url):
    print(url)
    time.sleep(1)#一秒爬一次,运用了4个线程就是一秒爬4次
    try:
        r = requests.get(url, timeout=5)
        data = json.loads(r.text)['data']['archives']
        for j in range(len(data)):
            content = {}
            content['aid'] = data[j]['aid']
            content['title'] = data[j]['title']
            content['view'] = data[j]['stat']['view']
            content['danmaku'] = data[j]['stat']['danmaku']
            content['reply'] = data[j]['stat']['reply']
            content['favorite'] = data[j]['stat']['favorite']
            content['coin'] = data[j]['stat']['coin']
            comic_list.append(content)
    except Exception as e:
        print(e)


def write_to_file(comic_list):#写入csv文件
    with open(r'bilibili-comic.csv', 'w', newline='', encoding='utf-8') as f:
        fieldnames = ['aid', 'title', 'view', 'danmaku', 'reply', 'favorite', 'coin']
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()
        try:
            writer.writerows(comic_list)
        except Exception as e:
            print(e)


get_url()
pool = ThreadPool(4)
pool.map(get_message, urls)
pool.close()
write_to_file(comic_list)
os.system("python ./send.py")

发送到邮箱

第一步:准备一个发送邮件的邮箱
这里,我去163邮箱注册了一个邮箱地址.这里为了在客户端发送邮件,需要对注册好后的邮箱进行设置一下.163邮箱很容易设置. 网页端登进邮箱主页后,点击设置选项后,在下拉菜单里面点击POP3/SMTP/IMAP.这时,左侧页面会有客户端授权密码一栏,点击这一栏, 网页右侧出现设置客户端授权密码,默认是关闭的,因为我们需要用程序发送邮件,程序本身就被当成客户端,所以这里需要点击开启,开启后会自从弹出界面,让你设置授权码(这个授权码是用在程序里面使用的).按照其说明,设置完毕后,就可以了. 这样这个邮箱就可以用在程序里面进行操作了。注意要先关闭pop3IMAP,才能开启SMTP!!
第2步:发送到自己的qq邮箱

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

_user = "[email protected]"
_pwd = "xxx"
_to = "[email protected]"

# 如名字所示Multipart就是分多个部分
msg = MIMEMultipart()
msg["Subject"] = "bilibili"
msg["From"] = _user
msg["To"] = _to

# ---这是文字部分---
part = MIMEText("xxxx")
msg.attach(part)

# ---这是附件部分---
# csv类型附件
csvpart = MIMEApplication(open('C:/Users/asus/PycharmProjects/untitled1/venv/bilibili-comic.csv', 'rb').read())
csvpart.add_header('Content-Disposition', 'attachment', filename='bilibili-comic.csv')
msg.attach(csvpart)


s = smtplib.SMTP("smtp.163.com", timeout=500)  # 连接smtp邮件服务器,端口默认是25
s.login(_user, _pwd)  # 登陆服务器
s.sendmail(_user, _to, msg.as_string())  # 发送邮件
s.close()

发送邮件和爬取是2个程序,因为如果写入一个程序中,那门运行的时间会很久,那门就分为2个程序,通过

os.system("python ./send.py")

来运行另一个文件来发送文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章