爬取艺龙网站部分酒店信息

一.主题式网络爬虫设计方案
1.主题式网络爬虫名称:爬取艺龙网站泉州酒店信息
2.主题式网络爬虫的内容与数据特征分析:爬取艺龙网站泉州酒店的名称,价格和评分
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点):
实现思路:本次设计方案主要使用request库爬取网页信息和beautifulSoup库来提取泉州酒店信息,将其存入Excel文件里,并对其进行数据清理,模型分析和数据可视化。
技术难度:对艺龙网站泉州酒店页面分析和信息采集以及数据可视化

二.主题页面的结构特征分析

1.主题'页面的结构与特征分析:通过HTML页面的分析我们可以知道每个酒店的信息都在class="h_list"的子标签中,然后我们所要的信息都在于class="h_info_text"中,接着我们可以利用find_all逐一将需要的信息筛选出来。

2.HTML的页面解析

 

 

 

 

 

 三.网络爬虫程序设计

1.数据爬取与采集

 1 import requests
 2 import pandas as pd
 3 from bs4 import BeautifulSoup
 4 
 5 url='http://hotel.elong.com/quanzhou/'
 6 header = {"User-Agent": "huang"}
 7 r = requests.get(url, timeout=30, headers=header)
 8 r.raise_for_status()              # 产生异常信息
 9 r.encoding = r.apparent_encoding  # 修改编码
10 html = r.text
11 soup=BeautifulSoup(html,'html.parser')
12 #创建空列表
13 name=[]
14 level=[]
15 price=[]
16 hotellist=[]
17 
18 #酒店名称
19 for span in soup.find_all("span","info_cn"):
20     name.append(span.string)
21 #酒店评分
22 for i in soup.find_all("i","t20 c37e"):
23     level.append(i.string)
24 #酒店价格
25 for span in soup.find_all("span","h_pri_num"):
26     price.append(span.string)
27 print("{:^60}".format("泉州酒店信息"))
28 print("{:^5}\t{:^20}\t{:^10}\t{:^10}".format("序列","酒店名称","酒店评分","酒店价格"))
29 #将数据进行整合
30 for i in range(20):
31     print("{:^5}\t{:^20}\t{:^10}\t{:^10}".format(i+1,name[i],level[i],price[i]))
32     hotellist.append([i+1,name[i],level[i],price[i]])
33 #对数据进行保存
34 df = pd.DataFrame(hotellist,columns = ['序列','酒店名称','酒店评分','酒店价格'])
35 df.to_excel('艺龙网站泉州酒店信息.xlsx')

 

 

 

 

 

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

(1).删除酒店价格

1 df=pd.read_excel('艺龙网站泉州酒店信息.xlsx')
2 df.drop('酒店名称',axis=1,inplace=True)  #删除酒店名称
3 df.head(20)

 

 

 

 

 

 

 

 

 

 (2).重复值处理

 1 df.duplicated() #重复值处理 

 

 

 

(3).空值与缺失值处理

1 a=df['酒店价格'].isnull().value_counts()  #检查是否有空值或缺失值
2 print(a)

 

 

 (4).异常值处理

1 df.describe()  #检查是否有异常值

 

 

 

 

 

 3.数据分析与可视化

(1)散点图

1 #散点图
2 x = df.酒店价格
3 y = df.酒店评分
4 plt.xlabel("酒店价格")
5 plt.ylabel("酒店评分")
6 plt.scatter(x,y,color="red",label="散点")
7 plt.title("酒店价格与酒店评分的散点图")
8 plt.legend()
9 plt.show()

 

 

 (2).柱状图(各酒店评分分布)

1 #柱形图
2 name_list = df.酒店名称
3 num_list = df.酒店评分  
4 plt.barh(range(len(num_list)), num_list,tick_label = name_list)
5 plt.title("各酒店评分分布")
6 plt.show()

 

 

 

 

 

 (3).直方图(各酒店价格分布)

 1 #直方图
 2 plt.hist(x = df.酒店价格,
 3          bins = 20,
 4          color = 'steelblue',
 5          edgecolor = 'black'
 6          )
 7 plt.xlabel('酒店价格')
 8 plt.ylabel('酒店个数')
 9 plt.title("各酒店价格分布")
10 plt.show()

 

 

 

 

 4.数据之间的关系与相关系数

 1 import numpy as np
 2 import pandas as pd
 3 import seaborn as sns
 4 import sklearn
 5 df=pd.read_excel('艺龙网站泉州酒店信息.xlsx')
 6 df.head(20)
 7 from sklearn.linear_model import LinearRegression
 8 X=df.drop("酒店名称",axis=1)
 9 predict_model=LinearRegression()
