python高级程序设计及应用_python app

python高级程序设计及应用_python app用Python实现一个面向主题的网络爬虫程序,并完成以下内容:(注:每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台)一、主题式网络爬虫设计方案(15分)1.主题式网络爬虫名称无忧无虑电影网通用爬虫2.主题式网络爬虫爬取的内容与数据特征分析爬取电视剧列表以及电视剧的详细内容(包

大家好,欢迎来到IT知识分享网。

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

一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称
无忧无虑电影网通用爬虫

2.主题式网络爬虫爬取的内容与数据特征分析
爬取电视剧列表以及电视剧的详细内容(包括剧名,年份,评分,集数,主演,导演,地区,地址等)
python高级程序设计及应用_python app
python高级程序设计及应用_python app

 

分析地区和地区电视剧评分是否有关系

3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)

 使用requests库和beautifulSoup4库爬取并解析提取所需内容,将其数据保存到excel表格中
技术难点:在于将不同页数的数据保存在一个excel表格的不同工作簿中,还有对数据的封装
 
二、主题页面的结构特征分析(15分)

1.主题页面的结构特征

 只要修改路径中的数字,即可爬取不同页数的网页电视剧列表

 python高级程序设计及应用_python app

 想要获取电视剧详细页的数据,只需要从电视剧列表中的a标签href中提取电视剧id即可,url中数字之前的路径固定

python高级程序设计及应用_python app

 

2.Htmls页面解析

解析电视剧列表
python高级程序设计及应用_python app

 

python高级程序设计及应用_python app

 

想要获取图中的数据,需要解析下html源码
python高级程序设计及应用_python app

python高级程序设计及应用_python app


3.节点(标签)查找方法与遍历方法

(必要时画出节点树结构)

 
python高级程序设计及应用_python app

 

 

 

三、网络爬虫程序设计(60分)

爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。

1.数据爬取与采集

# 用于获取网页源码的函数def getHTMLText(url):    try:        # 使用requests库爬取网页源码2        r = req.get(url, headers={'user-agent': 'Mozilla/5.0'})        # 判断是否爬取过程中出现错误        r.raise_for_status()        #  设置源码的编码格式        r.encoding = r.apparent_encoding        return r.text    except:        return "爬取失败"# 拼接地址,返回爬取地址数组def urlSplit(path, sheet):    array = []    for i in sheet["href"]:        url = path+i        array.append(url)    return array# 获取指定url页面中电视剧列表集合def TvList(html):    # 外部传来的全局数组    Tvlist = []    #使用BeautifulSoup类解析html文本    soup = BeautifulSoup(html, "html.parser")    #获取每个电视剧的a链接数组    As = soup.select("ul.fed-list-info > li >a.fed-list-title")    #从a标签中获取电视剧id,name,href    for a in As:        # 获取href        href = a.attrs["href"]        # 获取电视剧id        id = href.split('/')[-2]        # 获取Tv name        name = a.text        tem = [id,name,href]        Tvlist.append(tem)    return Tvlist# 获取电视剧详情页数据集合def TvDetailList(html, TvDetaillist):        # 解析网页源码    soup = BeautifulSoup(html, "html.parser")    # 电视剧名称    title = soup.h1.a.string    # 电视剧地址    href = "https://www.bt5156.com"+soup.h1.a.attrs['href']    # 临时数组    temp = []    for index, value in enumerate(soup.find_all('li', 'fed-part-eone')):        if(index > 5):            break        temp.append(value.text)    # 主演    actor = temp[0].split("")[1]    # 导演    director = temp[1].split("")[1]    # 地区    sort = temp[2].split("")[1]    # 地址    location = temp[3].split("")[1]    # 年份    year = temp[4].split("")[1]    # 最新修改时间    date = temp[5].split("")[1]    # 判断可能会出现错误的地方,将错误跳过    try:        # 集数        number = soup.find_all('span', 'fed-list-remarks')[0].text        number = re.findall('\d+', number)[0]    except:        number = ''    # 不论number数据是否错误,都执行以下代码    finally:        # 评分        score = soup.find_all('span', 'fed-list-score')[0].text        # 简介        description = soup.find_all('div', 'fed-part-esan')[0].text        # 对数据进行组装,一个temp就是一个电视剧详细信息        temp = [title, href, actor, director, sort,location, year, date, number, score, description]        # 将电视剧信息存入集合        TvDetaillist.append(temp)        print(title)# 将数据保存到excel文件中def saveExcel(writer,sheet,df):    # 将数据写入excel表中    df.to_excel(writer, sheet_name=sheet)    def saveTvListToExcel(urls, pages, TvlistPath):    writer = pd.ExcelWriter(TvlistPath)    # 爬取网站前n页电视剧列表,分别存储在不同的工作簿中    for index, url in enumerate(urls):        print(url+" "+pages[index])        # 网页源码        html = getHTMLText(url)        # 返回电视剧列表        Tvlist = TvList(html)        # 将列表转为pandas中的DataFrame        df = pd.DataFrame(Tvlist, columns=['id', 'name', 'href'])        # 将DataFrame写入excel中,数据持久化        saveExcel(writer, pages[index], df)    # 从内存中写入excel    writer.save()def saveTvDetailListToExcel(path,pages, TvlistPath, TvDetaillistPath):        col = ["title", "href", "actor", "director", "sort", "location",           "year", "date", "number", "score", "description"]    writer = pd.ExcelWriter(TvDetaillistPath)    for page in pages:        TVDetaillist = []        sheet = pd.read_excel(TvlistPath, sheet_name=page)        for url in urlSplit(path, sheet):            # 循环地址,爬取电视剧详情页            html = getHTMLText(url)            try:                TvDetailList(html, TVDetaillist)            except:                # 发生错误立即将数据保存至excel中并停止爬取                df = pd.DataFrame(TVDetaillist, columns=col)                saveExcel(writer, page, df)                writer.save()                print("有一条数据爬取错误")                return 0                df = pd.DataFrame(TVDetaillist, columns=col)        saveExcel(writer, page, df)    writer.save()# 爬取的页数def SpiderPageNum(n, urls, pages):    for i in range(1, n+1):        url = "https://www.bt5156.com/vodshow/lianxuju--------" + \            str(i) + "---/"        urls.append(url)        page = "page" + str(i)        pages.append(page)

 

