1. 程式人生 > >python3.5.4爬取豆瓣中國內地電影票房總排行輸出到excel

python3.5.4爬取豆瓣中國內地電影票房總排行輸出到excel

首先,作為練手,我也是看別人的部落格文章學習寫爬蟲的,過程中遇到很多問題,不過經過自己的努力完成了此項任務,雖然過程波折,但是收穫不會少,作為自學可謂加深印象。先說下需求,使用Python3.5版本獲取豆瓣950多部電影排行資訊,包含電影名稱、導演、主演、編劇、型別、時長、上映時間、評分、票房、評分人數等一系列資訊。

#!/usr/bin/python
#-*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import re
import urllib.request
import xlwt

#得到頁面全部內容
def askURL(url):
    fakeHeaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; rv:16.0) (Gecko/20100101 Firefox/16.0)'}#偽裝請求頭
    request = urllib.request.Request(url, headers=fakeHeaders)#傳送請求
    proxy = urllib.request.ProxyHandler({'http': 'http://192.168.1.11:1080'})#設定代理
    opener = urllib.request.build_opener(proxy)#開啟代理
    urllib.request.install_opener(opener)#使用代理
    try:
        response = urllib.request.urlopen(request)#取得響應
        html = response.read()#獲取網頁內容
        return html
    except urllib.request.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)

#獲取相關內容
def getData(baseurl):
    #re.M或re.MULTILINE:使用^或$時會匹配每一行的行首或行尾
    #re.S或re.DOTALL:使用.時能匹配換行符
    # 找到片名
    findTitle=re.compile(r'<a .*?>(.*?)</a>', re.S|re.M)
    #找到評分
    findRating=re.compile(r'<span class="rating_nums">(.*)</span>')
    #找到評價人數
    findJudge=re.compile(r'<span>(.*)</span>')
    #找到影片相關內容:導演,主演,型別,製片國家,年份
    findAbstract=re.compile(r'<div class="abstract">(.*)</div>', re.S)
    #找到發行類別、上映時間、總票房
    findQuote=re.compile(r'<blockquote class="comment">(.*)</blockquote>', re.S)
    datalist = []
    for i in range(0,39):
        #url每頁顯示25條資料,所以需要迴圈遍歷
        url=baseurl+str(i*25)#+'&sort=seq&sub_type='
        html=askURL(url)
        soup = BeautifulSoup(html, "html5lib", from_encoding="utf-8")
        for item in soup.find_all('div', class_='doulist-item'):#找到每一個影片項
            data = []
            item = str(item)#轉換成字串
            titles = re.findall(findTitle, item)#獲取電影名稱
            newtitles = re.sub('\s', '', titles[1])#去掉\n符和空白
            data.append(newtitles)  # 新增中文片名

            rating = re.findall(findRating, item)#獲取評分,評分貌似也有為空的
            if (len(rating) == 1):
                score = rating[0]
                data.append(score)#新增評分
            else:
                data.append(' ')# 留空

            judgeNum=re.findall(findJudge, item)[0]#獲取評價數量,評價數量貌似也有為空的
            newJudgeNum = re.findall(r'\d+', judgeNum)#取出數字
            if len(newJudgeNum) != 0:
                peoplenum = newJudgeNum[0]
                data.append(peoplenum)#新增評價數量
            else:
                data.append(' ')# 留空

            a = re.findall(findAbstract, item)
            #這裡可能會有空字串出現
            if len(a) != 0:
                abstract=re.findall(findAbstract, item)[0]
                abstract = re.sub('\s', "", abstract)#替換/
                abstract = re.sub('</div>', "", abstract)  # 去掉<br>
                words=abstract.split("<br/>")
                #測試發現主演有為空值的現象,此處在為空值的位置新增字眼“主演:”,便於切割字串
                if (len(words) != 5):
                    words.insert(1, '主演: ')  # 留空
                #對字串進行切割,得到導演、主演、電影型別、製片國家、電影所屬年份
                director = words[0].split(':')[1]#導演
                data.append(director)  # 放到列表data中

                mainactor = words[1].split(':')#主演有為空的
                if len(mainactor) != 0:
                    actor = mainactor[1]
                    data.append(actor)#新增主演
                else:
                    data.append(' ')  # 留空

                movietype = words[2].split(':')[1]#電影型別
                data.append(movietype)  # 放到列表data中

                makercountry = words[3].split(':')[1]#製片國家
                data.append(makercountry)  # 存入列表data中

                movieofyear = words[4].split(':')#電影所屬年份
                if len(movieofyear) != 0:
                    year = movieofyear[1]
                    data.append(year[:4])
                else:
                    data.append(' ')  # 留空
            else:
                words=['導演: ', '主演: ', '型別: ', '製片國家/地區: ', '年份: ']
                director = words[0].split(':')[1]  # 導演
                data.append(director)  # 放到列表data中

                mainactor = words[1].split(':')
                data.append(mainactor)

                movietype = words[2].split(':')[1]
                data.append(movietype)

                makercountry = words[3].split(':')[1]  # 製片國家
                data.append(makercountry)  # 存入列表data中

                movieofyear = words[4].split(':')  # 電影所屬年份
                data.append(movieofyear)

            quote = re.findall(findQuote, item)
            # 處理空列表的情況出現
            if len(quote) != 0:
                info = re.sub('\s', '', quote[0])  # 去掉\n符和空白
            else:
                quote.insert(0, '總票房: | 上映日期: | 發行類別: ')#當發現有空資料時
                info = quote[0]
            #對獲取到的字串進行切割處理,以豎線為分割線進行切割
            separatequote = info.split("|")
            # 對字串進行切割,得到總票房、上映日期、發行類別
            pricehouse = separatequote[0].split(":")[2:]#總票房
            if len(pricehouse) != 0:
                data.append(pricehouse[0])
            else:
                data.append(' ')

            releasedate = separatequote[1].split(":")[1:]  # 上映日期
            if len(releasedate) != 0:
                data.append(releasedate[0])
            else:
                data.append(' ')

            releasetype = separatequote[2].split(":")[1:]#發行類別
            if len(releasetype) != 0:
                data.append(releasetype[0])
            else:
                data.append(' ')
            #print(data)
            datalist.append(data)  # 放到大列表datalist中
    return datalist

#將相關資料寫入excel中
def saveData(datalist, savepath):
    book = xlwt.Workbook(encoding='utf-8', style_compression=0)
    sheet=book.add_sheet(u'豆瓣電影', cell_overwrite_ok=True)
    col = ('影片名', '評分', '評價人數', '導演', '主演', '型別', '製片國家', '年份', '總票房', '上映時間', '發行類別')
    for i in range(0, len(col)):
        sheet.write(0, i, col[i])#列名,表格的第一行開始寫。第一列,第二列。。。。
    for i in range(0, 953):#從第零行開始至952行
        data = datalist[i]
        for j in range(0, len(col)):
            sheet.write(i+1, j, data[j])#資料
    book.save(savepath)#儲存

if __name__ == '__main__':
    baseurl = 'https://www.douban.com/doulist/1295618/?start='
    datalist = getData(baseurl)
    savepath = u'中國內地電影票房總排行.xls'
    saveData(datalist, savepath)

輸出效果:


注意事項:這裡輸出發現第50條資料有問題,可通過手動刪除得到其餘952條電影資訊,暫時不知道原因無法修正,如果你們發現了告訴我一聲,我也好改正。我在程式中寫入了953行,這樣多餘的冗餘資料可通過手動刪除來規避。


轉載請標明原作者出處,謝謝


相關推薦

python3.5.4豆瓣中國內地電影票房排行輸出excel

首先,作為練手,我也是看別人的部落格文章學習寫爬蟲的,過程中遇到很多問題,不過經過自己的努力完成了此項任務,雖然過程波折,但是收穫不會少,作為自學可謂加深印象。先說下需求,使用Python3.5版本獲取豆瓣950多部電影排行資訊,包含電影名稱、導演、主演、編劇、型別、時長、上

Python3.5網站上電影數據

x64 沒有 () nbsp 運行 lpar target __init__ doc 首先我們導入幾個pyhton3的庫: from urllib import requestimport urllibfrom html.parser import HTMLParser 在

Python爬蟲入門 | 4 豆瓣TOP250圖書信息

Python 編程語言 Python爬蟲先來看看頁面長啥樣的:https://book.douban.com/top250 我們將要爬取哪些信息:書名、鏈接、評分、一句話評價……1. 爬取單個信息我們先來嘗試爬取書名,利用之前的套路,還是先復制書名的xpath:得到第一本書《追風箏的人》的書名xpath如下:

Python3.5+requests 網站遇到中文亂碼怎麼辦?ä½œè€…ï¼šå¾®è½¯äºšæ´²ç ”ç©¶é™¢

import requests from bs4 import BeautifulSoup url = 'http://quote.eastmoney.com/stocklist.html' user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Wind

python3.6.4裁判文書網----------基本js逆向解析----玉米都督

如果您覺得我的文章對您有用,請您給我一個關注,您的每一個關注都是對我極大的支援,我也會極大的提高產出效率,To_share_code   裁判文書網:http://wenshu.court.gov.cn/ 這個政府網站垃圾慢,需要耐心 ps: 其實沒必要關心js函式的內部細

