Python高级应用程序设计任务要求

用Python实现一个面向主题的网络爬虫程序,并完成以下内容:
(注:每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台)

一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称

名称:爬取爱彼迎房源信息(泉州地区)

2.主题式网络爬虫爬取的内容与数据特征分析

 
本次爬虫主要爬取爱彼迎的泉州地区房源信息


3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)

设计方案:使用request库和beautifulSoup库对爱彼迎网站进行访问,采集与处理数据,将爱彼迎房源数据分析出来、数据可视化和持久化。

技术难点主要是对爱彼迎页面的分析和采集。

 
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征

2.Htmls页面解析

打开爱彼迎界面,点击F12,打开代码,找到对应代码。
 
 

3.节点(标签)查找方法与遍历方法
(必要时画出节点树结构)

 
节点(标签)查找方法与遍历方法:使用find_all()

三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。

 
 
 
 

1.数据爬取与采集

def getinfo(self,url):
# 获取网页数据
try:
#伪装UA
ua = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
#读取网页
r = requests.get(url, headers=ua)
# 获取状态
r.raise_for_status()
# 状态判断
if (r.status_code == 200):
r.encoding = chardet.detect(r.content)["encoding"]
return r.text
return None
except:
return "下载错误" def getHouseInfo(self,html):
'''
获取用户基本信息
'''
# 初始化BeautifulSoup库
soup = BeautifulSoup(html, "html.parser")
# 创建字典
 
 
2.对数据进行清洗和处理
def getHouseInfo(self,html):
'''
获取用户基本信息
'''
# 初始化BeautifulSoup库
soup = BeautifulSoup(html, "html.parser")
# 创建字典
datas = []
# div._1wbi47zw > div._hgs47m > div._10ejfg4u > div._y5sok6 > div._qlq27g > a._okj6x
s = soup.select("div._1wbi47zw > div._hgs47m > div._10ejfg4u > div._y5sok6 > div._qlq27g > a._okj6x")
#循环上面房间数据
for i in s:
# 临时数组
data = {}
# 取出房间名称
name = i.select("div._qrfr9x5")
# 打印
print(str(name[0].get_text()))
# 加入成员
data['房间名称'] = str(name[0].get_text())
#取出房间的tags标签
tags = i.select("span._faldii7")
# 打印
print(str(tags[0].get_text()))
# 标签
data['标签'] = str(tags[0].get_text())
# 打印
print(str(tags[1].get_text()))
# 评分
data['评价'] = str(tags[1].get_text())
# 加入字典
datas.append(data)
# 返回
return datas
3.文本分析(可选):jieba分词、wordcloud可视化
 
4.数据分析与可视化
(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)
 
 def grab(self):
url = "https://www.airbnb.cn/s/%E6%B3%89%E5%B7%9E/homes"
print('--------------开始下载')
html = self.getinfo(url)
print('--------------开始解析')
house = self.getHouseInfo(html)
print("成功解析:%s条信息"%len(house))
for i,value in enumerate(house):
print('******** %s ********'%(i+1))
for item in value.items():
print("%s\t:%s"%item)
print('*******************')
# 持久化
self.write_data(house) if __name__ == '__main__':
house = house()
house.grab()


 5.数据持久化

    def set_style(self,name,height,bold=False):
# 创建一个样式对象,初始化样式
style = xlwt.XFStyle()
font = xlwt.Font()
font.name = name
font.bold = bold
font.color_index = 4
font.height = height
style.font = font
return style
'''
持久化
'''
def write_data(self,datas):
if datas is None:
return None
try:
# print(help(self.sheet1.write()))
top = list(datas[0].keys())
# 数据表头
for i in range(0, len(datas[0])):
row = 0
col = i
self.sheet1.write(row, col,top[i], self.set_style('Times New Roman', 220, True))
for i in range(0,len(datas)):
row = i+1
col = 0
dictValue = list(datas[i].values())
for colIndex in range(0, len(dictValue)):
col = colIndex
self.sheet1.write(row, col,dictValue[colIndex])
self.sheet1.col(0).width = 15000
self.sheet1.col(1).width = 8000
self.sheet1.col(2).width = 5000
self.f.save('house.xls')
except:
print('持久化失败,请重新开始')
  def grab(self):