#主函数
if __name__ == "__main__":
    # 网站域名
    path = "https://www.bt5156.com"
    # 电视剧列表存储文件路径
    TvlistPath = "TV.xlsx"
    # 电视剧详细信息列表存储文件路径
    TvDetaillistPath = "TVdatail.xlsx"
    # 电视剧列表地址
    urls = []
    # excel工作蒲
    pages = []
    # 爬取4页电视剧列表
    SpiderPageNum(4, urls, pages)
    # 开始爬取电视剧列表
    saveTvListToExcel(urls, pages, TvlistPath)
    # 开始爬取电视机详情列表
    saveTvDetailListToExcel(path, pages, TvlistPath, TvDetaillistPath)

python高级程序设计及应用_python app

 

 

2.对数据进行清洗和处理
pages = []
urls = []

def SpiderPageNum(n, urls, pages):

    for i in range(1, n+1):
        url = "https://www.bt5156.com/vodshow/lianxuju--------" + \
            str(i) + "---/"
        urls.append(url)
        page = "page" + str(i)
        pages.append(page)
        
SpiderPageNum(4,urls,pages)
print(pages)

#从excel文件中获取数据
page1 = pd.read_excel("TVdatail.xlsx", sheet_name=pages[0])
page2 = pd.read_excel("TVdatail.xlsx", sheet_name=pages[1])
page3 = pd.read_excel("TVdatail.xlsx", sheet_name=pages[2])
page4 = pd.read_excel("TVdatail.xlsx", sheet_name=pages[3])
# 获取page1中位空的数据个数 page1[
'location'].isnull().value_counts()

python高级程序设计及应用_python app

 

#查询是否存在空值
print(page2['location'].isnull().value_counts())
#对存在空值的地方填充 其他地区
page2['location'] = page2['location'].fillna('其他地区')

python高级程序设计及应用_python app

3.文本分析(可选):jieba分词、wordcloud可视化

4.数据分析与可视化
(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)

 

page1['number'] = page1['number'].fillna(page1['number'].mean())
# print(page1)
sns.set(style="white")
# 绘制剧集和评分的散点分布
sns.scatterplot(x="number",y='score',data = page1)

python高级程序设计及应用_python app

 

 

sns.set(style="white")#显示风格
sns.jointplot(x="number",y='score',data = page1,kind='reg',height=5)

python高级程序设计及应用_python app

 

 

# 解决seaborn中文乱码问题
sns.set_style('whitegrid',{'font.sans-serif':['simhei','Arial']})
# 查询各个国家电视剧的评分分布
sns.boxplot(x='location',y='score', data=page1)

python高级程序设计及应用_python app

 

 

sns.distplot(page1['score'])

python高级程序设计及应用_python app

 

 

# 统计各个剧种的数量直方图
sns.countplot(page1['sort'])

python高级程序设计及应用_python app

 

 

# 不同时间段各个国家电视剧更新次数直方图
sns.countplot(x=page1['sort'], hue=page1['date'])

python高级程序设计及应用_python app

 

 

# 电视剧评分密度图
sns.kdeplot(page1['score'],kernel='gau')

python高级程序设计及应用_python app

 

 

# 散点图
sns.catplot(x="sort", y="score", data=page1)

python高级程序设计及应用_python app

 5.数据持久化

python高级程序设计及应用_python app

 

电视剧列表数据

 python高级程序设计及应用_python app

 

电视剧详情数据

python高级程序设计及应用_python app

 

 

四、结论(10分)

1.经过对主题数据的分析与可视化,可以得到哪些结论?
通过数据可视化,得出了英剧的电视剧质量(评分)较高,台湾电视剧质量较差劲
看出电视剧集数越多并不代表质量越好
网页的电视剧数量国产剧数量较多
从更新量来看,国产剧的更新次数较多,英剧其次,韩剧第三
欧美剧的电视剧质量最高

2.对本次程序设计任务完成的情况做一个简单的小结。
通过这次的爬虫项目,让我对爬虫的了解进一步加深,也对网站的解构有了更深的了解,对于今后爬取动态网站打下基础

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/29540.html

(0)
上一篇 2023-10-05 09:15
下一篇 2023-10-08 19:00

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信