爬取的网页地址为: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:
        ):             # 首页
            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]
        data.append(movieEvalNum)

# 得到电影的短评
        movieQuote = movieLi.find('span', attrs={'class': 'inq'})
        if(movieQuote):
            data.append(movieQuote.getText())
        else:
            data.append("无")

)))

# 将输出重定向到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}"
)))
basicUrl = 'https://movie.douban.com/top250'
k = 
:
    html = getHTMLText(basicUrl, k)
    time.sleep()
    k += 
    getData(html)

outputfile.close()
sys.stdout = output

 参考出处:https://blog.csdn.net/linzch3/article/details/62444947

最新文章

  1. java内置数据类型
  2. JavaScript String 对象
  3. .Net中的Placeholder控件
  4. static的应用以及静态与非静态的区别
  5. 用linux的shell脚本把目录下面的所有文件的文件内容中的小写字母改成大写字母
  6. javascript闭包特性
  7. 简单的Ajax
  8. HDU 4707 Pet(DFS(深度优先搜索)+BFS(广度优先搜索))
  9. c语言下多线程
  10. linux下php-5.4.8.tar.gz编译安装全攻略
  11. Python 之简单线程池创建
  12. C语言预处理 编译 汇编 链接四个阶段
  13. synchronized修饰static方法与非static方法的区别
  14. @Controller和@RestController之间的区别
  15. Pandas系列(十)-转换连接详解
  16. 上传图片(photoClip)
  17. CRM销售管理功能
  18. &lt;转&gt; 解决异常:IllegalStateException: Fragment &lt;ThisFragment&gt; is not currently in the FragmentManager
  19. 在SpringMVC中使用@RequestBody注解处理json时,报出HTTP Status 415的解决方案
  20. 【Java】Java-UTC-时间戳处理

热门文章

  1. Swift is Now Open Source
  2. Moving Swiftly(从OC切换到Swift)
  3. RRDtool运用
  4. 微信小程序学习资料
  5. font-face 跨域解决
  6. linux 网络安全不完全笔记
  7. python将dict中的unicode打印成中文
  8. springmvc 接受json参数的坑
  9. node学习笔记3——文件操作fs
  10. Java设计模式(17)解释器模式(Interpreter模式)