Python高级应用程序设计

Posted 拾荒者04

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python高级应用程序设计相关的知识,希望对你有一定的参考价值。

Python高级应用程序设计任务要求


用Python实现一个面向主题的网络爬虫程序,并完成以下内容:
(注:每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台)

一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称
       名称:爬取视频网站中的电影排名信息
2.主题式网络爬虫爬取的内容与数据特征分析
       本次爬虫主要爬取各个视频网站中的电影排名以及评分
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
       本次设计方案主要依靠request库对目标页面进行信息的爬取采集,再用BeautifulSoup对数据进行清洗,最后将结果打印出来。技术难点主要包括对数据的清洗以及对打印结果的排版。
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征
以爱奇艺电影频道为例,

2.Htmls页面解析
(1)通过在浏览器中用鼠标右键点击查看“查看元素”选项或者按“F12”打开网页源代码。
(2)用requests.get(url)命令向服务器提交请求,然后将响应的网页信息交由BeautifulSoup解析,提取出HTML结构和源代码,最后用soup.prettify()方法输出源码。
3.节点(标签)查找方法与遍历方法
(必要时画出节点树结构)
 查找方法find_all()
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
程序代码:
import requests
from bs4 import BeautifulSoup
#数据存储
import pandas as pd
#导入requests库 从bs4库中调用BeautifulSoup
#爬取爱奇艺电影频道目标的HTML页面
def getHTMLText(url):
    try:
        #用requests抓取网页信息,请求超时时间为60秒
        r = requests.get(url,timeout=60)
        #如果状态码不是200,则引发异常
        r.raise_for_status()
        #配置编码
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "爬取失败"
    
#解析电影名称并电影名称组成数组返回
def getMovie(ulist,html):
    soup = BeautifulSoup(html,"html.parser")
    #用find_all方法从HTML页面中所有的p标签,从中获取到电影的名称
    for p in soup.find_all("p","site-piclist_info_title"):
        ulist.append(p.a.string)
    return ulist

# 获取电影评分
def getPage1(ulist,html):
    soup = BeautifulSoup(html,"html.parser")
    #用find_all方法从HTML页面中所有的div标签,从中获取到电影的评分
    for div in soup.find_all("div","site-title_score"):
        ulist.append(div.span.strong.string)
    return ulist

def getPage2(ulist,html):
    soup = BeautifulSoup(html,"html.parser")
    u = []
    for div in soup.find_all("div","site-title_score"):
        ulist.append(list(div.span))
    return ulist

#打印电影信息函数
def printUnivList(ulist1,ulist2,ulist3,num):
    print("{:^50}".format("电影名称及评分"))
    for i in range(num):
        print("{:^45}\\t\\t{}{}".format(ulist1[i],ulist2[i],ulist3[i]))

# 写入excel文件中
def savedata(html, filename,m,p1,p3):
    movies = []
    for i in range(len(p1)):
        try:
            # print(p1[i]+p3[i])
            score = p1[i]+p3[i]
            movies.append([getMovie(m, html)[i], score])
        except:
            ""

    # print(movis)
    pf = pd.DataFrame(movies, columns=["movie_name", "score"])
    writer = pd.ExcelWriter(filename)
    pf.to_excel(writer, sheet_name="movies")
    writer.save()

def main():
    # 保存路径
    filename = "movie-boxoffice.xlsx"

    # 爬取页面url地址
    Url = "https://www.iqiyi.com/dianying_new/i_list_paihangbang.html"
    #创建一个数组m用来存放爬取到的电影名称
    m = []
    #创建2个数组分别存储电影评分的个位部分的数值以及小数点后的数值
    p1 = []
    p2 = []
    #创建一个数组P3将p1和p2的数据进行合并处理
    p3 = []
    #获取到HTML页面信息
    html = getHTMLText(Url)
    #获取到电影名称
    m = getMovie(m, html)
    #获取到电影评分
    p1 = getPage1(p1, html)
    p2 = getPage2(p2, html)
    #将p1和p2的信息合并存储到p3
    for i in range(len(p2)):
        p3.append(p2[i][1])
    #打印所有爬取到的电影信息
    printUnivList(m, p1, p3, len(m))
    # 数据持久化到excel
    savedata(html, filename,m,p1,p3)

