小豬的Python學(xué)習(xí)之旅 —— 14.項(xiàng)目實(shí)戰(zhàn):抓取豆瓣音樂Top 250數(shù)據(jù)存到Excel中

一句話概括本文

利用Excel存儲(chǔ)爬到的抓取豆瓣音樂Top 250數(shù)據(jù)信息,還有讀Excel。


引言

失蹤人口回歸浩淘,最近比較迷茫咳焚,不知道是回頭深究Android洽损,還是繼續(xù)
學(xué)Python,Android是舊愛黔攒,Python是新歡趁啸;Android應(yīng)用層折騰來
折騰去,無(wú)非:改UI督惰,寫控件不傅,換下庫(kù),換下架構(gòu)...以前一直想著寫
自己的項(xiàng)目赏胚,然后各種加?xùn)|西優(yōu)化访娶,然后發(fā)現(xiàn)自己卻沒有了當(dāng)年的熱情,
唉觉阅!相比Python崖疤,隨手就是一爬蟲,批處理類的腳本典勇,實(shí)用性高太多劫哼,
只是Python沒有引路人,都是自己一點(diǎn)點(diǎn)摸索割笙,見步走步吧权烧!

之前在寫爬小姐姐腳本時(shí)候,就遇到過一個(gè)如何存儲(chǔ)爬取到數(shù)據(jù)的問題伤溉,
比如一個(gè)系列的套圖鏈接應(yīng)該放到特定的文件夾般码,我之前的操作都是
通過下面這樣的格式寫入到一個(gè)txt文件中:目錄~鏈接
然后讀取txt文件,獲得字符串乱顾,然后通過split("~")來進(jìn)行分隔板祝,
split("~")[0]是目錄,split("~")[1]是路徑走净,挺low的券时,
如果是涉及到三個(gè)維度以上的再拼多一個(gè)~,在上上一節(jié)抓
半次元coser的時(shí)候就遇到一個(gè)惡心的問題伏伯,符號(hào)都他么被用了橘洞,
難以分隔,一個(gè)個(gè)特殊字符試舵鳞,后面試到Θ才可以..

迫切需要一個(gè)東西來存我們抓取到的數(shù)據(jù)震檩,當(dāng)然最好用:數(shù)據(jù)庫(kù)
但是考慮到學(xué)習(xí)成本(主要是我不熟!),先通過一個(gè)簡(jiǎn)單的東西存起來抛虏。

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


1.編寫抓數(shù)據(jù)腳本


依次校驗(yàn)

  • 1.數(shù)據(jù)能在Network選項(xiàng)卡找到,非JS動(dòng)態(tài)加載沸毁,直接處理結(jié)果就好
  • 2.點(diǎn)擊第二頁(yè)峰髓,選中XHR,沒有東東息尺,不是Ajax動(dòng)態(tài)加載

鏈接規(guī)則

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

鏈接規(guī)則顯而易見携兵,每25條一頁(yè),0搂誉,25,50,75...225

請(qǐng)求頭

就一個(gè):Host:music.douban.com

模擬請(qǐng)求的套路摸清了徐紧,接下來就是處理網(wǎng)頁(yè)拿到想要的數(shù)據(jù)了:
看下Element,不難發(fā)現(xiàn)數(shù)據(jù)都單獨(dú)放在一個(gè)個(gè)table里:

點(diǎn)開其中一個(gè):

先捋下我們想采集到的數(shù)據(jù):

圖片鏈接炭懊,歌名并级,歌手發(fā)行時(shí)間侮腹,分類嘲碧,評(píng)分評(píng)分人數(shù)父阻,歌曲詳情頁(yè)

然后就是慢慢摳數(shù)據(jù)了愈涩,自己私下?lián)福粫?huì)摳找以前文章看至非,
這里直接給出代碼:

看下控制臺(tái)打印出來的信息

可以钠署,沒毛病糠聪,接下來看下怎么把數(shù)據(jù)寫到excel表格里~


2.如何將數(shù)據(jù)寫入到Excel中

Step 1:安裝庫(kù)荒椭,操作Excel,你需要兩個(gè)庫(kù):xlwt(寫Excel) 和 xlrd(讀Excel)
命令行pip安裝一波舰蟆。

