小豬的Python學習之旅 —— 14.項目實戰:抓取豆瓣音樂Top 250數據存到Excel中

小豬的Python學習之旅 —— 14.項目實戰:抓取豆瓣音樂Top 250數據存到Excel中

標籤:Python


一句話概括本文

利用Excel存儲爬到的抓取豆瓣音樂Top 250數據信息,還有讀Excel。


引言

失蹤人口迴歸,最近比較迷茫,不知道是回頭深究Android,還是繼續
學Python,Android是舊愛,Python是新歡;Android應用層折騰來
折騰去,無非:改UI,寫控件,換下庫,換下架構…以前一直想着寫
自己的項目,然後各種加東西優化,然後發現自己卻沒有了當年的熱情,
唉!相比Python,隨手就是一爬蟲,批處理類的腳本,實用性高太多,
只是Python沒有引路人,都是自己一點點摸索,見步走步吧!

之前在寫爬小姐姐腳本時候,就遇到過一個如何存儲爬取到數據的問題,
比如一個系列的套圖鏈接應該放到特定的文件夾,我之前的操作都是
通過下面這樣的格式寫入到一個txt文件中:目錄~鏈接
然後讀取txt文件,獲得字符串,然後通過split(“~”)來進行分隔,
split("~")[0]是目錄,split("~")[1]是路徑,挺low的,
如果是涉及到三個維度以上的再拼多一個~,在上上一節抓
半次元coser的時候就遇到一個噁心的問題,符號都他麼被用了,
難以分隔,一個個特殊字符試,後面試到Θ纔可以..

迫切需要一個東西來存我們抓取到的數據,當然最好用:數據庫
但是考慮到學習成本(主要是我不熟!),先通過一個簡單的東西存起來。

最簡單的肯定是通過Excel表格啊,最直觀了,非編程人員也能看懂!
不多說,開始本節內容~ 本節抓取例子:豆瓣音樂 Top 250
鏈接:https://music.douban.com/top250


1.編寫抓數據腳本


依次校驗

  • 1.數據能在Network選項卡找到,非JS動態加載,直接處理結果就好
  • 2.點擊第二頁,選中XHR,沒有東東,不是Ajax動態加載

鏈接規則

第一頁https://music.douban.com/top250?start=0
第二頁https://music.douban.com/top250?start=25
第三頁https://music.douban.com/top250?start=50

鏈接規則顯而易見,每25條一頁,0,25,50,75…225

請求頭

就一個:Host:music.douban.com

模擬請求的套路摸清了,接下來就是處理網頁拿到想要的數據了:
看下Element,不難發現數據都單獨放在一個個table裏:

點開其中一個:

先捋下我們想採集到的數據:

圖片鏈接歌名歌手發行時間分類評分評分人數歌曲詳情頁

然後就是慢慢摳數據了,自己私下摳,不會摳找以前文章看,
這裏直接給出代碼:

看下控制檯打印出來的信息

可以,沒毛病,接下來看下怎麼把數據寫到excel表格裏~


2.如何將數據寫入到Excel中

Step 1:安裝庫,操作Excel,你需要兩個庫:xlwt(寫Excel) 和 xlrd(讀Excel)
命令行pip安裝一波。

sudo pip3 install xlwt
sudo pip3 install xlrd

Step 2熟悉幾個基本函數

寫入Excel

  • xlwt.Workbook():創建一個工作薄
  • 工作薄對象.add_sheet(cell_overwrite_ok=True):添加工作表,括號裏是可選
    參數,用於確認同一個cell單元是否可以重設值
  • 工作表對象.write(行號,列號,插入數據,風格),第四個參數可選
    舉個簡單例子:插入這樣的數據:
sheet.write(0,0,"姓名")
sheet.write(0,1,"學號")
sheet.write(1,0,"小豬")
sheet.write(1,1,"No1")

得到的表格:

  • 工作薄對象.save(Excel文件名):保存到Excel文件中

讀取Excel

  • xlrd.open_workbook():讀取一個Excel文件獲得一個工作薄對象
  • 工作薄對象.sheets()[0]:根據索引獲得工作薄裏的一個工作表
  • 工作表對象.nrows:獲得行數
  • 工作表對象.ncols:獲得列數
  • 工作表對象.row_values(pos):讀取某一行的數據,返回結果是列表類型的

3.編寫一個Excel協助類

基本語法瞭解得差不多了,接着我們來寫一個工具類,來把我們爬蟲
爬取到的數據寫入到Excel表格裏,四個方法:
style:根據傳入的字體名稱,高度,是否加粗,返回一個Style樣式
__init__:完成Excel表的一些初始化操作,初始化表頭
insert_data:把爬取到的數據插入到Excel裏的方法
read_data:讀取Excel裏數據的方法

接着一步步來,先是style方法

接着是__init__方法,判斷Excel文件是否存在,不存在則新建並進行初始化

再接着是insert_data:

最後是read_data:

代碼不算複雜,接着寫下調用代碼試試:

加一個打印data_group的方法,看下抓取的數據,運行下:

