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")

來運行另一個文件來發送文件。

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