main()

 

 

运行结果:

1.数据爬取与采集
使用request库进行爬取数据
#爬取爱奇艺电影频道目标的HTML页面
def getHTMLText(url):
    try:
        #用requests抓取网页信息,请求超时时间为60秒
        r = requests.get(url,timeout=60)
        #如果状态码不是200,则引发异常
        r.raise_for_status()
        #配置编码
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "爬取失败"

 


2.对数据进行清洗和处理
用BeautifulSoup 库进行数据清洗

 

#解析电影名称并电影名称组成数组返回
def getMovie(ulist,html):
    soup = BeautifulSoup(html,"html.parser")
    #用find_all方法从HTML页面中所有的p标签,从中获取到电影的名称
    for p in soup.find_all("p","site-piclist_info_title"):
        ulist.append(p.a.string)
    return ulist

# 获取电影评分
def getPage1(ulist,html):
    soup = BeautifulSoup(html,"html.parser")
    #用find_all方法从HTML页面中所有的div标签,从中获取到电影的评分
    for div in soup.find_all("div","site-title_score"):
        ulist.append(div.span.strong.string)
    return ulist

def getPage2(ulist,html):
    soup = BeautifulSoup(html,"html.parser")
    u = []
    for div in soup.find_all("div","site-title_score"):
        ulist.append(list(div.span))
    return ulist

#打印电影信息函数
def printUnivList(ulist1,ulist2,ulist3,num):
    print("{:^50}".format("电影名称及评分"))
    for i in range(num):
        print("{:^45}\\t\\t{}{}".format(ulist1[i],ulist2[i],ulist3[i]))

# 写入excel文件中
def savedata(html, filename,m,p1,p3):
    movies = []
    for i in range(len(p1)):
        try:
            # print(p1[i]+p3[i])
            score = p1[i]+p3[i]
            movies.append([getMovie(m, html)[i], score])
        except:
            ""

    # print(movis)
    pf = pd.DataFrame(movies, columns=["movie_name", "score"])
    writer = pd.ExcelWriter(filename)
    pf.to_excel(writer, sheet_name="movies")
    writer.save()

def main():
    # 保存路径
    filename = "movie-boxoffice.xlsx"

    # 爬取页面url地址
    Url = "https://www.iqiyi.com/dianying_new/i_list_paihangbang.html"
    #创建一个数组m用来存放爬取到的电影名称
    m = []
    #创建2个数组分别存储电影评分的个位部分的数值以及小数点后的数值
    p1 = []
    p2 = []
    #创建一个数组P3将p1和p2的数据进行合并处理
    p3 = []
    #获取到HTML页面信息
    html = getHTMLText(Url)
    #获取到电影名称
    m = getMovie(m, html)
    #获取到电影评分
    p1 = getPage1(p1, html)
    p2 = getPage2(p2, html)
    #将p1和p2的信息合并存储到p3
    for i in range(len(p2)):
        p3.append(p2[i][1])
    #打印所有爬取到的电影信息
    printUnivList(m, p1, p3, len(m))
    # 数据持久化到excel
    savedata(html, filename,m,p1,p3)

main()

 


