【python爬虫自学笔记】(实战)----爬取猫眼电影榜单Top100

目的:爬取猫眼电影榜单TOP100的信息并保存在文档中。

查看网站结构,确定思路:

首先请求网页的地址为maoyan.com/board/4,电影信息的内容包含在一个个dd标签之中,分析dd标签中的内容,提取有用信息。


其中每个页面只能显示10个电影,若要爬取前100个,需要不断点击下一页,由url中的offset参数进行控制,如图所示,抓取一页内容后offset参数加10获取下一页内容,最终爬取100个电影的信息内容。

源代码如下:

import requests
import re
import json
from requests.exceptions import RequestException
from multiprocessing import Pool
headers = {
   'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134'
}
#获取一页的内容
def get_one_page(url):
    try:
        response = requests.get(url,headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None
#解析一页的内容
def parse_one_page(html):
    #定义正则表达式获取电影排名,图片地址,名称,主演,上映日期,评分等信息
    pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
                         +'.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?'
                          +'integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',re.S)
    items = re.findall(pattern,html)
    print(items)
    #定义生成器
    for item in items:
        yield {
            'index':item[0],
            'image':item[1],
            'title':item[2],
            'star':item[3].strip()[3:], #去掉开头的换行符和内容的'主演:'
            'releasetime':item[4].strip()[5:],  #去掉换行符和内容的'上映日期:'
            'score':item[5]+item[6]  #评分的整数部分与小数部分相加
        }
#写入文件
def write_to_file(content):
    #确保写入文件中的中文内容能正确显示,使用encoding='utf-8'和ensure_ascii=False参数
    with open('result.txt','a',encoding='utf-8') as f: 
        f.write(json.dumps(content,ensure_ascii=False)+'\n') #json.dumps()方法将字典形式的数据转换为字符串类型
        f.close()

def main(offset):
    url = 'http://maoyan.com/board/4?offset='+str(offset)  
    html = get_one_page(url)
    print(html)
    for item in parse_one_page(html):
        print(item)
        write_to_file(item)

if __name__ == '__main__':
    #使用循环的方式进行页面的遍历
    # for i in range(10):
    #     main(i*10)
    #使用多线程进行处理,爬取速度快
    pool = Pool()
    pool.map(main,[i*10 for i in range(10)])

其中html数据信息内容为:

<dd>
                        <i class="board-index board-index-11">11</i>
    <a href="/films/7431" title="乱世佳人" class="image-link" data-act="boarditem-click" data-val="{movieId:7431}">
      <img src="//ms0.meituan.net/mywww/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
      <img data-src="http://p0.meituan.net/movie/230e71d398e0c54730d58dc4bb6e4cca51662.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/7431" title="乱世佳人" data-act="boarditem-click" data-val="{movieId:7431}">乱世佳人</a></p>
        <p class="star">
                主演:费雯·丽,克拉克·盖博,奥利维娅·德哈维兰
        </p>
<p class="releasetime">上映时间:1939-12-15(美国)</p>    </div>
    <div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">1</i></p>        
    </div>

      </div>
    </div>

                </dd>

正则表达式解析后得到的结果为:

('21', 'http://p1.meituan.net/movie/d981a12f59d3cc92ff666094404ad8f0211220.jpg@160w_220h_1e_1c', '黑客帝国', '\n                主演:基努·里维斯,凯瑞-安·莫斯,劳伦斯·菲什伯恩\n        ', '上映时间:2000-01-14', '9.', '0'), ('22', 'http://p0.meituan.net/movie/932bdfbef5be3543e6b136246aeb99b8123736.jpg@160w_220h_1e_1c', '指环王3:王者无敌', '\n                主演:伊莱贾·伍德,伊恩·麦克莱恩,丽芙·泰勒\n        ', '上映时间:2004-03-15', '9.', '2'), ('23', 'http://p1.meituan.net/movie/b449893ebc63d5c54eb4a5b60341f334383831.jpg@160w_220h_1e_1c', '加勒比海盗', '\n                主演:约翰尼·德普,凯拉·奈特莉,奥兰多·布鲁姆\n        ', '上映时间:2003-11-21', '8.', '9'), ('24', 'http://p1.meituan.net/movie/aacb9ed2a6601bfe515ef0970add1715623792.jpg@160w_220h_1e_1c', '哈利·波特与魔法石', '\n                主演:丹尼尔·雷德克里夫,鲁伯特·格林特,艾玛·沃森\n        ', '上映时间:2002-01-26', '9.', '1'), ('25', 'http://p0.meituan.net/movie/d12a1c198ad9ffac72b5db57feacb449294699.jpg@160w_220h_1e_1c', '蝙蝠侠:黑暗骑士', '\n                主演:克里斯蒂安·贝尔,希斯·莱杰,艾伦·艾克哈特\n        ', '上映时间:2008-07-18(美国)', '9.', '3'), ('26', 'http://p0.meituan.net/movie/8959888ee0c399b0fe53a714bc8a5a17460048.jpg@160w_220h_1e_1c', '楚门的世界', '\n                主演:金·凯瑞,劳拉·琳妮,诺亚·艾默里奇\n        ', '上映时间:1998-06-01(美国)', '8.', '9'), ('27', 'http://p1.meituan.net/movie/53b6f0b66882a53b08896c92076515a8236400.jpg@160w_220h_1e_1c', '射雕英雄传之东成西就', '\n                主演:张国荣,梁朝伟,张学友\n        ', '上映时间:1993-02-05(中国香港)', '8.', '9'), ('28', 'http://p1.meituan.net/movie/0d93b5b585ce29c6688e43f3989fb41f86421.jpg@160w_220h_1e_1c', '无间道', '\n                主演:刘德华,梁朝伟,黄秋生\n        ', '上映时间:2003-09-05', '9.', '1'), ('29', 'http://p1.meituan.net/movie/7bac8bfa6739c18620065132ce9c64fa85110.jpg@160w_220h_1e_1c', '教父2', '\n                主演:阿尔·帕西诺,罗伯特·德尼罗,黛安·基顿\n        ', '上映时间:1974-12-12(美国)', '9.', '0'), ('30', 'http://p0.meituan.net/movie/5cfa597a98b35ee4ee598695942641ba287922.jpg@160w_220h_1e_1c', '指环王2:双塔奇兵', '\n                主演:伊莱贾·伍德,伊恩·麦克莱恩,丽芙·泰勒\n        ', '上映时间:2003-04-25', '9.', '1')]

