爬取效果:
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)