3.文本分析(可选):jieba分词、wordcloud可视化
#encoding=utf-8
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
file_object = open(r\'C:\\Users\\lenovo\\Desktop\\琐屑\\a\') 
#不要把open放在try中,以防止打开失败,那么就不用关闭了
try:
    file_context = file_object.read() #file_context是一个string,读取完后,就失去了对test.txt的文件引用
finally:
    file_object.close()
#print(file_context)
seg_list = jieba.cut_for_search(file_context)# 搜索引擎模式
#print(list(seg_list))
#print(" ".join(seg_list))
# 设置词云 
wc = WordCloud( 
# 设置背景颜色 
background_color="black", 
# 设置最大显示的词云数 
max_words=2000, 
# 这种字体都在电脑字体中,一般路径 
font_path=\'C:\\Windows\\Fonts\\simfang.ttf\', 
height=1200, width=1600, 
# 设置字体最大值 
max_font_size=100, 
# 设置有多少种随机生成状态,即有多少种配色方案 
random_state=30, )
myword = wc.generate(" ".join(seg_list))  # 生成词云
# 展示词云图
plt.imshow(myword)
plt.axis("off")
plt.show()
wc.to_file(\'C://Users//123//Desktop//p.png\')  # 把词云保存下

结果图:


4.数据分析与可视化
(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)
散点图:
import matplotlib.pyplot as plt
plt.rcParams[\'font.sans-serif\']=[\'SimHei\'] #用来正常显示中文标签
plt.rcParams[\'axes.unicode_minus\']=False #用来正常显示负号
# 设置圆点大小
size =  100
getMovie = [\'少年的你\',\'碟中谍6:全面瓦解\',\'攀登者\',\'哪吒之魔童降世\',\'犯罪现场\',\'醉马骝\',\'艾特所有人\',\'《两只老虎》纪录片\',\'天作谜案\',\'巨鳄风暴\']
p3 = [\'8.5\',\'7.7\',\'8.5\',\'9.0\',\'8.5\',\'7.8\',\'7.7\',\'7.7\',\'7.0\',\'7.3\']
# 绘制散点图, alpha=0.5表示透明度
plt.scatter(getMovie,p3,  color="r", alpha=0.5, marker=\'o\')
plt.xlabel("getMovie")
plt.ylabel("p3")
plt.title("电影排名及评分的散点图")
plt.grid() # 添加网格
plt.show()

 

结论:由散点图分析可得电影的排名及评分之间不存在相关性。

饼图:
import matplotlib.pyplot as plt
Type = [\'9分及以上\', \'8分以上9分以下\', \'7分以上8分以下\', \'6分以上7分以下\'] Data = [1, 8, 8, 1] #cols = [\'r\',\'g\',\'y\',\'coral\'] #绘制饼图 plt.pie(Data ,labels=Type, autopct=\'%1.1f%%\') #设置显示图像为圆形 plt.axis(\'equal\') plt.title(\'各评分所占的比重\') plt.show()

运行结果:

直方图:
plt.bar([\'6分以上7分以下\',\'7分以上8分以下\',\'8分以上9分以下\',\'9分及以上\'], 
        [1, 8, 8, 1], 
        label="各评分所占比重")
plt.legend()
plt.show()

运行结果:


 5.数据持久化

 

# 写入excel文件中
def savedata(html, filename,m,p1,p3):
    movies = []
    for i in range(len(p1)):
        try:
            # print(p1[i]+p3[i])
            score = p1[i]+p3[i]
            movies.append([getMovie(m, html)[i], score])
        except:
            ""

    # print(movis)
    pf = pd.DataFrame(movies, columns=["movie_name", "score"])
    writer = pd.ExcelWriter(filename)
    pf.to_excel(writer, sheet_name="movies")
    writer.save()

运行结果:

 
四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?
通过对主题数据的分析与可视化,可以得到电影的排名信息以及各自的评分
2.对本次程序设计任务完成的情况做一个简单的小结。
通过这次任务,基本实现把想要的数据爬取下来,以及对其进行数据清洗及分析。
这次实验同样存在不足之处,爬取下来的数据排版问题没有得到好的解决,所以仍需继续努力学习,不断提升自己的能力,完善自我,解决遇到的所有问题。

以上是关于Python高级应用程序设计的主要内容,如果未能解决你的问题,请参考以下文章

Python高级应用程序设计

Python高级应用程序设计任务

Python高级应用程序设计任务

Python高级应用程序设计任务

Python高级应用程序设计任务

Python高级应用程序设计任务