进行数据提取后得到的结果为;

{'index': '21', 'image': 'http://p1.meituan.net/movie/d981a12f59d3cc92ff666094404ad8f0211220.jpg@160w_220h_1e_1c', 'title': '黑客帝国', 'star': '基努·里维斯,凯瑞-安·莫斯,劳伦斯·菲什伯恩', 'releasetime': '2000-01-14', 'score': '9.0'}
{'index': '22', 'image': 'http://p0.meituan.net/movie/932bdfbef5be3543e6b136246aeb99b8123736.jpg@160w_220h_1e_1c', 'title': '指环王3:王者无敌', 'star': '伊莱贾·伍德,伊恩·麦克莱恩,丽芙·泰勒', 'releasetime': '2004-03-15', 'score': '9.2'}
{'index': '23', 'image': 'http://p1.meituan.net/movie/b449893ebc63d5c54eb4a5b60341f334383831.jpg@160w_220h_1e_1c', 'title': '加勒比海盗', 'star': '约翰尼·德普,凯拉·奈特莉,奥兰多·布鲁姆', 'releasetime': '2003-11-21', 'score': '8.9'}
{'index': '24', 'image': 'http://p1.meituan.net/movie/aacb9ed2a6601bfe515ef0970add1715623792.jpg@160w_220h_1e_1c', 'title': '哈利·波特与魔法石', 'star': '丹尼尔·雷德克里夫,鲁伯特·格林特,艾玛·沃森', 'releasetime': '2002-01-26', 'score': '9.1'}
{'index': '25', 'image': 'http://p0.meituan.net/movie/d12a1c198ad9ffac72b5db57feacb449294699.jpg@160w_220h_1e_1c', 'title': '蝙蝠侠:黑暗骑士', 'star': '克里斯蒂安·贝尔,希斯·莱杰,艾伦·艾克哈特', 'releasetime': '2008-07-18(美国)', 'score': '9.3'}
{'index': '26', 'image': 'http://p0.meituan.net/movie/8959888ee0c399b0fe53a714bc8a5a17460048.jpg@160w_220h_1e_1c', 'title': '楚门的世界', 'star': '金·凯瑞,劳拉·琳妮,诺亚·艾默里奇', 'releasetime': '1998-06-01(美国)', 'score': '8.9'}
{'index': '27', 'image': 'http://p1.meituan.net/movie/53b6f0b66882a53b08896c92076515a8236400.jpg@160w_220h_1e_1c', 'title': '射雕英雄传之东成西就', 'star': '张国荣,梁朝伟,张学友', 'releasetime': '1993-02-05(中国香港)', 'score': '8.9'}
{'index': '28', 'image': 'http://p1.meituan.net/movie/0d93b5b585ce29c6688e43f3989fb41f86421.jpg@160w_220h_1e_1c', 'title': '无间道', 'star': '刘德华,梁朝伟,黄秋生', 'releasetime': '2003-09-05', 'score': '9.1'}
{'index': '29', 'image': 'http://p1.meituan.net/movie/7bac8bfa6739c18620065132ce9c64fa85110.jpg@160w_220h_1e_1c', 'title': '教父2', 'star': '阿尔·帕西诺,罗伯特·德尼罗,黛安·基顿', 'releasetime': '1974-12-12(美国)', 'score': '9.0'}
{'index': '30', 'image': 'http://p0.meituan.net/movie/5cfa597a98b35ee4ee598695942641ba287922.jpg@160w_220h_1e_1c', 'title': '指环王2:双塔奇兵', 'star': '伊莱贾·伍德,伊恩·麦克莱恩,丽芙·泰勒', 'releasetime': '2003-04-25', 'score': '9.1'}

猜你喜欢

转载自blog.csdn.net/m0_38103546/article/details/81784488