zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Leetcode题目:House Robber II
    Leetcode题目:Compare Version Numbers
    Leetcode题目:Intersection of Two Arrays II
    Leetcode题目:Intersection of Two Arrays
    Mac OS X 好用的软件包管理工具 Homebrew
    Linux 安装配置 JDK 8
    Centos 6.5 RedHat 6 安装mysql
    Ubuntu 源
    grub2 使用memdisk工具 启动任意iso
    Fedora 21 设置开机启动脚本
  • 原文地址:https://www.cnblogs.com/MakeView660/p/9579306.html
Copyright © 2011-2022 走看看