Python高级应用程序设计任务

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

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

一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称

   爬取豆瓣图书Top250


2.主题式网络爬虫爬取的内容与数据特征分析

   爬取的内容:获取书籍名称,作者,译者,出版单位,出版时间,定价,豆瓣评分,评价人数,书籍里的一句话


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

   实现思路:

          (1)利用requests库中的get()进行网页请求,观察输出状态码

          (2)使用etree进行网页解析

          (3)使用循环实现翻页获取数据

          (4)通过循环beautiful soup获取所需的每本图书的基础信息

          (5)通过xlwt将数据保存到Excel中,以便于后面的数据清洗和数据分析

   技术难点:

          (1)在访问页面,进行请求时,要加User-Agent请求的头部信息

          (2)在获取出版单位和出版时间等,没有灵活应用split进行分割

          (3)之前输出文件为csv文件,后因出现乱码,改为输出xls文件

         

二、主题页面的结构特征分析(15分)
1.主题页面的结构特征

 

 

 

2.Htmls页面解析

 

 

 

3.节点(标签)查找方法与遍历方法
(必要时画出节点树结构)

  使用bs4库,正则表达式,观察页面代码中的标签上下节点。遍历方法使用for循环实现对标签的全部遍历,使用select和split获取所需的信息。

三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集

 1 import re
 2 import xlwt
 3 import requests
 4 from lxml import html
 5 etree = html.etree
 6 from bs4 import BeautifulSoup
 7 from collections import namedtuple
 8 
 9 #验证请求头部信息,获取HTML页面分析
10 def getHtml(url):
11     headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'}
12     #获取页面数据
13     page = requests.get(url, headers=headers)
14     #解析网页
15     html = page.text
16     return html
17 
18 #利用BeautifulSoup爬取网页内容
19 def get_book_info_bs4():
20     #创建列表
21     Book_list = []
22     # 利用正则表达式表示不转义
23     reg = re.compile(r'\d+')
24     #循环实现翻页,爬取250本图书所需的信息
25     urls = [f'https://book.douban.com/top250?start={page}' for page in range(0, 250, 25)]
26     for url in urls:
27         #html之间用get请求访问获取url中的值
28         html = getHtml(url)
29         #使用Beautiful_lxml解析
30         soup = BeautifulSoup(html, 'lxml')
31         # 在html中使用select标签,获取图书名
32         book_names = soup.select('td[valign="top"] ~ td[valign="top"]')
33         for book_name in book_names:
34             #定义一个namedtuple类型Book,并包含书名,作者,译者,出版单位,出版时间,定价,豆瓣评分,评价人数,一句话属性
35             Book = namedtuple('Book', '书名,作者,译者,出版单位,出版时间,定价,豆瓣评分,评价人数,一句话')
36             Book.书名 = book_name.select_one('div.pl2 > a').get('title')
37             #选择p.pl标签获取作者信息
38             author_info = book_name.select_one('p.pl').text
39             # 利用split实现切割功能,将作者提取出来
40             author_split = re.split('\s/+\s', author_info)
41             author_len = len(author_split)
42             # 利用split实现切割功能,将出版单位、出版时间、定价提取出来
43             Book.出版单位 = author_split[-3]
44             Book.出版时间 = author_split[-2]
45             Book.定价 = author_split[-1]
46             # 利用split实现切割功能,将作者提取出来
47             Book.作者 = author_split[0] if author_len > 3 else ''
48             Book.译者 = author_split[1] if author_len > 4 else ''
49             #选择span.rating_nums获取豆瓣评分标签
50             Book.豆瓣评分 = book_name.select_one('span.rating_nums').text
51             person = book_name.select_one('span.pl').text
52             Book.评价人数 = reg.search(person).group()
53             #选择span.inq获取图书一句话标签
54             one_sentence = book_name.select_one('span.inq')
55             Book.一句话 = one_sentence.text if one_sentence else ''
56             #将书本信息插入列表中
57             Book_list.append(Book)
58     return Book_list
59 
60 #将爬取到存储到Excel中,注意输出格式
61 def write_info_xls(Book_list):
62     #创建一个workbook
63     Workbook = xlwt.Workbook()
64     #在workbook中新建一个名字为豆瓣图书Top250Excel文件
65     sheet = Workbook.add_sheet('豆瓣图书Top250')
66     infos = '书名,作者,译者,出版单位,出版时间,定价,豆瓣评分,评价人数,一句话'.split(',')
67     #定义输出格式,及放置在哪一行哪一列
68     for i in range(0, len(infos) + 0):
69         sheet.write(0, i, infos[i - 0])
70     for i in range(1, len(Book_list) + 1):
71         sheet.write(i, 0, Book_list[i - 1].书名)
72         sheet.write(i, 1, Book_list[i - 1].作者)
73         sheet.write(i, 2, Book_list[i - 1].译者)
74         sheet.write(i, 3, Book_list[i - 1].出版单位)
75         sheet.write(i, 4, Book_list[i - 1].出版时间)
76         sheet.write(i, 5, Book_list[i - 1].定价)
77         sheet.write(i, 6, Book_list[i - 1].豆瓣评分)
78         sheet.write(i, 7, Book_list[i - 1].评价人数)
79         sheet.write(i, 8, Book_list[i - 1].一句话)
80     Workbook.save('豆瓣图书Top250.xls')
81 
82 #主函数
83 if __name__ == '__main__':
84     Book_list = get_book_info_bs4()
85     write_info_xls(Book_list)

 


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

