最近因为要做python的编程开发的讲座,分享有关爬虫相关的资料,特分享给大家。
需求分析
我们先来看一下需求:获取自1994年至2022年之间,各年度的大陆票房情况,包括年度排名、电影名称和票房总额
我们发现,中国历年来的电影票房都对应着一个 url,而且这个 url 是有规律的
例如:
1994年的中国大陆电影票房网址:http://www.boxofficecn.com/boxoffice1994http://www.http://www.boxofficecn.com/boxofficece1994
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)
全部评论