Forward團隊-爬蟲豆瓣top250項目-項目總結
托管平臺地址:https://github.com/xyhcq/top250
小組名稱:Forward團隊
組長:馬壯
成員:李誌宇、劉子軒、年光宇、邢雲淇、張良
我們這次團隊項目內容是爬取豆瓣電影TOP250的電影信息,為什麽我們選這個項目作為團隊項目呢?因為在這個大數據時代,我們總有一些信息需要收集保存,而手動收集信息會很麻煩,所以選了爬取豆瓣TOP250,其實,項目爬取什麽網站、內容並不重要,因為我們在這次團隊項目中學會了爬蟲的工作原理,以後我們想爬取別的網站那都不是事了。
這次團隊項目中,我們都有了很大的收獲,無論是組員中基礎好的還是基礎弱的,都是有收獲的,可喜可賀!在團隊項目中,我們遇到了很多大問題,對於我們來說,很多是可能導致我們項目失敗的致命問題,好在經過組員們的不懈努力,刻苦學習,查資料解決了。
程序的開發過程,我們就不提了,在之前的作業裏,我們組都有詳細的分析,都很詳細,下面總結一些我們遇到的問題以及解決辦法,這是我們團隊項目中收獲的最有價值的內容。
在開發之初,我們選擇了BeautifulSoup模塊,需要在python裏安裝上這個模塊,然而,單單給python安裝模塊就困擾了我們很久,網上有說用pip install命令安裝的,可是當我們嘗試時候發現,pip不好使,問了老師,老師說python自帶pip的,於是我們在網上各種找資料,終於找到了解決方法:我們安裝的python2.7.5裏不自帶pip,安裝了新版本的python(我們試了2.7.11),終於成功解決了pip命令不好使,成功安裝上了模塊(這個問題浪費了我們好幾天)
安完模塊,由於我們都是做爬蟲零基礎的菜鳥,所以我們又在網上找教程學習了一番。
我們學習時候用到的參考資料:
Python爬蟲利器二之Beautiful Soup的用法
Python中使用Beautiful Soup庫的超詳細教程
Python 爬蟲學習系列教程
參考教程,練習BeautifulSoup實例
於是我們第一版程序出爐
# -*- coding:utf-8 -*- import requests from bs4 import BeautifulSoup import re import time import sys def getHTMLText(url,k): # 獲取網頁源代碼 try: if(k==0): kw={} else: kw={‘start‘:k,‘filter‘:‘‘} # 保存獲取的網頁 read = requests.get(url,params=kw,headers={‘User-Agent‘: ‘Mozilla/4.0‘}) read.raise_for_status() read.encoding = read.apparent_encoding return read.text except: print("獲取失敗!") def getData(html): # 分析代碼信息,提取數據 soup = BeautifulSoup(html, "html.parser") # 找到第一個class屬性值為grid_view的ol標簽 movieList=soup.find(‘ol‘,attrs={‘class‘:‘grid_view‘}) # 找到所有的li標簽 for movieLi in movieList.find_all(‘li‘): # 找到第一個class屬性值為hd的div標簽 movieHd=movieLi.find(‘div‘,attrs={‘class‘:‘hd‘}) # 找到第一個class屬性值為title的span標簽 # 獲取電影名字 movieName=movieHd.find(‘span‘,attrs={‘class‘:‘title‘}).getText() print movieName # 獲取電影鏈接 movieUrl=movieHd.find(‘a class="" href="‘) print movieUrl # 獲取電影導演/演員 movieBd = movieLi.find(‘div‘, attrs={‘class‘: ‘bd‘}) movieSF=movieBd.find(‘p‘,attrs={‘class‘:‘‘}).getText() print movieSF # 獲取電影的評分 movieScore=movieLi.find(‘span‘,attrs={‘class‘:‘rating_num‘}).getText() print movieScore #獲取電影的評論數 movieEval=movieLi.find(‘div‘,attrs={‘class‘:‘star‘}) movieEvalNum=re.findall(r‘\d+‘,str(movieEval))[-1] print movieEvalNum # 獲取電影短評 movieQuote = movieLi.find(‘span‘, attrs={‘class‘: ‘inq‘}) # 有的電影沒有短評,為防止報錯,加次 if(movieQuote): print movieQuote.getText() else: print (‘沒有短評!‘) #print ‘=================================================================‘ # 本次抓取的網址 basicUrl=‘https://movie.douban.com/top250‘ k=0 i=1 print ‘===============================魔法開始===============================‘ while k<=225: html=getHTMLText(basicUrl,k) #time.sleep(2) k+=25 getData(html) print ‘-------第‘+str(i)+‘輪完成!-------‘ i+=1 print ‘完成!‘
已經能實現基本功能了
隨後,我們開始添加一些新功能,不過隨著功能的增多,bug也隨之而來:
一開始,我們添加了將爬取結果寫入到文件的功能,不過我們發現寫入不全,後來發現漏了一句代碼:
# 關閉文件,否則容易寫入不全 f.close()
加上這句話後,程序就正常了,這次問題提示我們:python寫入完文件,一定要關閉文件!
在後來我們測試的時候,發現程序在cmd中運行會亂嗎:
參考了網上的資料,我們解決了問題
在Windows環境CMD中顯示亂碼的解決方法
將程序中都采用raw_input()的語句都改為:
raw_input(unicode(‘xxxxxxxxxx‘,‘utf-8‘).encode(‘gbk‘))
程序就正常現實文本了
在程序的各種功能實現後,我們想把程序連帶運行庫打包,因為程序是用python寫的,一般人電腦裏不會有這個運行環境,我們考慮了py2exe模塊和pyinstaller模塊,因為在網上找資料時,pyinstaller某些功能優於py2exe(最主要的是pyinstaller可以把程序的黑窗口隱藏)
參考了網上的教程:
Python | 用Pyinstaller打包發布exe應用
成功打包後,變成了帶有運行庫的單文件
Forward團隊-爬蟲豆瓣top250項目-項目總結