sudo pip3 install xlwt
sudo pip3 install xlrd

Step 2熟悉幾個(gè)基本函數(shù)

寫入Excel

  • xlwt.Workbook():創(chuàng)建一個(gè)工作薄
  • 工作薄對(duì)象.add_sheet(cell_overwrite_ok=True):添加工作表趣惠,括號(hào)里是可選
    參數(shù),用于確認(rèn)同一個(gè)cell單元是否可以重設(shè)值
  • 工作表對(duì)象.write(行號(hào)身害,列號(hào)味悄,插入數(shù)據(jù),風(fēng)格)塌鸯,第四個(gè)參數(shù)可選
    舉個(gè)簡(jiǎn)單例子:插入這樣的數(shù)據(jù):
sheet.write(0,0,"姓名")
sheet.write(0,1,"學(xué)號(hào)")
sheet.write(1,0,"小豬")
sheet.write(1,1,"No1")

得到的表格:

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

讀取Excel

  • xlrd.open_workbook():讀取一個(gè)Excel文件獲得一個(gè)工作薄對(duì)象
  • 工作薄對(duì)象.sheets()[0]:根據(jù)索引獲得工作薄里的一個(gè)工作表
  • 工作表對(duì)象.nrows:獲得行數(shù)
  • 工作表對(duì)象.ncols:獲得列數(shù)
  • 工作表對(duì)象.row_values(pos):讀取某一行的數(shù)據(jù)侍瑟,返回結(jié)果是列表類型的

3.編寫一個(gè)Excel協(xié)助類

基本語(yǔ)法了解得差不多了,接著我們來寫一個(gè)工具類,來把我們爬蟲
爬取到的數(shù)據(jù)寫入到Excel表格里涨颜,四個(gè)方法:
style:根據(jù)傳入的字體名稱费韭,高度,是否加粗庭瑰,返回一個(gè)Style樣式
__init__:完成Excel表的一些初始化操作星持,初始化表頭
insert_data:把爬取到的數(shù)據(jù)插入到Excel里的方法
read_data:讀取Excel里數(shù)據(jù)的方法

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

接著是__init__方法弹灭,判斷Excel文件是否存在督暂,不存在則新建并進(jìn)行初始化

再接著是insert_data:

最后是read_data:

代碼不算復(fù)雜,接著寫下調(diào)用代碼試試:

加一個(gè)打印data_group的方法穷吮,看下抓取的數(shù)據(jù)逻翁,運(yùn)行下:

