一、主題式網絡爬蟲設計方案
-
主題式網絡爬蟲名稱
爬取hao123旅游網信息
-
主題式網絡爬蟲爬取的內容與數據分析
旅游網的景點、價格、位置、累計售票、顧客滿意度、顧客點評、售票預定時間
-
主題式網絡爬蟲設計方案概述
通過鏈接獲取網頁頁面,再通過正則獲取數據
二、主題頁面的結構特征分析
1.主題頁面的結構特征
2.Htmls頁面解析
3.節點(標簽)查找方法與遍歷方法
查找方法:find_all()
遍歷方法:for循環
三、網絡爬蟲程序設計
1.數據爬取與采集
import requests
import re
import pandas as pd
def get_html(url):
'''
定義一個獲取網頁的函數
'''
try:
hed = {
'User-Agent': 'Mozilla/5.0',
}
r = requests.get(url,headers = hed)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return '爬取失敗'
url = 'https://go.hao123.com/ticket'
html = get_html(url)
# 獲取url鏈接
city_url = r'data-option="city" data-val=".*?">(.*?)</a>'
city_list = re.findall(city_url,html)
new_city = []
for i in city_list:
new_city.append('https://go.hao123.com/ticket?search=' + i)
# 使用pandas儲存數據
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
column = ['景點','價格','位置','累計售票','游客滿意度(%)','游客點評(條)','門票預訂時間']
s1 = pd.DataFrame(columns=column)
# 逐個頁面獲取數據
x = 0
for new_url in new_city:
html = get_html(new_url)
# 獲取景點名
req1 = r'<a class="title g-ib g-tover" href=".*?" target="_blank">(.*?)<span class="small">'
data1 = re.findall(req1,html)
# <div class="des g-tover">累計售票<em>342</em>張,游客滿意度:<em>50%</em>,游客點評<em>68</em>條</div>
req2 = r'<div class="des g-tover">累計售票<em>(.*?)</em>張,游客滿意度:<em>(.*?)</em>,游客點評<em>(.*?)</em>條</div>'
data2 = re.findall(req2,html)
# 獲取景點地點
req_pla = r'<div class="address" title=\'.*?\'>(.*?)<a href="'
data_pla = re.findall(req_pla,html)
# 獲取票價
req_pri = r'<div class="price">¥(.*?)<i class="smaller">起</i></div>'
data_pri = re.findall(req_pri,html)
# 獲取售票時間
re_time = r'<div class="site-footer g-tover" title=".*?[\r\n]?.*?"><em class="limit">(.*?)</em>(.*?)[\r\n]?(.*?)</div>'
data_time = re.findall(re_time,html)
for i in range(len(data1)):
s1 = s1.append({'景點':data1[i],'價格':data_pri[i],'位置':data_pla[i],'累計售票':data2[i][0],'游客滿意度(%)':data2[i][1],'游客點評(條)':data2[i][2],'門票預訂時間':data_time[i]}, ignore_index=True)
print('保存{}成功'.format(city_list[x]))
x += 1
# 在本地,將數據保存成xls格式
s1.to_excel('旅游網1.xls')
if x == len(city_list):
break
2.對數據進行清洗和處理
3.文本分析(可選):jieba分詞、wordcloud可視化
4.數據分析與可視化
5.根據數據之間的關系,分析兩個變量之間的相關系數
6.數據持久化
7.附完整程序代碼
import requests
import re
import pandas as pd
import matplotlib.pyplot as plt
def get_html(url):
'''
定義一個獲取網頁的函數
'''
try:
hed = {
'User-Agent': 'Mozilla/5.0',
}
r = requests.get(url,headers = hed)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return '爬取失敗'
url = 'https://go.hao123.com/ticket'
html = get_html(url)
# 獲取url鏈接
city_url = r'data-option="city" data-val=".*?">(.*?)</a>'
city_list = re.findall(city_url,html)
new_city = []
for i in city_list:
new_city.append('https://go.hao123.com/ticket?search=' + i)
# 使用pandas儲存數據
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
column = ['景點','價格','位置','累計售票','游客滿意度(%)','游客點評(條)','門票預訂時間']
s1 = pd.DataFrame(columns=column)
# 逐個頁面獲取數據
x = 0
for new_url in new_city:
html = get_html(new_url)
# 獲取景點名
req1 = r'<a class="title g-ib g-tover" href=".*?" target="_blank">(.*?)<span class="small">'
data1 = re.findall(req1,html)
# <div class="des g-tover">累計售票<em>342</em>張,游客滿意度:<em>50%</em>,游客點評<em>68</em>條</div>
req2 = r'<div class="des g-tover">累計售票<em>(.*?)</em>張,游客滿意度:<em>(.*?)</em>,游客點評<em>(.*?)</em>條</div>'
data2 = re.findall(req2,html)
# 獲取景點地點
req_pla = r'<div class="address" title=\'.*?\'>(.*?)<a href="'
data_pla = re.findall(req_pla,html)
# 獲取票價
req_pri = r'<div class="price">¥(.*?)<i class="smaller">起</i></div>'
data_pri = re.findall(req_pri,html)
# 獲取售票時間
re_time = r'<div class="site-footer g-tover" title=".*?[\r\n]?.*?"><em class="limit">(.*?)</em>(.*?)[\r\n]?(.*?)</div>'
data_time = re.findall(re_time,html)
for i in range(len(data1)):
s1 = s1.append({'景點':data1[i],'價格':data_pri[i],'位置':data_pla[i],'累計售票':data2[i][0],'游客滿意度(%)':data2[i][1],'游客點評(條)':data2[i][2],'門票預訂時間':data_time[i]}, ignore_index=True)
print('保存{}成功'.format(city_list[x]))
x += 1
# 在本地,將數據保存成xls格式
s1.to_excel('旅游網1.xls')
if x == len(city_list):
break
# 可視化時能顯示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
# pandas不能對齊,要設置pandas的參數
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
# 顯示所有的行和列,並設置value的顯示長度為100
pd.set_option('display.max_columns', 100)
pd.set_option('display.max_rows', 100)
pd.set_option('max_colwidth',100)
# 使pandas打印出來不會換行
pd.set_option('display.width',500)
# 讀取excel中的內容,並保存到df中
# Tourism website
tw = pd.read_excel('旅游網1.xls')
tw.name = '旅游網'
# 查看數據前五行
print(tw.head())
# 刪除無用的列
tw = tw.drop('Unnamed: 0',axis=1)
#查找是否有重復值
print(tw.duplicated())
# 把重復值刪除,並在進行查看刪除后的結果
tw = tw.drop_duplicates()
print(tw.duplicated())
# 查看價格是否有空值或缺失值
print(tw['價格'].isnull().value_counts())
# 游客滿意度和價格的柱狀圖
a = tw['游客滿意度(%)']
b = tw['價格']
plt.bar(a,b)
plt.xlabel('游客滿意度(%)')
plt.ylabel('價格')
plt.show()
# 滿意度和價格的分布情況
plt.scatter(tw['游客滿意度(%)'],tw['價格'])
plt.show()
四、結論
1.經過對主題數據分析與可視化,可以得到哪些結論?
-
景區的價格基本不影響滿意度
-
滿意度普遍都在50%以上
2.對本次程序設計任務完成情況做一個簡單的小結
通過這次程序設計任務,豐富了我很多有關爬蟲和數據分析的相關知識