沒毛病,圈住哪裏[[,這裏想表達結果是一個大列表嵌套多個列表
再接着添加下述代碼:

執行後可以看到,生成了一個dbyy.xlsx的文件,打開看看:

嘖嘖,寫入成功,美滋滋!
再接着把無關代碼註釋掉,調用下讀取Excel的方法:

讀寫都沒問題,嚶嚶嚶~


4.小結

本節講解了一波如何把爬取到的數據存到Excel表裏,以及讀取Excel表裏的數據,
雖然沒有數據庫高端,但是比起之前用分隔符分隔多中類型的數據,用到的時候
split()好多了,而且非開發者也能直接看懂,除此之外,哪天說不定可以撩到
一些文員小姐姐(編寫批處理Excel表的腳本),除此之外還可以做些詞頻統計類
的腳本玩玩,最後獻上哲♂學啓蒙老師照片來結束本節內容,願天堂沒有摔跤:


附:具體實現代碼(其實都可以在https://github.com/coder-pig/ReptileSomething 找到)

import re

import requests
import xlwt
import xlrd

import tools as t

rate_count_pattern = re.compile("(\d*人評價)", re.S)  # 獲取評分人數的正則
base_url = 'https://music.douban.com/top250'
save_file = 'dbyy.xlsx'


# 解析網頁獲得數據的方法
def parse_url(offset):
    resp = requests.get(base_url, params={'page': offset})
    print("解析:" + resp.url)
    result = []
    if resp.status_code == 200:
        soup = t.get_bs(resp.content)
        tables = soup.select('table[width="100%%"]')
        for table in tables:
            a = table.find('a')
            detail_url = a['href']  # 歌曲詳情頁面
            img_url = a.img['src']  # 圖片url
            music_name = a.img['alt']  # 歌曲名
            p = table.find('p')
            data_split = p.get_text().split("/")
            singer = data_split[0].strip()  # 歌手
            public_date = data_split[1].strip()
            category = ""  # 分類
            for data in data_split[2:]:
                category += data.strip() + "/"
            div = table.find('div', class_="star clearfix")
            score = div.select('span.rating_nums')[0].text  # 評分
            rate_count = rate_count_pattern.search(div.select('span.pl')[0].get_text()).group(0)  # 評分人數
            result.append([img_url, music_name, singer, public_date, category, score, rate_count, detail_url])
    return result


class ExcelHelper:
    def __init__(self):
        if not t.is_dir_existed(save_file, mkdir=False):
            # 1.創建工作薄
            self.workbook = xlwt.Workbook()
            # 2.創建工作表,第二個參數用於確認同一個cell單元是否可以重設值
            self.sheet = self.workbook.add_sheet(u"豆瓣音樂Top 250", cell_overwrite_ok=True)
            # 3.初始化表頭
            self.headTitles = [u'圖片鏈接', u'歌名', u'歌手', u'發行時間', u'分類', u'評分', u'評分人數', u'歌曲詳情頁']
            for i, item in enumerate(self.headTitles):
                self.sheet.write(0, i, item, self.style('Monaco', 220, bold=True))
            self.workbook.save(save_file)

    # 參數依次是:字體名稱,字體高度,是否加粗
    def style(self, name, height, bold=False):
        style = xlwt.XFStyle()  # 賦值style爲XFStyle(),初始化樣式
        font = xlwt.Font()  # 爲樣式創建字體樣式
        font.name = name
        font.height = height
        font.bold = bold
        return style

    # 往單元格里插入數據
    def insert_data(self, data_group):
        try:
            xlsx = xlrd.open_workbook(save_file)  # 讀取Excel文件
            table = xlsx.sheets()[0]  # 根據索引獲得表
            row_count = table.nrows  # 獲取當前行數,新插入的數據從這裏開始
            count = 0
            for data in data_group:
                for i in range(len(data)):
                    self.sheet.write(row_count + count, i, data[i])
                count += 1
        except Exception as e:
            print(e)
        finally:
            self.workbook.save(save_file)

    # 讀取Excel裏的數據
    def read_data(self):
        xlsx = xlrd.open_workbook(save_file)
        table = xlsx.sheets()[0]
        nrows = table.nrows  # 行數
        ncols = table.ncols  # 列數
        # 從第一行開始,0是表頭
        for i in range(1, nrows):
            # 讀取某行數據
            row_value = table.row_values(i)
            print(row_value)


if __name__ == '__main__':
    offsets = [x for x in range(0, 250, 25)]
    data_group = []
    for offset in offsets:
        data_group += parse_url(offset)
    print(data_group)
    excel = ExcelHelper()
    excel.insert_data(data_group)
    excel.read_data()

來啊,Py交易啊

想加羣一起學習Py的可以加下,智障機器人小Pig,驗證信息裏包含:
PythonpythonpyPy加羣交易屁眼 中的一個關鍵詞即可通過;

驗證通過後回覆 加羣 即可獲得加羣鏈接(不要把機器人玩壞了!!!)~~~
歡迎各種像我一樣的Py初學者,Py大神加入,一起愉快地交流學♂習,van♂轉py。


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