mazhongyuan

一、主题式网络爬虫设计方案

  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.对本次程序设计任务完成情况做一个简单的小结

通过这次程序设计任务,丰富了我很多有关爬虫和数据分析的相关知识

分类:

技术点:

相关文章: