一句話歸納本文:python
利用Excel存儲爬到的抓取豆瓣音樂Top 250數據信息,還有讀Excel。git
引言:github
失蹤人口迴歸,最近比較迷茫,不知道是回頭深究Android,仍是繼續 學Python,Android是舊愛,Python是新歡;Android應用層折騰來 折騰去,無非:改UI,寫控件,換下庫,換下架構...之前一直想着寫 本身的項目,而後各類加東西優化,而後發現本身卻沒有了當年的熱情, 唉!相比Python,隨手就是一爬蟲,批處理類的腳本,實用性高太多, 只是Python沒有引路人,都是本身一點點摸索,見步走步吧!面試
以前在寫爬小姐姐腳本時候,就遇到過一個如何存儲爬取到數據的問題, 好比一個系列的套圖連接應該放到特定的文件夾,我以前的操做都是 經過下面這樣的格式寫入到一個txt文件中:目錄~連接 而後讀取txt文件,得到字符串,而後經過**split("~")**來進行分隔, **split("~")[0]
是目錄,split("~")[1]
是路徑,挺low的, 若是是涉及到三個維度以上的再拼多一個~,在上上一節抓 半次元coser的時候就遇到一個噁心的問題,符號都他麼被用了, 難以分隔,一個個特殊字符試,後面試到Θ
**才能夠..數據庫
迫切須要一個東西來存咱們抓取到的數據,固然最好用:數據庫 可是考慮到學習成本(主要是我不熟!),先經過一個簡單的東西存起來。編程
最簡單的確定是經過Excel表格啊,最直觀了,非編程人員也能看懂! 很少說,開始本節內容~ 本節抓取例子:豆瓣音樂 Top 250
連接:music.douban.com/top250bash
依次校驗:架構
連接規則:app
第一頁: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表格裏~
Step 1:安裝庫,操做Excel,你須要兩個庫:xlwt
(寫Excel) 和 xlrd
(讀Excel) 命令行pip安裝一波。
sudo pip3 install xlwt
sudo pip3 install xlrd
複製代碼
Step 2:熟悉幾個基本函數
寫入Excel:
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:
open_workbook
():讀取一個Excel文件得到一個工做薄對象sheets()[0]
:根據索引得到工做薄裏的一個工做表nrows
:得到行數ncols
:得到列數row_values
(pos):讀取某一行的數據,返回結果是列表類型的基本語法瞭解得差很少了,接着咱們來寫一個工具類,來把咱們爬蟲 爬取到的數據寫入到Excel表格裏,四個方法: style
:根據傳入的字體名稱,高度,是否加粗,返回一個Style樣式 __init__
:完成Excel表的一些初始化操做,初始化表頭 insert_data
:把爬取到的數據插入到Excel裏的方法 read_data
:讀取Excel裏數據的方法
接着一步步來,先是style方法:
接着是__init__
方法,判斷Excel文件是否存在,不存在則新建並進行初始化
再接着是insert_data:
最後是read_data:
代碼不算複雜,接着寫下調用代碼試試:
加一個打印data_group的方法,看下抓取的數據,運行下:
沒毛病,圈住哪裏[[,這裏想表達結果是一個大列表嵌套多個列表! 再接着添加下述代碼:
執行後能夠看到,生成了一個**dbyy.xlsx
**的文件,打開看看:
嘖嘖,寫入成功,美滋滋! 再接着把無關代碼註釋掉,調用下讀取Excel的方法:
讀寫都沒問題,嚶嚶嚶~
本節講解了一波如何把爬取到的數據存到Excel表裏,以及讀取Excel表裏的數據, 雖然沒有數據庫高端,可是比起以前用分隔符分隔多中類型的數據,用到的時候 split()好多了,並且非開發者也能直接看懂,除此以外,哪天說不定能夠撩到 一些文員小姐姐(編寫批處理Excel表的腳本),除此以外還能夠作些詞頻統計類 的腳本玩玩,最後獻上哲♂學啓蒙老師照片來結束本節內容,願天堂沒有摔跤:
附:具體實現代碼(其實均可以在github.com/coder-pig/R… 找到)
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,驗證信息裏包含: Python,python,py,Py,加羣,交易,屁眼 中的一個關鍵詞便可經過;
驗證經過後回覆 加羣 便可得到加羣連接(不要把機器人玩壞了!!!)~~~ 歡迎各類像我同樣的Py初學者,Py大神加入,一塊兒愉快地交流學♂習,van♂轉py。