1 #输出爬取豆瓣图书数据文件的前5行
2 import pandas as pd
3 douban_book = pd.DataFrame(pd.read_excel(r'C:\Users\Administrator.PC-20180405YJVN\Desktop\douban_book.xls'))
4 douban_book.head()

 

1 #删除无效列,即评价人数
2 douban_book.drop('评价人数',axis = 1,inplace = True)
3 douban_book.head()

 

1 #查找重复值
2 douban_book.duplicated()

 

1 #删除数据表中的重复值
2 douban_book = douban_book.drop_duplicates()
3 douban_book.head()

 

1 #对数据中译者一列的数据进行空值处理
2 douban_book['译者'].isnull().value_counts()
1 douban_book['译者'] = douban_book['译者'].fillna('')
2 douban_book.head()

 

 

1 #异常值处理
2 douban_book.describe()

 

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


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

1 #因之前列名是中文,后改为英文
2 import seaborn as sns
3 import pandas as pd
4 import matplotlib.pyplot as plt
5 import matplotlib
6 df = pd.read_excel(r'C:\Users\Administrator.PC-20180405YJVN\Desktop\douban_book.xls')
7 df.sample(5)

 

 1 #查看排名和评分的关系
 2 #配置中文字体和修改字体大小
 3 matplotlib.rcParams['font.family'] = 'SimHei'
 4 matplotlib.rcParams['font.size'] = 20
 5 
 6 #显示大小,宽高
 7 plt.figure(figsize=(10,6))
 8 plt.scatter(df['score'],df['rank'])
 9 plt.xlabel('图书评分')
10 plt.ylabel('图书排名')
11 #修改y轴为倒叙
12 plt.gca().invert_yaxis()
13 
14 plt.show()

 

 

 

1 #评分集中趋势的直方图
2 plt.hist(df['score'],bins=15)
3 plt.show()

 

 

 

1 #年份集中趋势的直方图
2 plt.hist(df['time'],bins=15)
3 plt.show()

 

 

 

 

1 #时间和评分的散点分布图
2 sns.set(style="white")
3 sns.jointplot(x="time",y='score',data=df)

 

 

 

1 #评分和排名的盒图关系
2 sns.boxplot(x='score',y='rank',data=df)

 

 

1 #根据排名和评分绘制回归图
2 sns.regplot(x='score',y='rank',data=df)

 

5.数据持久化

 

 

四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?

   (1)豆瓣图书排名前250的评分主要集中在8.0 - 9.2之间

   (2)豆瓣图书排名前250的出书时间大部分也是在1990 - 2018之间

   (3)大部分情况下,排名越靠前的图书,评价人数越多


2.对本次程序设计任务完成的情况做一个简单的小结。

   通过这次程序设计,我更了解python的爬虫功能,对requests库和BeautifulSoup库有初步的认识,对爬虫的过程也有了初步的了解。

posted @ 2019-12-19 00:14  张晓悦  阅读(395)  评论(0编辑  收藏  举报