沒毛病,圈住哪里[[捡鱼,這里想表達(dá)結(jié)果是一個(gè)大列表嵌套多個(gè)列表卢未!
再接著添加下述代碼:

執(zhí)行后可以看到,生成了一個(gè)dbyy.xlsx的文件堰汉,打開看看:

嘖嘖辽社,寫入成功,美滋滋翘鸭!
再接著把無(wú)關(guān)代碼注釋掉滴铅,調(diào)用下讀取Excel的方法:

讀寫都沒問題,嚶嚶嚶~


4.小結(jié)

本節(jié)講解了一波如何把爬取到的數(shù)據(jù)存到Excel表里就乓,以及讀取Excel表里的數(shù)據(jù)汉匙,
雖然沒有數(shù)據(jù)庫(kù)高端,但是比起之前用分隔符分隔多中類型的數(shù)據(jù)生蚁,用到的時(shí)候
split()好多了噩翠,而且非開發(fā)者也能直接看懂,除此之外邦投,哪天說不定可以撩到
一些文員小姐姐(編寫批處理Excel表的腳本)伤锚,除此之外還可以做些詞頻統(tǒng)計(jì)類
的腳本玩玩,最后獻(xiàn)上哲♂學(xué)啟蒙老師照片來結(jié)束本節(jié)內(nèi)容志衣,愿天堂沒有摔跤:


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

import re

import requests
import xlwt
import xlrd

import tools as t

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


# 解析網(wǎng)頁(yè)獲得數(shù)據(jù)的方法
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']  # 歌曲詳情頁(yè)面
            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  # 評(píng)分
            rate_count = rate_count_pattern.search(div.select('span.pl')[0].get_text()).group(0)  # 評(píng)分人數(shù)
            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.創(chuàng)建工作薄
            self.workbook = xlwt.Workbook()
            # 2.創(chuàng)建工作表屯援,第二個(gè)參數(shù)用于確認(rèn)同一個(gè)cell單元是否可以重設(shè)值
            self.sheet = self.workbook.add_sheet(u"豆瓣音樂Top 250", cell_overwrite_ok=True)
            # 3.初始化表頭
            self.headTitles = [u'圖片鏈接', u'歌名', u'歌手', u'發(fā)行時(shí)間', u'分類', u'評(píng)分', u'評(píng)分人數(shù)', u'歌曲詳情頁(yè)']
            for i, item in enumerate(self.headTitles):
                self.sheet.write(0, i, item, self.style('Monaco', 220, bold=True))
            self.workbook.save(save_file)

    # 參數(shù)依次是:字體名稱,字體高度念脯,是否加粗
    def style(self, name, height, bold=False):
        style = xlwt.XFStyle()  # 賦值style為XFStyle()狞洋,初始化樣式
        font = xlwt.Font()  # 為樣式創(chuàng)建字體樣式
        font.name = name
        font.height = height
        font.bold = bold
        return style

    # 往單元格里插入數(shù)據(jù)
    def insert_data(self, data_group):
        try:
            xlsx = xlrd.open_workbook(save_file)  # 讀取Excel文件
            table = xlsx.sheets()[0]  # 根據(jù)索引獲得表
            row_count = table.nrows  # 獲取當(dāng)前行數(shù),新插入的數(shù)據(jù)從這里開始
            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里的數(shù)據(jù)
    def read_data(self):
        xlsx = xlrd.open_workbook(save_file)
        table = xlsx.sheets()[0]
        nrows = table.nrows  # 行數(shù)
        ncols = table.ncols  # 列數(shù)
        # 從第一行開始绿店,0是表頭
        for i in range(1, nrows):
            # 讀取某行數(shù)據(jù)
            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交易啊

想加群一起學(xué)習(xí)Py的可以加下,智障機(jī)器人小Pig,驗(yàn)證信息里包含:
Python借嗽,python怕午,pyPy淹魄,加群郁惜,交易屁眼 中的一個(gè)關(guān)鍵詞即可通過甲锡;

驗(yàn)證通過后回復(fù) 加群 即可獲得加群鏈接(不要把機(jī)器人玩壞了U捉丁!缤沦!)~~~
歡迎各種像我一樣的Py初學(xué)者虎韵,Py大神加入,一起愉快地交流學(xué)♂習(xí)缸废,van♂轉(zhuǎn)py包蓝。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市企量,隨后出現(xiàn)的幾起案子测萎,更是在濱河造成了極大的恐慌,老刑警劉巖届巩,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硅瞧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡恕汇,警方通過查閱死者的電腦和手機(jī)腕唧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘾英,“玉大人枣接,你說我怎么就攤上這事∪鼻矗” “怎么了但惶?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瓣赂。 經(jīng)常有香客問我榆骚,道長(zhǎng)片拍,這世上最難降的妖魔是什么煌集? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮捌省,結(jié)果婚禮上苫纤,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好卷拘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布喊废。 她就那樣靜靜地躺著,像睡著了一般栗弟。 火紅的嫁衣襯著肌膚如雪污筷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天乍赫,我揣著相機(jī)與錄音瓣蛀,去河邊找鬼。 笑死雷厂,一個(gè)胖子當(dāng)著我的面吹牛惋增,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播改鲫,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诈皿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了像棘?” 一聲冷哼從身側(cè)響起稽亏,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缕题,沒想到半個(gè)月后措左,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡避除,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年怎披,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓶摆。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凉逛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出群井,到底是詐尸還是另有隱情状飞,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布书斜,位于F島的核電站诬辈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏荐吉。R本人自食惡果不足惜焙糟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望样屠。 院中可真熱鬧穿撮,春花似錦缺脉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至栗柒,卻和暖如春礁扮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞬沦。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工深员, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛙埂。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓倦畅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親绣的。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叠赐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容