天天看點

(7)Python爬蟲——爬取豆瓣電影Top250

利用python爬取豆瓣電影Top250的相關資訊,包括電影詳情連結,圖檔連結,影片中文名,影片外國名,評分,評價數,概況,導演,主演,年份,地區,類别這12項内容,然後将爬取的資訊寫入Excel表中。基本上爬取結果還是挺好的。具體代碼如下:

#!/usr/bin/python
#-*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf8')
from bs4 import BeautifulSoup
import re
import urllib2
import xlwt

#得到頁面全部内容
def askURL(url):
    request = urllib2.Request(url)#發送請求
    try:
        response = urllib2.urlopen(request)#取得響應
        html= response.read()#擷取網頁内容
        #print html
    except urllib2.URLError, e:
        if hasattr(e,"code"):
            print e.code
        if hasattr(e,"reason"):
            print e.reason
    return html

#擷取相關内容
def getData(baseurl):
    findLink=re.compile(r'<a href="(.*?)" target="_blank" rel="external nofollow" >')#找到影片詳情連結
    findImgSrc=re.compile(r'<img.*src="(.*jpg)"',re.S)#找到影片圖檔
    findTitle=re.compile(r'<span class="title">(.*)</span>')#找到片名
    #找到評分
    findRating=re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
    #找到評價人數
    findJudge=re.compile(r'<span>(\d*)人評價</span>')
    #找到概況
    findInq=re.compile(r'<span class="inq">(.*)</span>')
    #找到影片相關内容:導演,主演,年份,地區,類别
    findBd=re.compile(r'<p class="">(.*?)</p>',re.S)
    #去掉無關内容
    remove=re.compile(r'                            |\n|</br>|\.*')
    datalist=[]
    for i in range(,):
        url=baseurl+str(i*)
        html=askURL(url)
        soup = BeautifulSoup(html, "html.parser")
        for item in soup.find_all('div',class_='item'):#找到每一個影片項
            data=[]
            item=str(item)#轉換成字元串
            #print item
            link=re.findall(findLink,item)[]
            data.append(link)#添加詳情連結
            imgSrc=re.findall(findImgSrc,item)[]
            data.append(imgSrc)#添加圖檔連結
            titles=re.findall(findTitle,item)
            #片名可能隻有一個中文名,沒有外國名
            if(len(titles)==):
                ctitle=titles[]
                data.append(ctitle)#添加中文片名
                otitle=titles[].replace(" / ","")#去掉無關符号
                data.append(otitle)#添加外國片名
            else:
                data.append(titles[])#添加中文片名
                data.append(' ')#留白
            rating=re.findall(findRating,item)[]
            data.append(rating)#添加評分
            judgeNum=re.findall(findJudge,item)[]
            data.append(judgeNum)#添加評論人數
            inq=re.findall(findInq,item)
            #可能沒有概況
            if len(inq)!=:
                inq=inq[].replace("。","")#去掉句号
                data.append(inq)#添加概況
            else:
                data.append(' ')#留白
            bd=re.findall(findBd,item)[]
            bd=re.sub(remove,"",bd)
            bd=re.sub('<br>'," ",bd)#去掉<br>
            bd=re.sub('/'," ",bd)#替換/
            #data.append(bd)
            words=bd.split(" ")
            for s in words:
                if len(s)!= and s!=' ':#去掉空白内容
                     data.append(s)
            #主演有可能因為導演内容太長而沒有
            if(len(data)!=):
                data.insert(,' ')#留白
            datalist.append(data)
    return datalist

#将相關資料寫入excel中
def saveData(datalist,savepath):
    book=xlwt.Workbook(encoding='utf-8',style_compression=)
    sheet=book.add_sheet('豆瓣電影Top250',cell_overwrite_ok=True)
    col=('電影詳情連結','圖檔連結','影片中文名','影片外國名',
                '評分','評價數','概況','導演','主演','年份','地區','類别')
    for i in range(,):
        sheet.write(,i,col[i])#列名
    for i in range(,):
        data=datalist[i]
        for j in range(,):
            sheet.write(i+,j,data[j])#資料
    book.save(savepath)#儲存

def main():
    baseurl='https://movie.douban.com/top250?start='
    datalist=getData(baseurl)
    savapath=u'豆瓣電影Top250.xlsx'
    saveData(datalist,savapath)

main()
           

Excel表部分内容如下:

(7)Python爬蟲——爬取豆瓣電影Top250