1. 程式人生 > >Forward團隊-爬蟲豆瓣top250項目-項目總結

Forward團隊-爬蟲豆瓣top250項目-項目總結

運行 num hello 保存 實現 以及 ges 命令 容易

托管平臺地址: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項目-項目總結