一句話概括本文:
利用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)摸索割笙,見步走步吧权烧!
![](http://static.zybuluo.com/coder-pig/tnslrtljryx4h5bc4k3bmlks/1.png)
之前在寫爬小姐姐腳本時(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)單的東西存起來抛虏。
![](http://static.zybuluo.com/coder-pig/obus3ca1tb88dpr99vyakne7/2.png)
最簡(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里:
![](http://static.zybuluo.com/coder-pig/ggs62w5af5dl6c84h5ve7okt/1.png)
點(diǎn)開其中一個(gè):
![](http://static.zybuluo.com/coder-pig/ji1j6x677oj77yz75qslgdfp/2.png)
先捋下我們想采集到的數(shù)據(jù):
圖片鏈接炭懊,歌名并级,歌手,發(fā)行時(shí)間侮腹,分類嘲碧,評(píng)分,評(píng)分人數(shù)父阻,歌曲詳情頁(yè)
然后就是慢慢摳數(shù)據(jù)了愈涩,自己私下?lián)福粫?huì)摳找以前文章看至非,
這里直接給出代碼:
![](http://static.zybuluo.com/coder-pig/x2bf12sgxvtrfeg7np0kn8lv/4.png)
看下控制臺(tái)打印出來的信息:
![](http://static.zybuluo.com/coder-pig/vs1kkiyvczo5l45sqshws2sr/5.png)
可以钠署,沒毛病糠聪,接下來看下怎么把數(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")
得到的表格:
![](http://static.zybuluo.com/coder-pig/zvubxzy4poq73vmipnykv4b1/6.png)
- 工作薄對(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方法:
![](http://static.zybuluo.com/coder-pig/8esqll79szmnk8qy5b5ap9f6/7.png)
接著是__init__
方法弹灭,判斷Excel文件是否存在督暂,不存在則新建并進(jìn)行初始化
![](http://static.zybuluo.com/coder-pig/phdfv8782k0fffv6jlkrklc7/8.png)
再接著是insert_data:
![](http://static.zybuluo.com/coder-pig/h8gdi77dks8o1k54s6fckm61/9.png)
最后是read_data:
![](http://static.zybuluo.com/coder-pig/dmdaqxe9gy01upvcfjd2advf/10.png)
代碼不算復(fù)雜,接著寫下調(diào)用代碼試試:
![](http://static.zybuluo.com/coder-pig/d2c1zp8vwnhwc4uwwithti8p/10.png)
加一個(gè)打印data_group的方法穷吮,看下抓取的數(shù)據(jù)逻翁,運(yùn)行下:
![](http://static.zybuluo.com/coder-pig/2orseto0hcgw51j9sxohnw1p/11.png)
沒毛病,圈住哪里[[捡鱼,這里想表達(dá)結(jié)果是一個(gè)大列表嵌套多個(gè)列表卢未!
再接著添加下述代碼:
![](http://static.zybuluo.com/coder-pig/nxq7s15fxd4i835mbei34ilt/12.png)
執(zhí)行后可以看到,生成了一個(gè)dbyy.xlsx
的文件堰汉,打開看看:
![](http://static.zybuluo.com/coder-pig/9kf5jlzqn4bfv8x8008cgu1f/13.png)
嘖嘖辽社,寫入成功,美滋滋翘鸭!
再接著把無(wú)關(guān)代碼注釋掉滴铅,調(diào)用下讀取Excel的方法:
![](http://static.zybuluo.com/coder-pig/71orj3ayuwdb3hxgvmp6uh47/15.png)
讀寫都沒問題,嚶嚶嚶~
![](http://static.zybuluo.com/coder-pig/re5ml3ol7u5uw2j7qrhgcle0/14.png)
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)容志衣,愿天堂沒有摔跤:
![](http://static.zybuluo.com/coder-pig/7zzlcqekcygrkmcltgszwkjw/16.png)
附:具體實(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怕午,py,Py淹魄,加群郁惜,交易,屁眼 中的一個(gè)關(guān)鍵詞即可通過甲锡;
驗(yàn)證通過后回復(fù) 加群 即可獲得加群鏈接(不要把機(jī)器人玩壞了U捉丁!缤沦!)~~~
歡迎各種像我一樣的Py初學(xué)者虎韵,Py大神加入,一起愉快地交流學(xué)♂習(xí)缸废,van♂轉(zhuǎn)py包蓝。