1. 程式人生 > >爬取豆瓣電影TOP250的所有電影名稱,網址為:https://movie.douban.com/top250

爬取豆瓣電影TOP250的所有電影名稱,網址為:https://movie.douban.com/top250

所謂靜態頁面是指純粹的HTML格式的頁面,這樣的頁面在瀏覽器中展示的內容都在HTML原始碼中。

目標:爬取豆瓣電影TOP250的所有電影名稱,網址為:https://movie.douban.com/top250

1)確定目標網站的請求頭:


 

開啟目標網站,在網頁空白處點選滑鼠右鍵,選擇“檢查”。(小編使用的是谷歌瀏覽器)。

點選“network”,在彈出頁面若長時間沒有資料顯示,則試一下F5重新整理。

可以得到目標網頁中Host和User-Agent兩項。

2)找到爬取目標資料(即電影名稱)在頁面中的位置


 

右鍵“檢查”,選擇“Elements”。

或者直接找到一個電影名稱,比如《肖申克的救贖》,對它右鍵,選擇“檢查”。

 

3)相關程式碼:


 

複製程式碼

import requests
from bs4 import BeautifulSoup
def get_movies():
    headers={
        'user-agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
        'Host':'movie.douban.com'
    }        #定義爬取目標網頁的請求頭,務必和我們前面通過‘檢查’到的請求頭一致
    movie_list=[]
    for i in range(0,10):    #目標所包含的250項資料分佈在10頁之中
        link='https://movie.douban.com/top250?start='+str(i*25)   #定義每頁的網址 
        r=requests.get(link,headers=headers,timeout=10)    #構建每頁中的抓取請求request
        print (str(i+1),'頁碼響應狀態碼:',r.status_code)
        soup=BeautifulSoup(r.text,'lxml')    #使用BeautifulSoup模組對抓取到的網頁內容進行解析
        div_list=soup.find_all('div',class_='hd')    #將得到的目標電影資料所在的div儲存到list中
        for each in div_list:
            movie=each.a.span.text.strip()    #獲取精確的目標電影資料(即電影名字)
            movie_list.append(movie)
    return movie_list
movies=get_movies()
print(movies)

複製程式碼

 輸出:

複製程式碼

