【Python】爬虫实战之爬取历年中国电影票房信息

567人浏览 / 0人评论 / 添加收藏

最近因为要做python的编程开发的讲座,分享有关爬虫相关的资料,特分享给大家。

需求分析

我们先来看一下需求:获取自1994年至2022年之间,各年度的大陆票房情况,包括年度排名、电影名称和票房总额

我们发现,中国历年来的电影票房都对应着一个 url,而且这个 url 是有规律的

 

例如:

1994年的中国大陆电影票房网址:http://www.boxofficecn.com/boxoffice1994

1995年的中国大陆电影票房网址:http://www.boxofficecn.com/boxoffice1995

那么我们在提供 url 的时候只需要将最后那部分也就是年份那部分进行修改即可。

代码做了注释,大家应该可以看得懂,直接运行即可。具体代码如下:

# -*- encoding: utf-8 -*-
'''
@File : Fetch_movie.py
@Time : 2023/10/24 21:53:06
@Author : wanglixin
@Version : 1.0
@Contact : wanglixin@erise.com.cn
'''

# here put the import lib
import requests
import bs4
import sys
import os

'''
去访问对应的网页并将网页源码下载下来
需要注意网页的编码格式
'''
def get_web(url):
    header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.59"}
    res = requests.get(url, headers=header, timeout=5)
    # 查看当前网页的编码格式
    # print(res.encoding)
    #对网页源码进行编码
    content = res.text.encode('UTF-8')
    return content
 
'''
对下载下来的网页源码进行解析,然后获取指定内容并存放到一个列表里
'''
def parse_content(content):
    soup = bs4.BeautifulSoup(content, 'lxml')
    movie_list = soup.find_all('tr', attrs={'align': 'left'})
    print('type(movie_list):',type(movie_list)) ###<class 'bs4.element.ResultSet'>
    list = []
    for i in movie_list:
        i = i.text.split('\n')
        i = i[1:len(i)-1]
        list.append(i)
    return list
 
'''
将列表中的内容转换成字典,以键值对的形式存放
'''
def get_content(url):
    content = get_web(url)
    list = parse_content(content)
    dic = {}
    for i in list:
        i[1] = i[1].replace(u'\xa0', u' ').replace(u'\u200b', u' ').replace(u'\u200e', u' ')
        i[2] = i[2].replace(u'\xa0', u' ').replace(u'\u200b', u' ').replace(u'\u200e', u' ')
        i[3] = i[3].replace(u'\xa0', u' ').replace(u'\u200b', u' ').replace(u'\u200e', u' ')
        dic[i[0]] = {'年份': i[1], '电影名称': i[2], '票房(万元)': i[3]}
    return dic
 
'''
数据保存,需要在当前脚本文件目录下新建一个data目录,保存的电影票房数据都存在此目录下
'''
def data_save(dic,year):
    script_dir = os.path.dirname(os.path.abspath(__file__))
    file_name = script_dir + '/data/' + str(year) + '.csv'
    with open(file_name, 'w+') as f:
    f.write('序号,年份,电影名称,票房(万元)\n')
    for k, v in dic.items():
        f.write(k+','+v['年份']+','+v['电影名称']+','+v['票房(万元)']+'\n')
 
if __name__ == '__main__':
    url = 'http://www.boxofficecn.com/boxoffice'
    for year in range(1994, 2023):
        new_url = url + str(year)
        dic = get_content(new_url)
        print('_____开始获取%s年的票房信息______' %(year))
        data_save(dic, year)
    

全部评论