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. 02. Go 语言基本语法

    Go语言基本语法 变量.数据类型和常量是编程中最常见,也是很好理解的概念.本章将从 Go 语言的变量开始,逐步介绍各种数据类型及常量. Go 语言在很多特性上和C语言非常相近.如果读者有C语言基础,那 ...

  2. Linux设备树文件结构与解析深度分析

    Copy from :https://blog.csdn.net/woyimibayi/article/details/77574736 正文开始 1. Device Tree简介 设备树就是描述单板 ...

  3. HTML5之图片转base64编码

    之前在群里看到很多小哥哥小姐姐讨论关于图片base64互转的方法,刚好我之前用到的一个方法给大家分享一下. <!Doctype html><html> <head> ...

  4. 【raid级别】RAID级别工作模式

    友情链接 磁盘分区,格式化,挂载,创建交换分区:https://www.cnblogs.com/HeiDi-BoKe/p/11936998.html RAID工作级别:https://www.cnbl ...

  5. 史上最全HashMap遍历方式

    java Hashmap Map TreeMap 的几种遍历方式,全网最全,全网最强 package Collec2; import java.util.HashMap; import java.ut ...

  6. web自动化针对PO模式进行二次封装之basepage

    在PO模式当中,我们做到了页面对象与测试用例的分离,但在页面对象编写时,我们仍然还有优化的空间.页面对象有一些共同的基本操作,可以封装起来,并可以在基本操作当中加上日志和异常截图的处理.比如说我们在查 ...

  7. RaiseException函数逆向

    书中内容: 代码逆向: 存在一个疑问:为什么在ExceptionAddress本来是错误产生代码的地址,但这里给存入一个_RaiseException的偏移地址. 答案在下个函数中:rtlRaiseE ...

  8. 训练DQN,报错:OSError: [Errno 12] Cannot allocate memory

    训练DQN,报错:OSError: [Errno 12] Cannot allocate memory 问题介绍: 这两天在做强化学习的作业,使用 DQN 打 Atari 游戏,但在训练过程中,出现了 ...

  9. SpringBoot2使用Jetty容器(替换默认Tomcat)

    https://blog.csdn.net/hanchao5272/article/details/99649252   Jetty和tomcat的比较 Tomcat和Jetty都是一种Servlet ...

  10. 在Vue中使用i18n 国际化遇到 Uncaught TypeError: Cannot assign to read only property 'exports' of object '#<Object>'

    最近用Vue在搭建前端框架,在引用i18n时,运行的时候报错:Uncaught TypeError: Cannot assign to read only property 'exports' of ...