您好,登錄后才能下訂單哦!
這篇文章主要介紹python如何將爬取內(nèi)容存入Excel,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
代碼:
# coding=UTF-8 ''' function:爬取豆瓣top250的電影信息,并寫入Excel文件 ''' import requests import re from openpyxl import workbook # 寫入Excel表所用 from openpyxl import load_workbook # 讀取Excel表所用 from bs4 import BeautifulSoup as bs import os os.chdir('C:\Users\Administrator\Desktop') # 更改工作目錄為桌面 def getHtml(src): html = requests.get(src).content getData(html, src) # 首頁鏈接和其他頁不同,所以單獨(dú)獲取信息 urls = re.findall('href="(.*filter=?)', html) # re獲取獲取跳轉(zhuǎn)鏈接的href for u in range(len(urls) - 2): # 匹配到的跳轉(zhuǎn)鏈接最后兩個(gè)重復(fù),需去掉 next_url = 'https://movie.douban.com/top250' + urls[u] html = requests.get(next_url).content getData(html, next_url) def getData(html, num_url): # html:網(wǎng)頁源碼 ,num_url:頁面鏈接 global ws # 全局工作表對(duì)象 Name = [] # 存儲(chǔ)電影名 Dr = [] # 存儲(chǔ)導(dǎo)演信息 Ma = [] # 存儲(chǔ)主演信息 Si = [] # 存儲(chǔ)簡(jiǎn)介 R_score = [] # 存儲(chǔ)評(píng)分 R_count = [] # 存儲(chǔ)評(píng)論人數(shù) R_year = [] # 存儲(chǔ)年份 R_area = [] # 存儲(chǔ)地區(qū) R_about = [] # 存儲(chǔ)劇情類型 soup = bs(html, 'lxml') for n in soup.find_all('div', class_='hd'): # ts = n.contents[1].text # 得到電影的所有名稱 ts = n.contents[1].text.strip().split('/')[0] # 得到電影中文名 Name.append(ts) for p in soup.find_all('p', class_=''): infor = p.text.strip().encode('utf-8') #此處用utf-8編碼,以免下面查找 ‘主演'下標(biāo)報(bào)錯(cuò) ya = re.findall('[0-9]+.*\/?', infor)[0] # re得到年份和地區(qū) R_year.append(ya.split('/')[0]) # 得到年份 R_area.append(ya.split('/')[1]) # 得到地區(qū) R_about.append(infor[infor.rindex('/') + 1:]) # rindex函數(shù)取最后一個(gè)/下標(biāo),得到劇情類型 try: sub = infor.index('主演') # 取得主演下標(biāo) Dr.append(infor[0:sub].split(':')[1]) # 得到導(dǎo)演信息 mh = infor[sub:].split(':')[1] # 得到主演后面的信息 Ma.append(re.split('[1-2]+', mh)[0]) # 正則切片得到主演信息 except: print '無主演信息' Dr.append(infor.split(':')[1].split('/')[0]) Ma.append('無介紹...') for r in soup.find_all('div', class_='star'): rs = r.contents # 得到該div的子節(jié)點(diǎn)列表 R_score.append(rs[3].text) # 得到評(píng)分 R_count.append(rs[7].text) # 得到評(píng)論人數(shù) for s in soup.find_all('span', 'inq'): Si.append(s.text) # 得到簡(jiǎn)介 if len(Si) < 25: for k in range(25 - len(Si)): Si.append('本頁有的電影沒簡(jiǎn)介,建議查看核對(duì),鏈接:' + num_url) for i in range(25): # 每頁25條數(shù)據(jù),寫入工作表中 ws.append([Name[i], R_year[i], R_area[i], R_about[i], Dr[i], Ma[i], R_score[i], R_count[i], Si[i]]) if __name__ == '__main__': # 讀取存在的Excel表測(cè)試 # wb = load_workbook('test.xlsx') #加載存在的Excel表 # a_sheet = wb.get_sheet_by_name('Sheet1') #根據(jù)表名獲取表對(duì)象 # for row in a_sheet.rows: #遍歷輸出行數(shù)據(jù) # for cell in row: #每行的每一個(gè)單元格 # print cell.value, # 創(chuàng)建Excel表并寫入數(shù)據(jù) wb = workbook.Workbook() # 創(chuàng)建Excel對(duì)象 ws = wb.active # 獲取當(dāng)前正在操作的表對(duì)象 # 往表中寫入標(biāo)題行,以列表形式寫入! ws.append(['電影名', '年份', '地區(qū)', '劇情類型', '導(dǎo)演', '主演', '評(píng)分', '評(píng)論人數(shù)', '簡(jiǎn)介']) src = 'https://movie.douban.com/top250' getHtml(src) wb.save('test2.xlsx') # 存入所有信息后,保存為filename.xlsx
代碼中已有不少注釋,這里說下爬取過程中遇到的小問題。
1.soup的contents方法,返回的是某標(biāo)簽下的子節(jié)點(diǎn)列表,但剛開始總是取不到想要的值,輸出其長(zhǎng)度后,有些傻眼..TM什么情況?有這么多的子節(jié)點(diǎn)嗎?較真的我又去數(shù)了幾遍,最后發(fā)現(xiàn),它竟然連"換行"都算作是子節(jié)點(diǎn)!莫名地有點(diǎn)方...不知各位有沒有遇到過。
如圖,我按列表下標(biāo)標(biāo)記,0,2,4,6,8是換行,但也被算作子節(jié)點(diǎn)...
2.還是contents方法,代碼中的 '#得到電影所有名稱' 處的代碼 n.contents[1]獲取的除了a標(biāo)簽外,還有其下的span標(biāo)簽,這是為何?它們算一個(gè)整體?
3.對(duì)如下圖的電影信息處理時(shí),出現(xiàn)了幾處錯(cuò)誤,原因有以下幾點(diǎn):
(1)部分電影沒有主演信息...
(2)主演信息為這樣'主演: ',就一個(gè)主演字樣,無內(nèi)容
(3)部分電影沒有簡(jiǎn)介
(4)當(dāng)主演信息中沒有'...'時(shí),獲取主演信息受阻
解決方案:(1)(2)都是主演問題,判斷是否存在即可。(我以捕獲異常處理)
(3)是簡(jiǎn)介問題,我無法給出具體哪部電影沒有簡(jiǎn)介,但給了該電影所在的頁面鏈接,可訪問核查。(貌似有點(diǎn)笨)
(4)獲取受阻是因?yàn)楹竺鏇]有精確定位點(diǎn),最后以re.split('[1-2]+')方法解決,匹配年份第一位作為分片點(diǎn)
本次分享就到這兒了,最后,照舊放幾張結(jié)果圖吧。
以上是“python如何將爬取內(nèi)容存入Excel”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。