爬取旅游網頁信息


一、主題式網絡爬蟲設計方案

  1. 主題式網絡爬蟲名稱

    爬取hao123旅游網信息

  2. 主題式網絡爬蟲爬取的內容與數據分析

    旅游網的景點、價格、位置、累計售票、顧客滿意度、顧客點評、售票預定時間

  3. 主題式網絡爬蟲設計方案概述

    通過鏈接獲取網頁頁面,再通過正則獲取數據

 

二、主題頁面的結構特征分析

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.經過對主題數據分析與可視化,可以得到哪些結論?

  1. 景區的價格基本不影響滿意度
  2. 滿意度普遍都在50%以上

2.對本次程序設計任務完成情況做一個簡單的小結

通過這次程序設計任務,豐富了我很多有關爬蟲和數據分析的相關知識


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM