天天看點

爬蟲-豆瓣top250-電影爬取爬取效果:代碼:

爬取效果:

title,star,quote,link
肖申克的救贖 / The Shawshank Redemption / 月黑高飛(港)  /  刺激1995(台),9.7,希望讓人自由。,https://movie.douban.com/subject/1292052/
霸王别姬 / 再見,我的妾  /  Farewell My Concubine,9.6,風華絕代。,https://movie.douban.com/subject/1291546/
阿甘正傳 / Forrest Gump / 福雷斯特·岡普,9.5,一部美國近現代史。,https://movie.douban.com/subject/1292720/
這個殺手不太冷 / Léon / 殺手萊昂  /  終極追殺令(台),9.4,怪蜀黍和小蘿莉不得不說的故事。,https://movie.douban.com/subject/1295644/
美麗人生 / La vita è bella / 一個快樂的傳說(港)  /  Life Is Beautiful,9.5,最美的謊言。,https://movie.douban.com/subject/1292063/
泰坦尼克号 / Titanic / 鐵達尼号(港 / 台),9.4,失去的才是永恒的。 ,https://movie.douban.com/subject/1292722/
千與千尋 / 千と千尋の神隠し / 神隐少女(台)  /  千與千尋的神隐,9.4,最好的宮崎駿,最好的久石讓。 ,https://movie.douban.com/subject/1291561/
辛德勒的名單 / Schindler's List / 舒特拉的名單(港)  /  辛德勒名單,9.5,拯救一個人,就是拯救整個世界。,https://movie.douban.com/subject/1295124/
盜夢空間 / Inception / 潛行兇間(港)  /  全面啟動(台),9.3,諾蘭給了我們一場無法盜取的夢。,https://movie.douban.com/subject/3541415/
忠犬八公的故事 / Hachi: A Dog's Tale / 忠犬小八(台)  /  秋田犬八千(港),9.4,永遠都不能忘記你所愛的人。,https://movie.douban.com/subject/3011091/
海上鋼琴師 / La leggenda del pianista sull'oceano / 聲光伴我飛(港)  /  一九零零的傳奇,9.3,每個人都要走一條自己堅定了的路,就算是粉身碎骨。 ,https://movie.douban.com/subject/1292001/
楚門的世界 / The Truman Show / 真人Show(港)  /  真人戲,9.3,如果再也不能見到你,祝你早安,午安,晚安。,https://movie.douban.com/subject/1292064/
三傻大鬧寶萊塢 / 3 Idiots / 三個傻瓜(台)  /  作死不離3兄弟(港),9.2,英俊版憨豆,高情商版謝耳朵。,https://movie.douban.com/subject/3793023/
機器人總動員 / WALL·E / 太空奇兵·威E(港)  /  瓦力(台),9.3,小瓦力,大人生。,https://movie.douban.com/subject/2131459/
           

代碼:

# encoding: utf-8
"""
@version: 0.1
@author: 
@site: 
@software: PyCharm
@file: doubanDemo.py
@time: 2020-05-28 21:53
"""
# 第一步 導入庫
import lxml.html
import csv, random
from urllib.request import urlopen, Request
from urllib import parse, request

# 第二步 擷取目标網站
# https://movie.douban.com/top250?start=0&filter=       第一頁
# https://movie.douban.com/top250?start=25&filter=      第二頁
# https://movie.douban.com/top250?start=50&filter=      第三頁
# https://movie.douban.com/top250?start=75&filter=      第四頁
# 規律:(目前網頁-1)*25
# doubanUrl = 'https://movie.douban.com/top250?start=0&filter='
doubanUrl = 'https://movie.douban.com/top250?start={}&filter='

# ua = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'
# ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'

# 模拟多個浏覽器頭,僞裝
ua_list = [
    'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
]

# 随機選一個
ua = random.choice(ua_list)

headers = {
    'User-Agent': ua
}

# dict = {
#     'name': 'Germey'
# }

# 第三部 解析目标網站,得到網頁源代碼  --> class = info
# data = bytes(parse.urlencode(dict),encoding='utf-8')
data = parse.urlencode({'name': 'Germey'})


# 定義一個函數,目的:獲得網頁資料
def getSource(url):
    req = Request(url=url, data=data.encode(), headers=headers)
    # req = request.Request(url = url, data=data, headers={'User-Agent': ua})

# req.add_header('User-agent', ua)

    response = urlopen(req, timeout=5)  # GET
    # response = requests.get(url)

    # 修改編碼格式,防止出現亂碼
    response.encoding = 'utf-8'

    return response

# 定義第二個函數,目的:擷取class = info資料,每一個電影資訊,标題 引言 位址
def getEveryItem(source):

    # selector = lxml.html.document_fromstring(source)

    selector = lxml.html.document_fromstring(source.read())
    # selector = source.read()
    # 通過xpath技術來找到 calss = info
    # // 表示可以提取某個标簽所有資訊
    # / 表示逐層查找
    # @ 表示選取屬性
    movieItemList = selector.xpath('//div[@class="info"]')
    # print('movieItemList', movieItemList)
    # 定義一個空清單,目的:展示資料
    movieList = []
    # 找每一個電影資訊,标題 引言 位址
    for eachMovie in movieItemList:
        # 定義一個字典,目的儲存資料
        movieDict = {}

        title = eachMovie.xpath('div[@class="hd"]/a/span[@class="title"]/text()')    #标題

        otherTitle = eachMovie.xpath('div[@class="hd"]/a/span[@class="other"]/text()')  #副标題

        link = eachMovie.xpath('div[@class="hd"]/a/@href')[0] #評分

        star = eachMovie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0] #引言

        quote = eachMovie.xpath('div[@class="bd"]/p[@class="quote"]/span[@class="inq"]/text()')
        # print(eachMovie.xpath('//div[@class="bd"]/p[@class="quote"]/span[@class="inq"]/text()'))
        # 增加索引,去掉擷取資料中的[],同時處理沒有影評的資料

        if quote:
            quote = quote[0]
        else:
            quote = ''

        # # 儲存到字典
        movieDict['title'] = ''.join(title + otherTitle)
        # movieDict['title'] = title
        movieDict['link'] = link

        movieDict['star'] = star

        movieDict['quote'] = quote

        # 把清單資料添加到清單中
        movieList.append(movieDict)

    return movieList

# 第四步 下載下傳資料
# 定義第三個函數
def writeData(movieList):
    # E:\02_python3.5\workspace\pypc\pc_demo\
    with open('douban.csv', 'w', encoding='utf-8', newline='') as ft:
        # write = csv.DictWriter(ft, fieldnames=['标題', '評分', '評論', '連結'])
        write = csv.DictWriter(ft, fieldnames=['title', 'star', 'quote', 'link'])

        write.writeheader() # 寫入表頭

        for each in movieList:

            write.writerow(each)


# 啟動程式

if __name__ == '__main__':
    movieList = []
    for i in range(0, 11):
        # 擷取每一頁Url
        pageLink = doubanUrl.format(i * 25)
        # print(pageLink)
        # 有Url,就可以擷取電影網頁
        source = getSource(pageLink)

        # # 有了source,就可以擷取電影資訊
        movieList += getEveryItem(source)

    # 調用寫csv函數
    writeData(movieList)