本文将爬取猫眼电影的榜单里面的TOP100榜单,爬取的数据包括电影名称、链接、评分和上映时间,数据将保存到txt文件里面去,TOP100榜的url:http://maoyan.com/board/4?offset=0
# 获取到网页,并用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
# 把数据写进文件中去
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