url = "https://www.airbnb.cn/s/%E6%B3%89%E5%B7%9E/homes"
print('--------------开始下载')
html = self.getinfo(url)
print('--------------开始解析')
house = self.getHouseInfo(html)
print("成功解析:%s条信息"%len(house))
for i,value in enumerate(house):
print('******** %s ********'%(i+1))
for item in value.items():
print("%s\t:%s"%item)
print('*******************')
# 持久化
self.write_data(house) if __name__ == '__main__':
house = house()
house.grab()
 
 
6.附完整程序代码
 
#  -*- coding: utf-8 -*-

import requests
from bs4 import BeautifulSoup
import records
import time
import chardet
import xlwt # 构造字典
dats = [] class house(object): '''
对象初始化
'''
def __init__(self):
self.f = xlwt.Workbook()
# 给表格新建一个名为 sheer1 的工作簿
self.sheet1 = self.f.add_sheet('sheet1', cell_overwrite_ok=True) '''
#设置表格样式
'''
def set_style(self,name,height,bold=False):
# 创建一个样式对象,初始化样式
style = xlwt.XFStyle()
font = xlwt.Font()
font.name = name
font.bold = bold
font.color_index = 4
font.height = height
style.font = font
return style
'''
持久化
'''
def write_data(self,datas):
if datas is None:
return None
try:
# print(help(self.sheet1.write()))
top = list(datas[0].keys())
# 数据表头
for i in range(0, len(datas[0])):
row = 0
col = i
self.sheet1.write(row, col,top[i], self.set_style('Times New Roman', 220, True))
for i in range(0,len(datas)):
row = i+1
col = 0
dictValue = list(datas[i].values())
for colIndex in range(0, len(dictValue)):
col = colIndex
self.sheet1.write(row, col,dictValue[colIndex])
self.sheet1.col(0).width = 15000
self.sheet1.col(1).width = 8000
self.sheet1.col(2).width = 5000
self.f.save('house.xls')
except:
print('持久化失败,请重新开始') def getinfo(self,url):
# 获取网页数据
try:
#伪装UA
ua = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
#读取网页
r = requests.get(url, headers=ua)
# 获取状态
r.raise_for_status()
# 状态判断
if (r.status_code == 200):
r.encoding = chardet.detect(r.content)["encoding"]
return r.text
return None
except:
return "下载错误" def getHouseInfo(self,html):
'''
获取用户基本信息
'''
# 初始化BeautifulSoup库
soup = BeautifulSoup(html, "html.parser")
# 创建字典
datas = []
# div._1wbi47zw > div._hgs47m > div._10ejfg4u > div._y5sok6 > div._qlq27g > a._okj6x
s = soup.select("div._1wbi47zw > div._hgs47m > div._10ejfg4u > div._y5sok6 > div._qlq27g > a._okj6x")
#循环上面房间数据
for i in s:
# 临时数组
data = {}
# 取出房间名称
name = i.select("div._qrfr9x5")
# 打印
print(str(name[0].get_text()))
# 加入成员
data['房间名称'] = str(name[0].get_text())
#取出房间的tags标签
tags = i.select("span._faldii7")
# 打印
print(str(tags[0].get_text()))
# 标签
data['标签'] = str(tags[0].get_text())
# 打印
print(str(tags[1].get_text()))
# 评分
data['评价'] = str(tags[1].get_text())
# 加入字典
datas.append(data)
# 返回
return datas def grab(self):
url = "https://www.airbnb.cn/s/%E6%B3%89%E5%B7%9E/homes"
print('--------------开始下载')
html = self.getinfo(url)
print('--------------开始解析')
house = self.getHouseInfo(html)
print("成功解析:%s条信息"%len(house))
for i,value in enumerate(house):
print('******** %s ********'%(i+1))
for item in value.items():
print("%s\t:%s"%item)
print('*******************')
# 持久化
self.write_data(house) if __name__ == '__main__':
house = house()
house.grab()
四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?

经过对主题数据的分析与可视化,可以清晰地了解泉州地区的房源位置、面积、装修风格等信息,清楚地看到哪些房源密集度更高,哪些房源面积大。

