1. 程式人生 > >Python爬蟲-豆瓣電影 Top 250

Python爬蟲-豆瓣電影 Top 250

EDA esc std app data raise 打開網頁 正則表達 sta

爬取的網頁地址為: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 # 正則表達式模塊
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