1 頁碼響應狀態碼: 200
2 頁碼響應狀態碼: 200
3 頁碼響應狀態碼: 200
4 頁碼響應狀態碼: 200
5 頁碼響應狀態碼: 200
6 頁碼響應狀態碼: 200
7 頁碼響應狀態碼: 200
8 頁碼響應狀態碼: 200
9 頁碼響應狀態碼: 200
10 頁碼響應狀態碼: 200
['肖申克的救贖', '霸王別姬', '這個殺手不太冷', '阿甘正傳', '美麗人生', '千與千尋', '泰坦尼克號', '辛德勒的名單', '盜夢空間', '機器人總動員', '海上鋼琴師', '三傻大鬧寶萊塢', '忠犬八公的故事', '放牛班的春天', '大話西遊之大聖娶親', '楚門的世界', '龍貓', '教父', '熔爐', '星際穿越', '亂世佳人', '觸不可及', '無間道', '當幸福來敲門', '天堂電影院', '怦然心動', '十二怒漢', '搏擊俱樂部', '少年派的奇幻漂流', '鬼子來了', '蝙蝠俠:黑暗騎士', '指環王3:王者無敵', '活著', '天空之城', '瘋狂動物城', '羅馬假日', '大話西遊之月光寶盒', '飛屋環遊記', '竊聽風暴', '兩杆大煙槍', '飛越瘋人院', '控方證人', '聞香識女人', '哈爾的移動城堡', '海豚灣', 'V字仇殺隊', '辯護人', '死亡詩社', '教父2', '美麗心靈', '指環王2:雙塔奇兵', '指環王1:魔戒再現', '情書', '飲食男女', '摔跤吧!爸爸', '美國往事', '獅子王', '鋼琴家', '天使愛美麗', '七宗罪', '素媛', '被嫌棄的松子的一生', '小鞋子', '致命魔術', '看不見的客人', '音樂之聲', '勇敢的心', '剪刀手愛德華', '本傑明·巴頓奇事', '低俗小說', '西西里的美麗傳說', '拯救大兵瑞恩', '黑客帝國', '沉默的羔羊', '入殮師', '蝴蝶效應', '讓子彈飛', '瑪麗和馬克思', '春光乍洩', '大鬧天宮', '心靈捕手', '陽光燦爛的日子', '幽靈公主', '末代皇帝', '第六感', '重慶森林', '禁閉島', '大魚', '布達佩斯大飯店', '狩獵', '哈利·波特與魔法石', '射鵰英雄傳之東成西就', '致命ID', '甜蜜蜜', '斷背山', '一一', '告白', '貓鼠遊戲', '陽光姐妹淘', '加勒比海盜', '上帝之城', '摩登時代', '穿條紋睡衣的男孩', '阿凡達', '愛在黎明破曉前', '消失的愛人', '風之谷', '愛在日落黃昏時', '側耳傾聽', '倩女幽魂', '紅辣椒', '超脫', '恐怖直播', '螢火蟲之墓', '馴龍高手', '幸福終點站', '菊次郎的夏天', '小森林 夏秋篇', '喜劇之王', '歲月神偷', '借東西的小人阿莉埃蒂', '神偷奶爸', '七武士', '殺人回憶', '海洋', '真愛至上', '電鋸驚魂', '貧民窟的百萬富翁', '諜影重重3', '喜宴', '東邪西毒', '記憶碎片', '雨人', '怪獸電力公司', '瘋狂原始人', '黑天鵝', '英雄本色', '燃情歲月', '盧安達飯店', '虎口脫險', '戀戀筆記本', '海邊的曼徹斯特', '傲慢與偏見', '7號房的禮物', '哈利·波特與死亡聖器(下)', '小森林 冬春篇', '螢火之森', '完美的世界', '教父3', '縱橫四海', '二十二', '魂斷藍橋', '猜火車', '荒蠻故事', '穿越時空的少女', '玩具總動員3', '花樣年華', '雨中曲', '唐伯虎點秋香', '超能陸戰隊', '時空戀旅人', '我是山姆', '蝙蝠俠:黑暗騎士崛起', '人工智慧', '心迷宮', '浪潮', '冰川時代', '香水', '朗讀者', '羅生門', '追隨', '爆裂鼓手', '一次別離', '撞車', '未麻的部屋', '可可西里', '請以你的名字呼喚我', '戰爭之王', '血戰鋼鋸嶺', '地球上的星星', '恐怖遊輪', '夢之安魂曲', '達拉斯買傢俱樂部', '被解救的姜戈', '阿飛正傳', '牯嶺街少年殺人事件', '諜影重重', '諜影重重2', '魔女宅急便', '碧海藍天', '忠犬八公物語', '驚魂記', '頭腦特工隊', '房間', '再次出發之紐約遇見你', '青蛇', '秒速5釐米', '哪吒鬧海', '東京物語', '海盜電臺', '末路狂花', '綠裡奇蹟', '終結者2:審判日', '原始碼', '模仿遊戲', '勇闖奪命島', '新龍門客棧', '黑客帝國3:矩陣革命', '這個男人來自地球', '卡薩布蘭卡', '一個叫歐維的男人決定去死', '城市之光', '變臉', '荒野生存', '遷徙的鳥', '你的名字。', 'E.T. 外星人', '初戀這件小事', '無恥混蛋', '發條橙', '美國麗人', '黃金三鏢客', '英國病人', '小蘿莉的猴神大叔', '愛在午夜降臨前', '燕尾蝶', '無人知曉', '非常嫌疑犯', '叫我第一名', '穆赫蘭道', '瘋狂的石頭', '勇士', '無敵破壞王', '國王的演講', '步履不停', '血鑽', '上帝也瘋狂', '彗星來的那一夜', '槍火', '藍色大門', '大衛·戈爾的一生', '遺願清單', '我愛你', '千鈞一髮', '荒島餘生', '愛·回家', '黑鷹墜落', '麥兜故事', '暖暖內含光', '聚焦']

複製程式碼

完成既定目標。

 

4)進階拓展


 

爬取TOP250電影的英文名。

複製程式碼

import requests
from bs4 import BeautifulSoup
def get_movies():
    headers={
        'user-agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
        'Host':'movie.douban.com'
    }
    movie_list=[]
    for i in range(0,10):
        link='https://movie.douban.com/top250?start='+str(i*25)
        r=requests.get(link,headers=headers,timeout=10)
        print (str(i+1),'頁碼響應狀態碼:',r.status_code)
        soup=BeautifulSoup(r.text,'lxml')
        div_list=soup.find_all('div',class_='hd')
        for each in div_list:
           # movie=each.a.span.text.strip()
            movie=each.a.contents[3].text.strip()
            movie=movie[2:]
            movie_list.append(movie)
            #print(each.a.contents[3].text.strip())
    return movie_list
