zoukankan      html  css  js  c++  java
  • python----案例一:爬取猫眼电影排行榜数据

    python----案例一:爬取猫眼电影排行榜数据

    网站地址: http://maoyan.com/board/4

     

    在底页可以看到页码,切换到第二页,看看url会有什么变化。

     url变成了https://maoyan.com/board/4?offset=10,这里offset应该是一个偏移值,可以根据这个参数做到切换页面的效果。

    接下来就可以开始着手写爬虫程序了

    首先我们需要获取网站的html信息

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    import re
    import requests
    import json
    
    #获取页面信息
    url="http://maoyan.com/board/4?offset=0"    #定义网站url
    headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac Os X 10_11_4) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/52.0.2743.116 Safari/537.36 '    #定义http头部信息,这个是模拟浏览器信息,可以防止被放爬虫工具禁止。
            }
    r = requests.get(url,headers=headers,timeout=10)    #向网站发出请求,并指定头部信息和超时时间。
    if r.status_code == 200:
        print(r.text)                                   #返回请求结果

    得到的结果是这样的

    <dd>
                            <i class="board-index board-index-7">7</i>
        <a href="/films/837" title="唐伯虎点秋香" class="image-link" data-act="boarditem-click" data-val="{movieId:837}">
          <img src="//s0.meituan.net/bs/?f=myfe/mywww:/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
          <img data-src="https://p0.meituan.net/movie/da64660f82b98cdc1b8a3804e69609e041108.jpg@160w_220h_1e_1c" alt="唐伯虎点秋香" class="board-img" />
        </a>
        <div class="board-item-main">
          <div class="board-item-content">
                  <div class="movie-item-info">
            <p class="name"><a href="/films/837" title="唐伯虎点秋香" data-act="boarditem-click" data-val="{movieId:837}">唐伯虎点秋香</a></p>
            <p class="star">
                    主演:周星驰,巩俐,郑佩佩
            </p>
    <p class="releasetime">上映时间:1993-07-01(中国香港)</p>    </div>
        <div class="movie-item-number score-num">
    <p class="score"><i class="integer">9.</i><i class="fraction">2</i></p>        
        </div>
    
          </div>
        </div>
    
                    </dd>
                    <dd>
                            <i class="board-index board-index-8">8</i>
        <a href="/films/1212" title="千与千寻" class="image-link" data-act="boarditem-click" data-val="{movieId:1212}">
          <img src="//s0.meituan.net/bs/?f=myfe/mywww:/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
          <img data-src="https://p0.meituan.net/movie/b076ce63e9860ecf1ee9839badee5228329384.jpg@160w_220h_1e_1c" alt="千与千寻" class="board-img" />
        </a>
        <div class="board-item-main">
          <div class="board-item-content">
                  <div class="movie-item-info">
            <p class="name"><a href="/films/1212" title="千与千寻" data-act="boarditem-click" data-val="{movieId:1212}">千与千寻</a></p>
            <p class="star">
                    主演:柊瑠美,入野自由,夏木真理
            </p>
    <p class="releasetime">上映时间:2001-07-20(日本)</p>    </div>
        <div class="movie-item-number score-num">
    <p class="score"><i class="integer">9.</i><i class="fraction">3</i></p>        
        </div>
    
          </div>
        </div>
    </dd>

    可以看出,每个<dd>标签中间就是一个电影的所有信息。

    接下来就是使用正则表达式去匹配我们想要的内容了。

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    import re
    import requests
    import json
    
    #获取页面信息
    url="http://maoyan.com/board/4?offset=0"    #定义网站url
    headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac Os X 10_11_4) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/52.0.2743.116 Safari/537.36 '    #定义http头部信息,这个是模拟浏览器信息,可以防止被放爬虫工具禁止。
            }
    r = requests.get(url,headers=headers,timeout=10)    #向网站发出请求,并指定头部信息和超时时间。
    
    patten = re.compile('<dd.*?board-index.*?>(.*?)</i>',re.S)    #利用正则表达式筛选排名
    text = re.findall(patten,r.text)
    print(text)

    返回

    ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']

    通过完整正则表达式,我们可以从一个<dd>节点里面筛选出排名、电影名称、出演人员、评分等数据。

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    import re
    import requests
    import json
    
    #获取页面信息
    url="http://maoyan.com/board/4?offset=0"    #定义网站url
    headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac Os X 10_11_4) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/52.0.2743.116 Safari/537.36 '    #定义http头部信息,这个是模拟浏览器信息,可以防止被放爬虫工具禁止。
            }
    r = requests.get(url,headers=headers,timeout=10)    #向网站发出请求,并指定头部信息和超时时间。
    
    patten = re.compile('<dd.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?alt="(.*?)"' 
                            '.*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>' 
                            '.*?class="integer">(.*?)</i>.*?class="fraction">(.*?)</i>',re.S)    
    text = re.findall(patten,r.text)
    print(text)

    返回一个数据列表,列表的每一个元素就是一个电影的所有数据,每个电影都是以元祖的方式呈现的。

    [('1', 'https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c', '霸王别姬', '
                    主演:张国荣,张丰毅,巩俐
            ', '上映时间:1993-01-01', '9.', '6'), ('2', 'https://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@160w_220h_1e_1c', '肖申克的救赎', '
                    主演:蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿
            ', '上映时间:1994-10-14(美国)', '9.', '5'), ('3', 'https://p0.meituan.net/movie/54617769d96807e4d81804284ffe2a27239007.jpg@160w_220h_1e_1c', '罗马假日', '
                    主演:格利高里·派克,奥黛丽·赫本,埃迪·艾伯特
            ', '上映时间:1953-09-02(美国)', '9.', '1'), ('4', 'https://p0.meituan.net/movie/e55ec5d18ccc83ba7db68caae54f165f95924.jpg@160w_220h_1e_1c', '这个杀手不太冷', '
                    主演:让·雷诺,加里·奥德曼,娜塔莉·波特曼
            ', '上映时间:1994-09-14(法国)', '9.', '5'), ('5', 'https://p1.meituan.net/movie/f5a924f362f050881f2b8f82e852747c118515.jpg@160w_220h_1e_1c', '教父', '
                    主演:马龙·白兰度,阿尔·帕西诺,詹姆斯·肯恩
            ', '上映时间:1972-03-24(美国)', '9.', '3'), ('6', 'https://p1.meituan.net/movie/0699ac97c82cf01638aa5023562d6134351277.jpg@160w_220h_1e_1c', '泰坦尼克号', '
                    主演:莱昂纳多·迪卡普里奥,凯特·温丝莱特,比利·赞恩
            ', '上映时间:1998-04-03', '9.', '5'), ('7', 'https://p0.meituan.net/movie/da64660f82b98cdc1b8a3804e69609e041108.jpg@160w_220h_1e_1c', '唐伯虎点秋香', '
                    主演:周星驰,巩俐,郑佩佩
            ', '上映时间:1993-07-01(中国香港)', '9.', '2'), ('8', 'https://p0.meituan.net/movie/b076ce63e9860ecf1ee9839badee5228329384.jpg@160w_220h_1e_1c', '千与千寻', '
                    主演:柊瑠美,入野自由,夏木真理
            ', '上映时间:2001-07-20(日本)', '9.', '3'), ('9', 'https://p0.meituan.net/movie/46c29a8b8d8424bdda7715e6fd779c66235684.jpg@160w_220h_1e_1c', '魂断蓝桥', '
                    主演:费雯·丽,罗伯特·泰勒,露塞尔·沃特森
            ', '上映时间:1940-05-17(美国)', '9.', '2'), ('10', 'https://p0.meituan.net/movie/230e71d398e0c54730d58dc4bb6e4cca51662.jpg@160w_220h_1e_1c', '乱世佳人', '
                    主演:费雯·丽,克拉克·盖博,奥利维娅·德哈维兰
            ', '上映时间:1939-12-15(美国)', '9.', '1')]

    可以看到数据并不好看,因此我们需要对数据进行处理。

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    import re
    import requests
    import json
    
    #获取页面信息
    url="http://maoyan.com/board/4?offset=0"    #定义网站url
    headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac Os X 10_11_4) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/52.0.2743.116 Safari/537.36 '    #定义http头部信息,这个是模拟浏览器信息,可以防止被放爬虫工具禁止。
            }
    r = requests.get(url,headers=headers,timeout=10)    #向网站发出请求,并指定头部信息和超时时间。
    
    patten = re.compile('<dd.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?alt="(.*?)"' 
                            '.*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>' 
                            '.*?class="integer">(.*?)</i>.*?class="fraction">(.*?)</i>',re.S)
    items = re.findall(patten,r.text)
    
    for item in items:
        moive = {
                'range' : item[0],
                'img' : item[1],
                'name' : item[2],
                'star' : item[3].strip()[3:],
                'time' : item[4][5:],
                'score' : item[5]+item[6]
            }
        print(moive)

    返回完整的数据

    {'range': '1', 'img': 'https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c', 'name': '霸王别姬', 'star': '张国荣,张丰毅,巩俐', 'time': '1993-01-01', 'score': '9.6'}
    {'range': '2', 'img': 'https://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@160w_220h_1e_1c', 'name': '肖申克的救赎', 'star': '蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿', 'time': '1994-10-14(美国)', 'score': '9.5'}
    {'range': '3', 'img': 'https://p0.meituan.net/movie/54617769d96807e4d81804284ffe2a27239007.jpg@160w_220h_1e_1c', 'name': '罗马假日', 'star': '格利高里·派克,奥黛丽·赫本,埃迪·艾伯特', 'time': '1953-09-02(美国)', 'score': '9.1'}
    {'range': '4', 'img': 'https://p0.meituan.net/movie/e55ec5d18ccc83ba7db68caae54f165f95924.jpg@160w_220h_1e_1c', 'name': '这个杀手不太冷', 'star': '让·雷诺,加里·奥德曼,娜塔莉·波特曼', 'time': '1994-09-14(法国)', 'score': '9.5'}
    {'range': '5', 'img': 'https://p1.meituan.net/movie/f5a924f362f050881f2b8f82e852747c118515.jpg@160w_220h_1e_1c', 'name': '教父', 'star': '马龙·白兰度,阿尔·帕西诺,詹姆斯·肯恩', 'time': '1972-03-24(美国)', 'score': '9.3'}
    {'range': '6', 'img': 'https://p1.meituan.net/movie/0699ac97c82cf01638aa5023562d6134351277.jpg@160w_220h_1e_1c', 'name': '泰坦尼克号', 'star': '莱昂纳多·迪卡普里奥,凯特·温丝莱特,比利·赞恩', 'time': '1998-04-03', 'score': '9.5'}
    {'range': '7', 'img': 'https://p0.meituan.net/movie/da64660f82b98cdc1b8a3804e69609e041108.jpg@160w_220h_1e_1c', 'name': '唐伯虎点秋香', 'star': '周星驰,巩俐,郑佩佩', 'time': '1993-07-01(中国香港)', 'score': '9.2'}
    {'range': '8', 'img': 'https://p0.meituan.net/movie/b076ce63e9860ecf1ee9839badee5228329384.jpg@160w_220h_1e_1c', 'name': '千与千寻', 'star': '柊瑠美,入野自由,夏木真理', 'time': '2001-07-20(日本)', 'score': '9.3'}
    {'range': '9', 'img': 'https://p0.meituan.net/movie/46c29a8b8d8424bdda7715e6fd779c66235684.jpg@160w_220h_1e_1c', 'name': '魂断蓝桥', 'star': '费雯·丽,罗伯特·泰勒,露塞尔·沃特森', 'time': '1940-05-17(美国)', 'score': '9.2'}
    {'range': '10', 'img': 'https://p0.meituan.net/movie/230e71d398e0c54730d58dc4bb6e4cca51662.jpg@160w_220h_1e_1c', 'name': '乱世佳人', 'star': '费雯·丽,克拉克·盖博,奥利维娅·德哈维兰', 'time': '1939-12-15(美国)', 'score': '9.1'}

    接下来就是把代码各个模块函数化,并将得出的数据写入文件中了

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    import re
    import requests
    import json
    
    #定义搜索模块
    #获取页面信息
    def get_page(url):
        try:
            headers = {
                'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac Os X 10_11_4) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/52.0.2743.116 Safari/537.36 '
            }
            r = requests.get(url,headers=headers,timeout=10)
        except:
            print("can not connect to url!!!")
        else:
            if r.status_code == 200:
                return r.text
            else:
                return None
    
    #定义分析模块
    #对获取到的页面信息进行正则匹配,并利用for循环对正则匹配到的信息进行优化编辑,最后通过创建生成器的方式返回for循环中的值。
    def analysis_page(page):
        patten = re.compile('<dd.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?alt="(.*?)"' 
                            '.*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>' 
                            '.*?class="integer">(.*?)</i>.*?class="fraction">(.*?)</i>',re.S)
        items = re.findall(patten,page)
        for item in items:
            moive = {
                'range' : item[0],
                'img' : item[1],
                'name' : item[2],
                'star' : item[3].strip()[3:],
                'time' : item[4][5:],
                'score' : item[5]+item[6]
            }
            yield moive       #yield创建生成器,他的作用是在for循环的每次迭代过程中暂停一下,并输出当前迭代的值。
    
    #定义写入模块
    #将符合json格式的数据写进文件中
    def write_json_to_file(content):
        try:
            with open('./moive.txt', 'a') as f_obj:
                f_obj.write(json.dumps(content, indent=4, ensure_ascii=False) + '
    ')
        except:
            print("Data isn't json!!!" )
    
    #定义主模块
    #传入偏移值,并根据偏移爬去前十页的数据
    def main(offset):
        url = "http://maoyan.com/board/4?offset=" + str(offset)
        page = get_page(url)
        for item in analysis_page(page):
            write_json_to_file(item)
    
    #执行
    if __name__ == '__main__':
        for n in range(10):
            offset = n * 10
            main(offset)

    最后得出的文件是这样的

    {
        "range": "1",
        "img": "https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c",
        "name": "霸王别姬",
        "star": "张国荣,张丰毅,巩俐",
        "time": "1993-01-01",
        "score": "9.6"
    }
    {
        "range": "2",
        "img": "https://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@160w_220h_1e_1c",
        "name": "肖申克的救赎",
        "star": "蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿",
        "time": "1994-10-14(美国)",
        "score": "9.5"
    }
    {
        "range": "3",
        "img": "https://p0.meituan.net/movie/54617769d96807e4d81804284ffe2a27239007.jpg@160w_220h_1e_1c",
        "name": "罗马假日",
        "star": "格利高里·派克,奥黛丽·赫本,埃迪·艾伯特",
        "time": "1953-09-02(美国)",
        "score": "9.1"
    }
    {
        "range": "4",
        "img": "https://p0.meituan.net/movie/e55ec5d18ccc83ba7db68caae54f165f95924.jpg@160w_220h_1e_1c",
        "name": "这个杀手不太冷",
        "star": "让·雷诺,加里·奥德曼,娜塔莉·波特曼",
        "time": "1994-09-14(法国)",
        "score": "9.5"
    }

    。。。。。。。

    至此爬取猫眼电影排行榜数据完成。

  • 相关阅读:
    Leetcode Binary Tree Preorder Traversal
    Leetcode Minimum Depth of Binary Tree
    Leetcode 148. Sort List
    Leetcode 61. Rotate List
    Leetcode 86. Partition List
    Leetcode 21. Merge Two Sorted Lists
    Leetcode 143. Reorder List
    J2EE项目应用开发过程中的易错点
    JNDI初认识
    奔腾的代码
  • 原文地址:https://www.cnblogs.com/QicongLiang/p/10334473.html
Copyright © 2011-2022 走看看