標籤:color com turn add log tar otto span 需要
爬取的網頁地址為:https://movie.douban.com/top250
開啟網頁後,可觀察到:TOP250的電影被分成了10個頁面來展示,每個頁面有25個電影。
那麼要爬取所有電影的資訊,就需要知道另外9個頁面的URL連結。
第一頁:https://movie.douban.com/top250
第二頁:https://movie.douban.com/top250?start=25&filter=
第三頁:https://movie.douban.com/top250?start=50&filter=
以此類推...
分析網頁原始碼:以首頁為例
觀察後可以發現:
所有電影資訊在一個ol標籤之內,該標籤的 class屬性值為grid_view;
每個電影在一個li標籤裡面;
每個電影的電影名稱在:第一個 class屬性值為hd 的div標籤 下的 第一個 class屬性值為title 的span標籤裡;
每個電影的評分在對應li標籤裡的(唯一)一個 class屬性值為rating_num 的span標籤裡;
每個電影的評價人數在 對應li標籤 裡的一個 class屬性值為star 的div標籤中 的最後一個數字;
每個電影的短評在 對應li標籤 裡的一個 class屬性值為inq 的span標籤裡。
Python主要模組:requests模組 BeautifulSoup4模組
>pip install requests
>pip install BeautifulSoup4
主要代碼:
Top250.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
|
# -*- coding:utf-8 -*- import requests # requests模組 from bs4 import BeautifulSoup # BeautifulSoup4模組 import re # Regex模組 import time # 時間模組 import sys # 系統模組
"""擷取html文檔""" def getHTMLText(url, k): try: if(k == 0): # 首頁 kw = {} else: # 其它頁 kw = {‘start‘:k, ‘filter‘:‘‘} r = requests.get(url, params = kw, headers = {‘User-Agent‘: ‘Mozilla/4.0‘}) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: print("Failed!")
"""解析資料""" def getData(html): soup = BeautifulSoup(html, "html.parser") movieList = soup.find(‘ol‘, attrs = {‘class‘:‘grid_view‘}) # 找到第一個class屬性值為grid_view的ol標籤 moveInfo = [] for movieLi in movieList.find_all(‘li‘): # 找到所有li標籤 data = [] # 得到電影名字 movieHd = movieLi.find(‘div‘, attrs = {‘class‘:‘hd‘}) # 找到第一個class屬性值為hd的div標籤 movieName = movieHd.find(‘span‘, attrs = {‘class‘:‘title‘}).getText() # 找到第一個class屬性值為title的span標籤 # 也可使用.string方法 data.append(movieName)
# 得到電影的評分 movieScore = movieLi.find(‘span‘, attrs={‘class‘:‘rating_num‘}).getText() data.append(movieScore)
# 得到電影的評價人數 movieEval=movieLi.find(‘div‘,attrs={‘class‘:‘star‘}) movieEvalNum=re.findall(r‘\d+‘,str(movieEval))[-1] data.append(movieEvalNum)
# 得到電影的短評 movieQuote = movieLi.find(‘span‘, attrs={‘class‘: ‘inq‘}) if(movieQuote): data.append(movieQuote.getText()) else: data.append("無")
print(outputMode.format(data[0], data[1], data[2], data[3], chr(12288)))
# 將輸出重新導向到txt檔案 output = sys.stdout outputfile = open("moviedata.txt", ‘w‘, encoding = ‘utf-8‘) sys.stdout = outputfile outputMode = "{0:{4}^20}\t{1:^10}\t{2:^10}\t{3:{4}<10}" print(outputMode.format(‘電影名稱‘, ‘評分‘, ‘評論人數‘, ‘短評‘, chr(12288))) basicUrl = ‘https://movie.douban.com/top250‘ k = 0 while k <= 225: html = getHTMLText(basicUrl, k) time.sleep(2) k += 25 getData(html)
outputfile.close() sys.stdout = output |
參考出處:62444947
Python爬蟲-豆瓣電影 Top 250