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

Posted 黑猫dd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python高级应用程序设计任务要求相关的知识,希望对你有一定的参考价值。

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高级应用程序设计任务要求的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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