python实战---猫眼榜单:TOP100榜

本文将爬取猫眼电影的榜单里面的TOP100榜单,爬取的数据包括电影名称、链接、评分和上映时间,数据将保存到txt文件里面去,TOP100榜的url:http://maoyan.com/board/4?offset=0

导入库

  1. BeautifulSoup---解析网页
  2. urlopen---获取网页源码
  3. HTTPError、URLError---异常处理
  4. pygal---数据可视化的处理

提取的数据

分析网页结构

  1. 查看网页的源代码,可以发现我们想要的数据都有,猫眼并没有加密或者异步加载来显示数据,这句比较好办了,我们只需要把网页下载了,再进行就可以了。
  2. 通过看网页源码,我们可以发现数据都在两个div盒子里面,每次只要解析盒子的数据即可

数据爬取 

# 获取到网页,并用beautifulsoup来处理
def open_topnet(top_url):
	try:
		html=urlopen(top_url)
	except (HTTPError,URLError) as hu:
		print('出错啦!')
		return None
	else:
		return bs(html,'lxml')

# 获取数据
def get_top_datas(top_url):
	i=0
	scores=get_topMoive_star(top_url)
	bsObj=open_topnet(top_url)
	# 找到网页所有相关的div('class':'movie-item-info')盒子
	movie_item_infos=bsObj.findAll('div',{'class':'movie-item-info'})
	for movie_item_info in movie_item_infos:
		# 用迭代器来处理,当运行到yield的时候才会返回数据
		yield{
		'title':movie_item_info.p.a.get_text(),
		'href':'http://maoyan.com/'+movie_item_info.p.a.attrs['href'],
		'star':scores[i],
		'time':movie_item_info.find('p',{'class':'releasetime'}).get_text().replace('上映时间:','')
		}
		i+=1

# 获取评分数字
def get_topMoive_star(top_url):
	scores=[]
	bsObj=open_topnet(top_url)
	# 找到网页所有相关的div盒子内容
	score_nums=bsObj.findAll('div',{'class':{'movie-item-number','score-num'}})
	for score_num in score_nums:
		# 获取评分
		scores.append(score_num.p.get_text())
	return scores

保存数据到txt文件

# 把数据写进文件中去
def create_top_txt(datas,i):
	# global page的作用:由于后面画图需要用到数据,所以用个全局变量来保存数据,以便使用
	global page
	# 指定编码格式,免得乱码
	with open('榜单/top'+str(i)+'.txt','w',encoding='utf-8')as f:
		for data in datas:
			f.write('名称:'+data['title']+',链接:'+data['href']+',评分:'+data['star']+',上映时间:'+str(data['time'])+'\n')
			page.append(data)
	print('文件'+str(i)+'写入成功!')

数据可视化

利用pygal库来实现,主要的数据为电影的名称和评分,保存为svg文件

# 数据可视化
def create_plt(datas):
	d,s=[],[]
	#配置对象
	config=pygal.Config()
	#x轴标签旋转角度
	config.x_label_rotation=-45  
	#自定义图表宽度
	config.width=1500  
	line_chart=pygal.Line(config)
	line_chart.title='猫眼榜单Top100'
	for data in datas:
		d.append(data['title'])
        # 把字符串转换为int型,由于存在小数点,所有不能直接转换
		s.append(int(float(data['star'])*10)/10)
	line_chart.x_labels=d
	line_chart.add('评分',s)
	line_chart.render_to_file('猫眼榜单TOP100.svg')

获取多页数据

由于当前的url只是 一部分数据,不能全部提取TOP100榜的数据,通过给URL的里面的参数offset传递数据,改变URL就可以获取多页数据,每次点击下一页的时候,URL只是更改了offset的值,每次加10

# 获取分页数据
def main():
	i=0
	while i<=90:
		top_url='http://maoyan.com/board/4?offset='+str(i);
		datas=get_top_datas(top_url)
		create_top_txt(datas,i)
		i+=10
	create_plt(page)

最终效果

源码链接:链接:https://pan.baidu.com/s/1ydACpNeYTSvAn5ALeN_tXw 密码:gdj6 

原文链接:加载失败,请重新获取