當(dāng)我們爬蟲爬取大量數(shù)據(jù)并且已經(jīng)爬取到了本地愿待,這些數(shù)據(jù)如果不存儲(chǔ)起來,那么就會(huì)變得無效.
那下面讓小編教你把這些數(shù)據(jù)插入Excel中保存下來吧~
我們已經(jīng)把數(shù)據(jù)爬到本地并已經(jīng)插入execl疫剃,上效果圖
操作Execl其實(shí)里面很多東西要去了解,但這里我講常用的讀寫硼讽,滿足我們的一般需求,感興趣的朋友可以自己去深入巢价。
1. 讀execl文件
需要安裝 xlrd庫,老辦法固阁,直接在setting中安裝壤躲,然后導(dǎo)入放可使用python讀取execl
操作這樣的execl列表
# coding=utf-8
importxlrd
data = xlrd.open_workbook('execl_file.xlsx')
table = data.sheets()[0]#通過索引順序獲取table, 一個(gè)execl文件一般都至少有一個(gè)table
printtable.nrows#行數(shù)
printtable.ncols#列數(shù)
forkinrange(table.nrows):#遍歷行數(shù)據(jù)
printtable.row_values(k)
foriinrange(table.ncols):#便利列數(shù)據(jù)
printtable.col_values(i)
printtable.cell(2,2).value#獲取單元格數(shù)據(jù),前一個(gè)是行數(shù)备燃,從0開始碉克,后一個(gè)是列數(shù),且列數(shù)從0開始
forainrange(1,table.nrows):#行數(shù)據(jù)并齐,我正好要去掉第1行標(biāo)題
forbinrange(table.ncols):
printtable.cell(a,b).value
print'----------------------'
得到結(jié)果:
6
4
[u'\u54c1\u724c',u'size',u'\u4ef7\u683c',u'\u6027\u522b']
[u'Nike',90.0,1033.0,u'\u7537']
[u'addida',88.0,444.0,u'\u5973']
[u'zara',87.0,333.0,u'\u7537']
[u'Lining',33.0,22.0,u'\u7537']
[u'kappa',33.0,222.0,u'\u7537']
[u'\u54c1\u724c',u'Nike',u'addida',u'zara',u'Lining',u'kappa']
[u'size',90.0,88.0,87.0,33.0,33.0]
[u'\u4ef7\u683c',1033.0,444.0,333.0,22.0,222.0]
[u'\u6027\u522b',u'\u7537',u'\u5973',u'\u7537',u'\u7537',u'\u7537']
444.0
Nike
90.0
1033.0
男
----------------------
addida
88.0
444.0
女
----------------------
zara
87.0
333.0
男
----------------------
Lining
33.0
22.0
男
----------------------
kappa
33.0
222.0
男
----------------------
很簡單沒有什么要解釋的了
2. 復(fù)習(xí)一下range函數(shù)
#>>> range(1,5)#代表從1到5(不包含5)
# [1, 2, 3, 4]
#>>> range(1,5,2)#代表從1到5漏麦,間隔2(不包含5)
# [1, 3]
#>>> range(5)#代表從0到5(不包含5)
# [0, 1, 2, 3, 4]
3. 寫入execl
需要安裝xlwt庫客税,老辦法自己先安裝,不多說了,需要導(dǎo)入xlwt然后放可使用python寫入數(shù)據(jù)
workbook = xlwt.Workbook(encoding='utf-8')#創(chuàng)建workbook 其實(shí)就是execl撕贞,
worksheet = workbook.add_sheet('my_worksheet')#創(chuàng)建表更耻,如果想創(chuàng)建多個(gè),直接在后面再add_sheet
worksheet.write(0,0,label ='Row 0,Column 0 Value')#3個(gè)參數(shù)捏膨,第一個(gè)參數(shù)表示行秧均,從0開始,第二個(gè)參數(shù)表示列從0開始号涯,第三個(gè)參數(shù)表示插入的數(shù)值
workbook.save('execl_liu.xlsx')#寫完記得一定要保存
完整實(shí)例代碼
f = xlwt.Workbook()#創(chuàng)建工作薄
#創(chuàng)建個(gè)人信息表
sheet1 = f.add_sheet(u'個(gè)人信息',cell_overwrite_ok=True)
rowTitle = [u'編號',u'姓名',u'性別',u'年齡']
rowDatas = [[u'張一',u'男',u'18'],[u'李二',u'女',u'20'],[u'黃三',u'男',u'38'],[u'劉四',u'男',u'88']]
foriinrange(0,len(rowTitle)):
sheet1.write(0,i,rowTitle[i],set_style('Times new Roman',220,True)) 后面是設(shè)置樣式
forkinrange(0,len(rowDatas)):#先遍歷外層的集合目胡,即每行數(shù)據(jù)
rowDatas[k].insert(0,k+1)#每一行數(shù)據(jù)插上編號即為每一個(gè)人插上編號
forjinrange(0,len(rowDatas[k])):#再遍歷內(nèi)層集合
sheet1.write(k+1,j,rowDatas[k][j])#寫入數(shù)據(jù),k+1表示先去掉標(biāo)題行,另外每一行數(shù)據(jù)也會(huì)變化,j正好表示第一列數(shù)據(jù)的變化诚隙,rowdatas[k][j] 插入數(shù)據(jù)
#創(chuàng)建個(gè)人收入表
sheet1 = f.add_sheet(u'個(gè)人收入表',cell_overwrite_ok=True)
rowTitle2 = [u'編號',u'姓名',u'學(xué)歷',u'工資']
rowDatas2 = [[u'張一',u'本科',u'8000'],[u'李二',u'碩士',u'10000'],[u'黃三',u'博士',u'20000'],[u'劉四',u'教授',u'50000']]
foriinrange(0,len(rowTitle2)):
sheet1.write(0,i,rowTitle2[i])
forkinrange(0,len(rowDatas2)):#先遍歷外層的集合
rowDatas2[k].insert(0,k+1)#每一行數(shù)據(jù)插上編號即為每一個(gè)人插上編號
forjinrange(0,len(rowDatas2[k])):#再遍歷內(nèi)層集合
sheet1.write(k+1,j,rowDatas2[k][j])#寫入數(shù)據(jù),k+1表示先去掉標(biāo)題行讶隐,另外每一行數(shù)據(jù)也會(huì)變化,j正好表示第一列數(shù)據(jù)的變化,rowdatas[k][j] 插入數(shù)據(jù)
f.save('info.xlsx')
最后得到的效果圖
3. 把爬取的數(shù)據(jù)插入到execl中
這里直接上代碼了久又,相關(guān)的注釋都在代碼里
# coding=utf-8
importrequests
importtime
importxlwt
importxlrd
fromlxmlimportetree
classZbjData(object):
def__init__(self):
self.f = xlwt.Workbook()#創(chuàng)建工作薄
self.sheet1 = self.f.add_sheet(u'任務(wù)列表',cell_overwrite_ok=True)
self.rowsTitle = [u'編號',u'標(biāo)題',u'簡介',u'價(jià)格',u'截止時(shí)間',u'鏈接']
foriinrange(0, len(self.rowsTitle)):
self.sheet1.write(0, i, self.rowsTitle[i], self.set_style('Times new Roman',220,True))
self.f.save('zbj.xlsx')
defset_style(self,name, height, bold=False):
style = xlwt.XFStyle()# 初始化樣式
font = xlwt.Font()# 為樣式創(chuàng)建字體
font.name = name
font.bold = bold
font.colour_index =2
font.height = height
style.font = font
returnstyle
defgetUrl(self):
foriinrange(33):
url ='http://task.zbj.com/t-ppsj/p{}s5.html'.format(i+1)
self.spiderPage(url)
defspiderPage(self,url):
ifurlisNone:
returnNone
try:
data = xlrd.open_workbook('zbj.xlsx')
table = data.sheets()[0]# 通過索引順序獲取table, 一個(gè)execl文件一般都至少有一個(gè)table
rowCount = table.nrows#獲取行數(shù) ? 巫延,下次從這一行開始
proxies = {
'http':'http://221.202.248.52:80',
}
user_agent ='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4295.400'
headers = {'User-Agent': user_agent}
htmlText = requests.get(url, headers=headers,proxies=proxies).text
selector = etree.HTML(htmlText)
tds = selector.xpath('//*[@class="tab-switch tab-progress"]/table/tr')
m =0
fortdintds:
data = []
price = td.xpath('./td/p/em/text()')
href = td.xpath('./td/p/a/@href')
title = td.xpath('./td/p/a/text()')
subTitle = td.xpath('./td/p/text()')
deadline = td.xpath('./td/span/text()')
price = price[0]iflen(price)>0else''# python的三目運(yùn)算 :為真時(shí)的結(jié)果 if 判定條件 else 為假時(shí)的結(jié)果
title = title[0]iflen(title)>0else''
href = href[0]iflen(href)>0else''
subTitle = subTitle[0]iflen(subTitle)>0else''
deadline = deadline[0]iflen(deadline)>0else''
#拼裝成一個(gè)集合
data.append(rowCount+m)#加個(gè)序號
data.append(title)
data.append(subTitle)
data.append(price)
data.append(deadline)
data.append(href)
foriinrange(len(data)):
self.sheet1.write(rowCount+m,i,data[i])#寫入數(shù)據(jù)到execl中
m+=1#記錄行數(shù)增量
printm
printprice, title, href, subTitle, deadline
exceptException,e:
print'出錯(cuò)',e.message
finally:
self.f.save('zbj.xlsx')
if'_main_':
zbj = ZbjData()
zbj.getUrl()
最后的效果圖是:
注意這里爬取數(shù)據(jù)的時(shí)候,有的代理ip還是被禁用了地消,所以獲取數(shù)據(jù)有失敗的情況炉峰,所以這里需要有異常處理..
當(dāng)然數(shù)據(jù)還應(yīng)該存入到數(shù)據(jù)庫中,所以下一篇我們會(huì)來講講如何把數(shù)據(jù)插入到數(shù)據(jù)庫中脉执。