movies=get_movies()
print(movies)

複製程式碼

注意到更改部分為for迴圈中的部分。

程式碼中,

each.a.span只會定位到a標籤下第一個span標籤的內容。
each.a.contents則會定位到a標籤下所有的子標籤內容(包括換行符‘\n’),例如在for迴圈中新增一句print(each.a.contents),則輸出內容為(以“肖申克的救贖一項為例展示”):
['\n', <span class="title">肖申克的救贖</span>, '\n', <span class="title"> / The Shawshank Redemption</span>, '\n', <span class="other"> / 月黑高飛(港)  /  刺激1995(臺)</span>, '\n']

即包括換行符“\n”,所以若用  each.a.contents[0] 定位到的則是開頭的換行符,不是我們需要的有價值的資訊。

故我們需要的部分的索引應為3(英文名),當我們直接用 movie=each.a.contents[3].text.strip() 進行輸出時候,則發現輸出的為(以“肖申克的救贖一項為例展示”):

['/\xa0The Shawshank Redemption',

我們發現在英文名前面有一個“/”(這個是網頁頁面文字中本來就有的),還有一個“\xa0”,這個代表不間斷空白符 &nbsp;

注意:若遇到“\u3000”,則表示全形的空白符。

參考部落格:https://www.cnblogs.com/BlackStorm/p/6359005.html

故需要  movie=movie[2:]  進行擷取。

修改後的程式碼執行結果為:

複製程式碼

1 頁碼響應狀態碼: 200
2 頁碼響應狀態碼: 200
3 頁碼響應狀態碼: 200
4 頁碼響應狀態碼: 200
5 頁碼響應狀態碼: 200
6 頁碼響應狀態碼: 200
7 頁碼響應狀態碼: 200
8 頁碼響應狀態碼: 200
9 頁碼響應狀態碼: 200
10 頁碼響應狀態碼: 200
['The Shawshank Redemption', '再見,我的妾  /  Farewell My Concubine', 'Léon', 'Forrest Gump', 'La vita è bella', '千と千尋の神隠し', 'Titanic', "Schindler's List", 'Inception', 'WALL·E', "La leggenda del pianista sull'oceano", '3 Idiots', "Hachi: A Dog's Tale", 'Les choristes', '西遊記大結局之仙履奇緣', 'The Truman Show', 'となりのトトロ', 'The Godfather', '도가니', 'Interstellar', 'Gone with the Wind', 'Intouchables', '無間道', 'The Pursuit of Happyness', 'Nuovo Cinema Paradiso', 'Flipped', '12 Angry Men', 'Fight Club', 'Life of Pi', 'Devils on the Doorstep', 'The Dark Knight', 'The Lord of the Rings: The Return of the King', '人生  /  Lifetimes', '天空の城ラピュタ', 'Zootopia', 'Roman Holiday', '西遊記第壹佰零壹回之月光寶盒', 'Up', 'Das Leben der Anderen', 'Lock, Stock and Two Smoking Barrels', "One Flew Over the Cuckoo's Nest", 'Witness for the Prosecution', 'Scent of a Woman', 'ハウルの動く城', 'The Cove', 'V for Vendetta', '변호인', 'Dead Poets Society', 'The Godfather: Part Ⅱ', 'A Beautiful Mind', 'The Lord of the Rings: The Two Towers', 'The Lord of the Rings: The Fellowship of the Ring', 'Love Letter', '飲食男女', 'Dangal', 'Once Upon a Time in America', 'The Lion King', 'The Pianist', "Le fabuleux destin d'Amélie Poulain", 'Se7en', '소원', '嫌われ松子の一生', 'بچههای آسمان', 'The Prestige', 'Contratiempo', 'The Sound of Music', 'Braveheart', 'Edward Scissorhands', 'The Curious Case of Benjamin Button', 'Pulp Fiction', 'Malèna', 'Saving Private Ryan', 'The Matrix', 'The Silence of the Lambs', 'おくりびと', 'The Butterfly Effect', '讓子彈飛一會兒  /  火燒雲', 'Mary and Max', '春光乍洩', '大鬧天宮 上下集  /  The Monkey King', 'Good Will Hunting', 'In the Heat of the Sun', 'もののけ姫', 'The Last Emperor', 'The Sixth Sense', '重慶森林', 'Shutter Island', 'Big Fish', 'The Grand Budapest Hotel', 'Jagten', "Harry Potter and the Sorcerer's Stone", '射鵰英雄傳之東成西就', 'Identity', 'Comrades: Almost a Love Story', 'Brokeback Mountain', 'Yi yi  /  Yi yi: A One and a Two', '自白  /  母親', 'Catch Me If You Can', '써니', 'Pirates of the Caribbean: The Curse of the Black Pearl', 'Cidade de Deus', 'Modern Times', 'The Boy in the Striped Pajamas', 'Avatar', 'Before Sunrise', 'Gone Girl', '風の谷のナウシカ', 'Before Sunset', '耳をすませば', '倩女幽魂(87版)  /  A Chinese Ghost Story', 'パプリカ', 'Detachment', '더 테러 라이브', '火垂るの墓', 'How to Train Your Dragon', 'The Terminal', '菊次郎の夏', 'リトル・フォレスト 夏・秋', '喜劇之王', '歲月神偷', '借りぐらしのアリエッティ', 'Despicable Me', '七人の侍', '살인의 추억', 'Océans', 'Love Actually', 'Saw', 'Slumdog Millionaire', 'The Bourne Ultimatum', '囍宴', '東邪西毒', 'Memento', 'Rain Man', 'Monsters, Inc.', 'The Croods', 'Black Swan', 'A Better Tomorrow  /  Gangland Boss', 'Legends of the Fall', 'Hotel Rwanda', 'La grande vadrouille', 'The Notebook', 'Manchester by the Sea', 'Pride & Prejudice', '7번방의 선물', 'Harry Potter and the Deathly Hallows: Part 2', 'リトル・フォレスト 冬・春', '蛍火の杜へ', 'A Perfect World', 'The Godfather: Part III', '緃橫四海', 'Twenty Two  /  22', 'Waterloo Bridge', 'Trainspotting', 'Relatos salvajes', '時をかける少女', 'Toy Story 3', '花樣年華', "Singin' in the Rain", '唐伯虎點秋香', 'Big Hero 6', 'About Time', 'I Am Sam', 'The Dark Knight Rises', 'Artificial Intelligence: AI', '殯棺  /  The Coffin in the Mountain', 'Die Welle', 'Ice Age', 'Perfume: The Story of a Murderer', 'The Reader', '羅生門', 'Following', 'Whiplash', 'جدایی نادر از سیمین', 'Crash', 'Perfect Blue', 'Kekexili: Mountain Patrol', 'Call Me by Your Name', 'Lord of War', 'Hacksaw Ridge', 'Taare Zameen Par', 'Triangle', 'Requiem for a Dream', 'Dallas Buyers Club', 'Django Unchained', '阿飛正傳', '牯嶺街少年殺人事件', 'The Bourne Identity', 'The Bourne Supremacy', '魔女の宅急便', 'Le grand bleu', 'ハチ公物語', 'Psycho', 'Inside Out', 'Room', 'Begin Again', 'Green Snake', '秒速5センチメートル', "Prince Nezha's Triumph Against Dragon King  /  Nezha nao hai", '東京物語', 'The Boat That Rocked', 'Thelma & Louise', 'The Green Mile', 'Terminator 2: Judgment Day', 'Source Code', 'The Imitation Game', 'The Rock', '新龍門客棧', 'The Matrix Revolutions', 'The Man from Earth', 'Casablanca', 'En man som heter Ove', 'City Lights', 'Face/Off', 'Into the Wild', 'Le peuple migrateur', '君の名は。', 'E.T.: The Extra-Terrestrial', 'สิ่งเล็กเล็กที่เรียกว่า...รัก', 'Inglourious Basterds', 'A Clockwork Orange', 'American Beauty', 'Il buono, il brutto, il cattivo.', 'The English Patient', 'Bajrangi Bhaijaan', 'Before Midnight', 'スワロウテイル', '誰も知らない', 'The Usual Suspects', 'Front of the Class', 'Mulholland Dr.', 'Crazy Stone', 'Warrior', 'Wreck-It Ralph', "The King's Speech", '歩いても 歩いても', 'Blood Diamond', 'The Gods Must Be Crazy', 'Coherence', '鎗火', '藍色大門', 'The Life of David Gale', 'The Bucket List', '그대를 사랑합니다', 'Gattaca', 'Cast Away', '집으로...', 'Black Hawk Down', '麥兜故事', 'Eternal Sunshine of the Spotless Mind', 'Spotlight']