一、主题式网络爬虫设计方案
爬取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.经过对主题数据分析与可视化,可以得到哪些结论?
2.对本次程序设计任务完成情况做一个简单的小结
通过这次程序设计任务,丰富了我很多有关爬虫和数据分析的相关知识
原文:https://www.cnblogs.com/mazhongyuan/p/12763560.html