Python 爬取內容存入Excel實例

       最近老師佈置了個作業,爬取豆瓣top250的電影信息。按照套路,自然是先去看看源代碼了,一看,基本的信息竟然都有,心想這可省事多了。簡單分析了下源代碼,標記出所需信息的所在標籤,ok,開始幹活!

      鑑於正則表達式的資料已經看了不少,所以本次除了beautifulsoup外,還有些re的使用,當然,比較簡單。而爬到信息後,以往一般是存到txt文件,或者數據庫中,老是重樣的操作,難免有些‘厭倦’。心想,幹嘛不存到Excel表呢?對啊,可以存到Excel表嘛。。。敲打

      環境準備:pip install openpyxl  (假設你已配好了python環境)

      好了,廢話少說,上代碼。

    

# 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獲取獲取跳轉鏈接的href
    for u in range(len(urls) - 2):  # 匹配到的跳轉鏈接最後兩個重複,需去掉
        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:網頁源碼 ,num_url:頁面鏈接
    global ws  # 全局工作表對象
    Name = []  # 存儲電影名
    Dr = []  # 存儲導演信息
    Ma = []  # 存儲主演信息
    Si = []  # 存儲簡介
    R_score = []  # 存儲評分
    R_count = []  # 存儲評論人數
    R_year = []  # 存儲年份
    R_area = []  # 存儲地區
    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得到年份和地區
        R_year.append(ya.split('/')[0])  # 得到年份
        R_area.append(ya.split('/')[1])  # 得到地區
        R_about.append(infor[infor.rindex('/') + 1:])  # rindex函數取最後一個/下標,得到劇情類型
        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的子節點列表
        R_score.append(rs[3].text)  # 得到評分
        R_count.append(rs[7].text)  # 得到評論人數
    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條數據,寫入工作表中
        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') #根據表名獲取表對象
    #     for row in a_sheet.rows: #遍歷輸出行數據
    #         for cell in row: #每行的每一個單元格
    #             print cell.value,

    #  創建Excel表並寫入數據
    wb = workbook.Workbook()  # 創建Excel對象
    ws = wb.active  # 獲取當前正在操作的表對象
    # 往表中寫入標題行,以列表形式寫入!
    ws.append(['電影名', '年份', '地區', '劇情類型', '導演', '主演', '評分', '評論人數', '簡介'])
    src = 'https://movie.douban.com/top250'
    getHtml(src)
    wb.save('test2.xlsx')  # 存入所有信息後,保存爲filename.xlsx

      代碼中已有不少註釋,這裏說下爬取過程中遇到的小問題。

       1.soup的contents方法,返回的是某標籤下的子節點列表,但剛開始總是取不到想要的值,輸出其長度後,有些傻眼..TM什麼情況?有這麼多的子節點嗎?較真的我又去數了幾遍,最後發現,它竟然連"換行"都算作是子節點!莫名地有點方...不知各位有沒有遇到過。

        

          如圖,我按列表下標標記,0,2,4,6,8是換行,但也被算作子節點...

       2.還是contents方法,代碼中的 '#得到電影所有名稱' 處的代碼 n.contents[1]獲取的除了a標籤外,還有其下的span標籤,這是爲何?它們算一個整體?

         

       3.對如下圖的電影信息處理時,出現了幾處錯誤,原因有以下幾點:

          (1)部分電影沒有主演信息...

          (2)主演信息爲這樣'主演: ',就一個主演字樣,無內容

          (3)部分電影沒有簡介

          (4)當主演信息中沒有'...'時,獲取主演信息受阻

         解決方案:(1)(2)都是主演問題,判斷是否存在即可。(我以捕獲異常處理)

                       (3)是簡介問題,我無法給出具體哪部電影沒有簡介,但給了該電影所在的頁面鏈接,可訪問覈查。(貌似有點笨)

                       (4)獲取受阻是因爲後面沒有精確定位點,最後以re.split('[1-2]+')方法解決,匹配年份第一位作爲分片點

         


          本次分享就到這兒了,最後,照舊放幾張結果圖吧。(歡迎留言評論,更多openpyxl操作可以點這裏查看

         


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章