1. 程式人生 > >Python3爬蟲豆瓣電影TOP250將電影名寫入到EXCEL

Python3爬蟲豆瓣電影TOP250將電影名寫入到EXCEL

大家好,我是你們的老朋友澤哥,最近在學習Python3.6,於是興起寫了個小小的爬蟲

附上截圖!


我們要獲得TOP250對應的電影名,開啟F12對HTML報文進行解讀

電影名對應的HTML程式碼如下:

<span class="title">肖申克的救贖</span>                 
整體程式碼如下:

檔案:get_movieReview.py

from urllib import request
from urllib import error
import re
import excel


excel_name = 'excel/douban_hot_review.xls'
sheet_name = '豆瓣影評'


'''建立一個excel'''
douban_excel = excel.Excel(excel_name,sheet_name)

class DouBanSpider(object):
    '''
    資料成員:
    page:        表示當前處理的頁面
    cur_url:     表示當前準備抓取的頁面
    '''
    def __init__(self):
        self.page = 1
        self.cur_url = 'http://movie.douban.com/top250?start={page}&filter=&type='#{page}是可以代替的
        self.top = 0
        print('開始工作')

    '''
    cur_page:表示當前處理的介面
    return:返回抓取的整個介面的HTML(uicode編碼)
    '''
    def get_html(self,cur_page):
        url = self.cur_url
        try:
            page = request.urlopen(url.format(page = (cur_page - 1) * 25)).read().decode("utf-8")
        except error.URLError as e:
            if hasattr(e,'code'):
                print("HTTPError: the server could not deal with the request")
                print("Error code: %s"% e.code)
            elif hasattr(e,'reason'):
                print("URLError: failed to reach the server")
                print("Reason: %s"% e.reason)
        return page

    '''
    page:表示當前抓取到的html檔案
    功能:將匹配到的內容寫入到excel檔案中
    '''
    def find_Info(self,page):
        movie_items = re.findall(r'<span.*?class="title">(.*?)</span>',page,re.S)
        number = 0
        for index,item in enumerate(movie_items):
         #   print('編號:' + str(index))
         #   print('編號對應的字串:' + str(item))
            if item.find(" ") != 0 and item.find("&nbsp") == -1:
                douban_excel.write(self.top,0,item)
                self.top += 1
                print('第' + str(self.top) + '個電影名是:' + str(item))
        douban_excel.save()

    def start_spider(self):
        '''爬蟲入口'''
        while self.page <= 10:
            page = self.get_html(self.page)
            self.find_Info(page)
            self.page += 1

def main():
    '''程式入口'''
    spider = DouBanSpider()
    spider.start_spider()

if __name__ == '__main__':
    main()
  self.cur_url = 'http://movie.douban.com/top250?start={page}&filter=&type='
注意,標紅的地方用到了字串匹配,第一頁start=0,第二頁start=25···以此類推,每增加一頁,start值增加25。 檔案:excel.py
import xlrd
import xlwt
import os

class Excel:
    def __init__(self,excel_name,sheet_name):
        global bookWrite
        global bookRead
        global sheet

        self.excel_name = excel_name
        self.sheet_name = sheet_name

        bookWrite = xlwt.Workbook(encoding = 'utf-8')
        sheet = bookWrite.add_sheet(sheet_name,cell_overwrite_ok = True)

    #寫資料到excel
    def write(self,row,col,data):
        sheet.write(row,col,data)

    #儲存資料到檔案
    def save(self):
        if os.path.exists(self.excel_name):
            os.remove(self.excel_name)
            bookWrite.save(self.excel_name)
        else:
            bookWrite.save(self.excel_name)

    #讀取excel資料;單元格
    def read(self,sheet_index,row,col):
        bookRead = xlrd.open_workbook(self.excel_name)
        sheet = bookRead.sheet_by_index(sheet_index)
        return sheet.cell(row,col).value    #根據行與列獲取單元格值

    #讀取excel資料:單行資料
    def read_by_row(self,sheet_index,row):
        bookRead = xlrd.open_workbook(self.excel_name)
        sheet = bookRead.sheet_by_index(sheet_index)     # 根據索引獲取工作表
        return sheet.row_values(row)

    #讀取excel資料:單列資料
    def read_by_col(self,sheet_index,col):
        bookRead = xlrd.open_workbook(self.excel_name)
        sheet = bookRead.sheet_by_index(sheet_index)
        return sheet.col_values(col)
這個小爬蟲給我的收穫還是很多的,每一個電影都能爬出兩個相同標籤的<span class="title">,區別在於第二個標籤內容的開頭是空格,可能是因為解析html需要用到“utf-8”編碼吧,在遇到非中文的html程式碼時,空格變成了&nbsp;所以真正的電影名的標籤裡需要滿足以下兩點條件:1.沒有&nbsp;2.不能是空格開頭。說這麼多了,大家自己看一看html就知道個所以然了!