2.对本次程序设计任务完成的情况做一个简单的小结。

通过对本次程序设计任务完成,对python爬虫有了一定的了解,但是还是需要加强学习,在爬取过程中,对数据清洗、可视化等操作还不够熟练,还需进一步加强学习。

Python高级应用程序设计任务要求的更多相关文章

  1. Python高级应用程序设计任务

    Python高级应用程序设计任务要求 用Python实现一个面向主题的网络爬虫程序,并完成以下内容:(注:每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台) 一.主题式网络爬虫设计方案( ...

  2. Python高级应用程序设计任务期末作业

    Python高级应用程序设计任务要求 用Python实现一个面向主题的网络爬虫程序,并完成以下内容:(注:每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台) 一.主题式网络爬虫设计方案( ...

  3. python 高级之面向对象初级

    python 高级之面向对象初级 本节内容 类的创建 类的构造方法 面向对象之封装 面向对象之继承 面向对象之多态 面向对象之成员 property 1.类的创建 面向对象:对函数进行分类和封装,让开 ...

  4. python高级之函数

    python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没有函数的话,那么将会出现很多 ...

  5. python高级之装饰器

    python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...

  6. python高级之生成器&迭代器

    python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...

  7. python高级之面向对象高级

    python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两种,不像c++中的类有公有成员(pu ...

  8. python高级之网络编程

    python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及其源码分析 1.网络通信概念 说 ...

  9. python高级之多线程

    python高级之多线程 本节内容 线程与进程定义及区别 python全局解释器锁 线程的定义及使用 互斥锁 线程死锁和递归锁 条件变量同步(Condition) 同步条件(Event) 信号量 队列 ...

随机推荐

  1. echars line 底部图例强制不换行(滚动),修改图例样式

    { grid: { left: '5px', right: '10px', top: '10px', bottom: '40px', containLabel: true }, tooltip: { ...

  2. JavaScript中一个对象数组按照另一个数组排序

    JavaScript中一个对象数组按照另一个数组排序 需求:排序 const arr1 = [33, 11, 55, 22, 66]; const arr2 = [{age: 55}, {age: 2 ...

  3. # Spring 练习ioc 、aop

    Spring 练习 通过学习spring的基础知识,了解了Spring为了降低Java开发的复杂性,采取了以下4种关键策略: 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: ...

  4. django--中运行scrapy框架

    1.新建一个django项目, 2.前端展示一个按钮 <form action="/start/" method="POST"> {% csrf_t ...

  5. spring cloud 2.x版本 Spring Cloud Stream消息驱动组件基础教程(kafaka篇)

    本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka-ri ...

  6. Mybatis技术内幕(一)——整体架构概览

    Mybatis技术内幕(一)--整体架构概览 Mybatis的整体架构分为三层,分别是基础支持层.核心处理层和接口层. 如图所示: 一.基础支持层 基础支持层包含整个Mybatis的基础模块,这些模块 ...

  7. 全网趣味网站分享:今日热榜/Pixiv高级搜索/win10激活工具/songtaste复活/sharesome汤不热替代者

    1.回形针手册 由科普类视频节目“回形针PaperClip”近期提出的一个实用百科工具计划,计划名称是回形针手册. 包含了当下科技,农业等等各行各业的各种相关信息,计划刚刚开始! 关于回形针手册的详细 ...

  8. Java开发桌面程序学习(12)——Javafx 悬浮窗提示 tooptip

    Javafx 悬浮窗提示 tooptip 鼠标悬浮在某个控件,弹出提示,效果如下: 代码: //control是某个控件 Tooltip.install(control, new Tooltip(&q ...

  9. JQuery操作attr、prop、val()/text()/html()、class属性

    1.1 arr操作   设置单个属性 // 第一个参数:需要设置的属性名 // 第二个参数:对应的属性值 // $obj.attr(name, value); // 用法举例. $('img').at ...

  10. crm-2

    1.分页 web必备的功能 1)批量制造测试数据 定义一个空列表用于存储 orm对象 ,models.表名(字段=...)创建orm对象append到列表 ,使用bulk_create(对象列表)一次 ...