Python爬虫-豆瓣电影 Top 250

爬取的网页地址为: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} {1:^10} {2:^10} {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

原文地址:https://www.cnblogs.com/MakeView660/p/9579306.html