Python爬蟲-豆瓣電影 Top 250
阿新 • • 發佈:2018-09-03
EDA esc std app data raise 打開網頁 正則表達 sta
每個電影在一個li標簽裏面;
每個電影的電影名稱在:第一個 class屬性值為hd 的div標簽 下的 第一個 class屬性值為title 的span標簽裏;
每個電影的評分在對應li標簽裏的(唯一)一個 class屬性值為rating_num 的span標簽裏;
每個電影的評價人數在 對應li標簽 裏的一個 class屬性值為star 的div標簽中 的最後一個數字;
每個電影的短評在 對應li標簽 裏的一個 class屬性值為inq 的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 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 |
參考出處:https://blog.csdn.net/linzch3/article/details/62444947
Python爬蟲-豆瓣電影 Top 250