Python爬蟲入門 | 4 豆瓣TOP250圖書資訊

  我們將要爬取哪些資訊:書名、連結、評分、一句話評價…… 1. 爬取單個資訊 我們先來嘗試爬取書名,利用之前的套路,還是先複製書名的xpath:   得到第一本書《追風箏的人》的書名xpath如下: //*[@id=

python日常—豆瓣250條電影記錄

ring 分層 com line gets ret 同仁 http 一個 # 感興趣的同仁可以相互交流哦import requests import lxml.html,csv doubanUrl = ‘https://movie.douban.com/top2

豆瓣的tp250電影名單

info urlopen lose from port tps div turn data # https://movie.douban.com/top250?start=25&filter= 要爬取的網頁 import re from urlli

用Python豆瓣Top250的電影標題

ive f11 parse www 表達 star import utf-8 各類 所以我們可以這麽寫去得到所有頁面的鏈接我們知道標題是在 target="_blank"> 標題的位置</a> 之中 所以可以通過正則表達式找到所有符合條

基於BeautifulSoup豆瓣網上的電影資訊

基於BeautifulSoup實現爬取豆瓣網上的電影資訊 這些天在學習Python,瞭解到用Python做網頁網頁爬蟲非常的方便,於是琢磨著寫了一個簡單的爬蟲程式(感謝萬能的beautifulSoup框架,ps:做網頁解析太方便了)。當然這是計劃中的一部分,說

python3豆瓣圖書Top250圖片

本部落格只爬取豆瓣圖書Top250的圖片,各位愛書的小夥伴趕緊學起來,爬完的效果圖如下: 我這段程式碼的目錄結構如下: 程式碼在此: # -*- coding:utf-8 -*- import requests from lxml import etree def spid

python3爬蟲--豆瓣Top250的圖書

from lxml import etree import requests import csv fp = open('doubanBook.csv', 'wt', newline='', encoding='utf-8') writer = csv.writer(fp) writer.

Python3 豆瓣圖書Top250並存入Excel

#coding=utf-8 import re import xlwt import requests from bs4 import BeautifulSoup def getHtml(url): headers = {'User-Agent': 'Mo

Python3 Scrapy框架學習二:豆瓣電影Top250

開啟專案裡的items.py檔案,定義如下變數, import scrapy from scrapy import Item,Field class DoubanItem(scrapy.Item): # define the fields for your it

Python3 Scrapy框架學習五:使用crawl模板豆瓣Top250,並存入MySql、MongoDB

1.新建專案及使用crawl模板 2.頁面解析 rules = (Rule(LinkExtractor(allow=r'subject/\d+/',restrict_css = '.hd > a[class = ""]'), callback='parse_it

Python3爬蟲】中國國家地理的62個《古鎮》和363張攝影照片

宣告:爬蟲為學習使用,請各位同學務必不要對當放網站或i伺服器造成傷害。務必不要寫死迴圈。 - 思路:古鎮——古鎮列表(迴圈獲取古鎮詳情href)——xx古鎮詳情(獲取所有img的src) - from bs4 import BeautifulSoup import u

Python3網路爬蟲:requests+mongodb+wordcloud 豆瓣影評並生成詞雲

Python版本: python3.+ 執行環境: Mac OS IDE: pycharm 一 前言 二 豆瓣網影評爬取 網頁分析 程式碼編寫 三 資料庫實裝 四

Scrapy爬蟲(4豆瓣電影Top250圖片

  在用Python的urllib和BeautifulSoup寫過了很多爬蟲之後,本人決定嘗試著名的Python爬蟲框架——Scrapy.   本次分享將詳細講述如何利用Scrapy來下載豆瓣電影Top250, 主要解決的問題有: 如何利用ImagesPi

Python3 爬蟲(三) -- 豆瓣首頁圖片

序 前面已經完成了簡單網頁以及偽裝瀏覽器的學習。下面,實現對豆瓣首頁所有圖片爬取程式,把圖片儲存到本地一個路徑下。 首先,豆瓣首頁部分圖片展示 這只是擷取的一部分。下面給出,整個爬蟲程式。 爬蟲程式

Python3爬蟲】Scrapy豆瓣電影TOP250

今天要實現的就是使用是scrapy爬取豆瓣電影TOP250榜單上的電影資訊。 步驟如下: 一、爬取單頁資訊 首先是建立一個scrapy專案,在資料夾中按住shift然後點選滑鼠右鍵,選擇在此處開啟命令列視窗,輸入以下程式碼: scrapy startprojec