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. leetcode 752. 打开转盘锁

    地址 https://leetcode-cn.com/problems/open-the-lock/ 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', ...

  2. Please make sure you have the correct access rights and the repository exists.

    参考:https://blog.csdn.net/jingtingfengguo/article/details/51892864,感谢老哥. 从码云克隆项目到新的服务器上,报错: Please ma ...

  3. Python 相对路径和绝对路径--python实战(九)

    一 背景信息 最近在运行python程序的过程中,无意遇到了这个一个问题,在同事那边一直执行ok的程序,到我这里怎么都有个错误,当初报的错误是这样的: FileNotFoundError: [Errn ...

  4. IT兄弟连 HTML5教程 HTML5的曲折发展过程 HTML5的诞生

    十年磨一剑,正如我们所看到的一样,HTML5大潮正来势汹汹.但也正如我们所知道的一样,HTML5是一种技术标准,它的语义之美.人性之美.简单之美.实用之美……如同一场革命,它的主要应用场景是浏览器,不 ...

  5. 层级轮播图(animate)

    层级轮播图(animate) css <style type="text/css"> * { margin: 0; padding: 0; } ul, ol { lis ...

  6. STN(Spatial Transformer Networks)

    url: https://arxiv.org/abs/1506.02025 year:2015 blog: https://kevinzakka.github.io/2017/01/10/stn-pa ...

  7. hive on spark 常用配置

    常用设置 reset; set hive.execution.engine=spark; set hive.map.aggr = false; set hive.auto.convert.join = ...

  8. http服务源码分析

    多读go的源码,可以加深对go语言的理解和认知,今天分享一下http相关的源码部分 在不使用第三方库的情况下,我们可以很容易的的用go实现一个http服务, package main import ( ...

  9. Serlvet、JSP和JSTL的联系

    没有无缘无故的爱和恨,没有无缘无故的编程 前言: 想这世间,没有无缘无故的爱,也没有无缘无故的恨,一切都有有原因的,我想编程亦是如此,技术时常更新,程序员时常学习,随着时间的推移,程序员发际线的增高, ...

  10. [IDA] 将变量索引进行计算

    按 k 键 [ebp+var+arg_0] - > [ebp+value]