Python3.6+Beautiful Soup+csv 爬取豆瓣電影Top250

豆瓣電影 Top 250:https://movie.douban.com/top250?start=0&filter=
Beautiful Soup:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

注:本文獲取內容全部使用Beautiful Soup的select方法,使用css選擇器。有html+css編程經驗的可以使用css選擇器,方便快捷。

0. 分析頁碼

當鼠標放在第二頁的時候,鏈接顯示:https://movie.douban.com/top250?start=25&filter= 從網頁數據上可以看到每一頁默認顯示25條數據。即翻頁修改此參數即可 0,25,50…,225
在這裏插入圖片描述
程序構造循環:

url = 'https://movie.douban.com/top250?start=%s&filter='
for page in range(10):
	current_page_url = url % (page * 25) 

即 025=0,125=25…9*25=225

1. 分析每一個電影

通過查看元素可以看到,每一個電影卡片對應ol標籤下的li標籤,即遍歷此li標籤即可。
通過css選擇器定位li標籤lis = soup.select("#content .grid_view > li")

‘#‘代表id選擇器,’.‘代表class選擇器,’>’ 代表只獲取下一級
一般情況下優選使用id(唯一),其次class,最後是標籤。
PS:這裏是html+css編程經驗,如果使用某一個選擇器不能精確定位時,可以混合使用多種,優先使用id縮小範圍。
在這裏插入圖片描述

2. 獲取序號及鏈接

在li標籤裏面,序號在class=‘pic’的div標籤下的第一個em標籤中,鏈接在第一個a標籤的屬性href中,因此代碼爲:

index = li.select(".pic em")[0].text
movie_url = li.select(".pic a")[0]['href']

在這裏插入圖片描述

3. 獲取標題

電影名稱在div[class=‘info’]下的第一個a標籤中。

title = li.select(".info .hd a")[0].get_text().replace('\n', '')

如果需要分開獲取可以選中a標籤下的span標籤,使用for循環處理,或根據/截取處理。

spans = li.select(".info .hd a span")
for span in spans:
    print(span.get_text())

一般數據很難直接獲取理想的格式,可以在獲取到後使用基本的正則表達式或字符串處理。
在這裏插入圖片描述

4. 獲取導演,主要,上映時間,類型

info = li.select(".info .bd p")[0].get_text().strip()

在這裏插入圖片描述

5. 評分及簡介

因爲個別電影沒有一句話的簡介,故加了判斷,如果不存在,使用[0]獲取第一個元素會報錯。
如:https://movie.douban.com/top250?start=150&filter= 序號173的電影,見下下圖。

PS:一般實際項目中會發現個別條目會有變化,導致程序出現異常停止或獲取到的數據不對,這就需要在實際運行中及時調整代碼。

rating_start = li.select(".star .rating_num")[0].get_text()
rtating_total_count = li.select(".star span")[-1].get_text()
if li.select(".quote"):
    quote = li.select(".quote")[0].get_text()
else:
    quote = None

在這裏插入圖片描述

6. 寫入csv文件

out = open('movie.csv', 'a', newline='')
movie_csv = csv.writer(out, dialect='excel')
movie_csv.writerow(['序號', '鏈接', '標題', '信息', '評分', '影評數', '描述']) 

7. 完整代碼


import requests
import csv
from bs4 import BeautifulSoup

url = 'https://movie.douban.com/top250?start=%s&filter='

def main():
    out = open('movie.csv', 'a', newline='')
    movie_csv = csv.writer(out, dialect='excel')
    movie_csv.writerow(['序號', '鏈接', '標題', '信息', '評分', '影評數', '描述'])
    for page in range(10):
        content = requests.get(url % (25 * page)).content
        soup = BeautifulSoup(content)

        lis = soup.select("#content .grid_view > li")
        for li in lis:
            index = li.select(".pic em")[0].text
            movie_url = li.select(".pic a")[0]['href']

            title = li.select(".info .hd a")[0].get_text().replace('\n', '')
            # spans = li.select(".info .hd a span")
            # for span in spans:
            #     print(span.get_text())

            info = li.select(".info .bd p")[0].get_text().strip()
            rating_start = li.select(".star .rating_num")[0].get_text()
            rtating_total_count = li.select(".star span")[-1].get_text()
            if li.select(".quote"):
                quote = li.select(".quote")[0].get_text()
            else:
                quote = None
            movie_csv.writerow([index, movie_url, title, info, rating_start, rtating_total_count, quote])
        print("now page:%s" % page)

# 主函數
if __name__ == '__main__':
    main()

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章