10 predict_model.fit(X,df['酒店价格'])
11 print("回归系数为:",predict_model.coef_)    #判断相关性
12 sns.regplot(df.酒店价格,df.序列)

 

 

 5.将代码汇总,附上完整代码

 1 import requests
 2 import pandas as pd
 3 from bs4 import BeautifulSoup
 4 
 5 url='http://hotel.elong.com/quanzhou/'
 6 header = {"User-Agent": "huang"}
 7 r = requests.get(url, timeout=30, headers=header)
 8 r.raise_for_status()              # 产生异常信息
 9 r.encoding = r.apparent_encoding  # 修改编码
10 html = r.text
11 soup=BeautifulSoup(html,'html.parser')
12 #创建空列表
13 name=[]
14 level=[]
15 price=[]
16 hotellist=[]
17 
18 #酒店名称
19 for span in soup.find_all("span","info_cn"):
20     name.append(span.string)
21 #酒店评分
22 for i in soup.find_all("i","t20 c37e"):
23     level.append(i.string)
24 #酒店价格
25 for span in soup.find_all("span","h_pri_num"):
26     price.append(span.string)
27 print("{:^60}".format("泉州酒店信息"))
28 print("{:^5}\t{:^20}\t{:^10}\t{:^10}".format("序列","酒店名称","酒店评分","酒店价格"))
29 #将数据进行整合
30 for i in range(20):
31     print("{:^5}\t{:^20}\t{:^10}\t{:^10}".format(i+1,name[i],level[i],price[i]))
32     hotellist.append([i+1,name[i],level[i],price[i]])
33 #对数据进行保存
34 df = pd.DataFrame(hotellist,columns = ['序列','酒店名称','酒店评分','酒店价格'])
35 df.to_excel('艺龙网站泉州酒店信息.xlsx')
36 #对数据进行读取
37 import pandas as pd
38 df=pd.read_excel('艺龙网站泉州酒店信息.xlsx')
39 print(df)
40 #对数据进行清洗和处理
41 #删除酒店价格
42 df.drop('酒店名称',axis=1,inplace=True)
43 df.head(20)
44 #检查是否有重复值
45 df.duplicated()   
46 #检查是否有空值或缺失值 
47 a=df['酒店价格'].isnull().value_counts()  
48 print(a)
49 #检查是否有异常值
50 df.describe()
51 
52 #对数据分析与可视化
53 import pandas as pd
54 import numpy as np
55 import matplotlib.pyplot as plt
56 import seaborn as sns
57 df = pd.DataFrame(pd.read_excel('艺龙网站泉州酒店信息.xlsx'))
58 #散点图
59 x = df.酒店价格
60 y = df.酒店评分
61 plt.xlabel("酒店价格")
62 plt.ylabel("酒店评分")
63 plt.scatter(x,y,color="red",label="散点")
64 plt.title("酒店价格与酒店评分的散点图")
65 plt.legend()
66 plt.show()
67 #柱形图
68 name_list = df.酒店名称
69 num_list = df.酒店评分  
70 plt.barh(range(len(num_list)), num_list,tick_label = name_list)
71 plt.title("各酒店评分分布")
72 plt.show()
73 #直方图
74 plt.hist(x = df.酒店价格,
75          bins = 20,
76          color = 'steelblue',
77          edgecolor = 'black'
78          )
79 plt.xlabel('酒店价格')
80 plt.ylabel('酒店个数')
81 plt.title("各酒店价格分布")
82 plt.show()
83 
84 #数据之间的关系与相关系数
85 import numpy as np
86 import pandas as pd
87 import seaborn as sns
88 import sklearn
89 df=pd.read_excel('艺龙网站泉州酒店信息.xlsx')
90 df.head(20)
91 from sklearn.linear_model import LinearRegression
92 X=df.drop("酒店名称",axis=1)
93 predict_model=LinearRegression()
94 predict_model.fit(X,df['酒店价格'])
95 print("回归系数为:",predict_model.coef_)    #判断相关性
96 sns.regplot(df.酒店价格,df.序列)

四.结论

1.经过对主题数据的分析与可视化,我发现酒店的价格跟酒店的评分不相关。

2.通过这次的练习让我懂得了不少知识,也对自己的不足之处更加了解。对于本次的编程对象方面由于没有充足了解,导致其数据可视化方面较少,其相关性不明显,总的方面做的还是有些不足。虽说有些不完美,但还是收获了不少,对Python越来越感兴趣,希望今后能学到更多方面的知识提升自己的不足。

 

posted @ 2020-04-19 20:27  黄含斌  阅读(1318)  评论(0编辑  收藏  举报