python爬取內(nèi)容存入Excel實例
最近老師布置了個作業(yè),爬取豆瓣top250的電影信息。按照套路,自然是先去看看源代碼了,一看,基本的信息竟然都有,心想這可省事多了。簡單分析了下源代碼,標記出所需信息的所在標簽,ok,開始干活!
鑒于正則表達式的資料已經(jīng)看了不少,所以本次除了beautifulsoup外,還有些re的使用,當然,比較簡單。而爬到信息后,以往一般是存到txt文件,或者數(shù)據(jù)庫中,老是重樣的操作,難免有些‘厭倦’。心想,干嘛不存到Excel表呢?對啊,可以存到Excel表。
環(huán)境準備:pip install openpyxl (假設你已配好了python環(huán)境)
好了,廢話少說,上代碼。
# 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) # 首頁鏈接和其他頁不同,所以單獨獲取信息
urls = re.findall('href="(.*filter=?)', html) # re獲取獲取跳轉(zhuǎn)鏈接的href
for u in range(len(urls) - 2): # 匹配到的跳轉(zhuǎn)鏈接最后兩個重復,需去掉
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 # 全局工作表對象
Name = [] # 存儲電影名
Dr = [] # 存儲導演信息
Ma = [] # 存儲主演信息
Si = [] # 存儲簡介
R_score = [] # 存儲評分
R_count = [] # 存儲評論人數(shù)
R_year = [] # 存儲年份
R_area = [] # 存儲地區(qū)
R_about = [] # 存儲劇情類型
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編碼,以免下面查找 ‘主演'下標報錯
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ù)取最后一個/下標,得到劇情類型
try:
sub = infor.index('主演') # 取得主演下標
Dr.append(infor[0:sub].split(':')[1]) # 得到導演信息
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é)點列表
R_score.append(rs[3].text) # 得到評分
R_count.append(rs[7].text) # 得到評論人數(shù)
for s in soup.find_all('span', 'inq'):
Si.append(s.text) # 得到簡介
if len(Si) < 25:
for k in range(25 - len(Si)):
Si.append('本頁有的電影沒簡介,建議查看核對,鏈接:' + 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表測試
# wb = load_workbook('test.xlsx') #加載存在的Excel表
# a_sheet = wb.get_sheet_by_name('Sheet1') #根據(jù)表名獲取表對象
# for row in a_sheet.rows: #遍歷輸出行數(shù)據(jù)
# for cell in row: #每行的每一個單元格
# print cell.value,
# 創(chuàng)建Excel表并寫入數(shù)據(jù)
wb = workbook.Workbook() # 創(chuàng)建Excel對象
ws = wb.active # 獲取當前正在操作的表對象
# 往表中寫入標題行,以列表形式寫入!
ws.append(['電影名', '年份', '地區(qū)', '劇情類型', '導演', '主演', '評分', '評論人數(shù)', '簡介'])
src = 'https://movie.douban.com/top250'
getHtml(src)
wb.save('test2.xlsx') # 存入所有信息后,保存為filename.xlsx代碼中已有不少注釋,這里說下爬取過程中遇到的小問題。
1.soup的contents方法,返回的是某標簽下的子節(jié)點列表,但剛開始總是取不到想要的值,輸出其長度后,有些傻眼..TM什么情況?有這么多的子節(jié)點嗎?較真的我又去數(shù)了幾遍,最后發(fā)現(xiàn),它竟然連"換行"都算作是子節(jié)點!莫名地有點方...不知各位有沒有遇到過。

如圖,我按列表下標標記,0,2,4,6,8是換行,但也被算作子節(jié)點...
2.還是contents方法,代碼中的 '#得到電影所有名稱' 處的代碼 n.contents[1]獲取的除了a標簽外,還有其下的span標簽,這是為何?它們算一個整體?

3.對如下圖的電影信息處理時,出現(xiàn)了幾處錯誤,原因有以下幾點:
(1)部分電影沒有主演信息...
(2)主演信息為這樣'主演: ',就一個主演字樣,無內(nèi)容
(3)部分電影沒有簡介
(4)當主演信息中沒有'...'時,獲取主演信息受阻
解決方案:(1)(2)都是主演問題,判斷是否存在即可。(我以捕獲異常處理)
(3)是簡介問題,我無法給出具體哪部電影沒有簡介,但給了該電影所在的頁面鏈接,可訪問核查。(貌似有點笨)
(4)獲取受阻是因為后面沒有精確定位點,最后以re.split('[1-2]+')方法解決,匹配年份第一位作為分片點

本次分享就到這兒了,最后,照舊放幾張結(jié)果圖吧。


以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
pyinstaller打包單文件時--uac-admin選項不起作用怎么辦
這篇文章主要介紹了pyinstaller打包單文件時--uac-admin選項不起作用怎么辦,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04
python實現(xiàn)啟動一個外部程序,并且不阻塞當前進程
這篇文章主要介紹了python實現(xiàn)啟動一個外部程序,并且不阻塞當前進程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Python??序列化反序列化和異常處理的問題小結(jié)
這篇文章主要介紹了Python?序列化反序列化和異常處理,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12

