Python高级应用程序设计任务

一、主题式网络爬虫设计方案(15分)
 
1.主题式网络爬虫名称
链家租房信息爬取

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

爬取泉州地区一居租房的信息

爬取页面+存取数据

3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
request库爬取网页信息,Beautifulsoup格式化页面输出, 
取对应的标签数据放入txt中作持久化,读取函数从txt中读取数据进行观察。
 
 
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征
Python高级应用程序设计任务_第1张图片

 

 


2.Htmls页面解析
Python高级应用程序设计任务_第2张图片
选取已加载好的网页数据进行爬取,分别取对应的标签数据。

3.节点(标签)查找方法与遍历方法
(必要时画出节点树结构)
find_all查找方法
for..in..遍历方法
 
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集
#爬取链家html页面
def gethtml(url):
    #请求头伪装
    kv = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    #判断是否异常
    try:
        #timeout设置延时
        data = requests.get(url, headers=kv, timeout=10)
        #判断页面是否爬取成功
        data.raise_for_status()
        # 使用HTML页面内容中分析出的响应内容编码方式
        data.encoding = data.apparent_encoding
        #返回页面内容
        return data.text
    except:
        #如果爬取失败,返回“爬取失败”
        return "爬取失败"

 

2.对数据进行清洗和处理
#获取房屋地点
def gethouse(pages):
    house = []
    for page in range(1, pages+1):
        #获取信息的目标url
        url = 'https://quanzhou.lianjia.com/zufang/pg{}10'.format(page)
        html = gethtml(url)
        #页面格式化
        soup = BeautifulSoup(html, 'html.parser')
        ptag = soup.find_all("p", attrs="content__list--item--des")
        for tag in ptag:
            hous = tag.find_all('a')[2].text
            house.append(hous)
    return house
       ptag = soup.find_all("p", attrs="content__list--item--title twoline")
        for tag in ptag:
            url = 'https://quanzhou.lianjia.com' + tag.a.attrs['href']
            urls.append(url)
    return urls
        span = soup.find_all('span', attrs='content__list--item-price')
        for tag in span:
            price = tag.find_all('em')[0].contents
            prices.append(int(price[0]))
    return prices

Python高级应用程序设计任务_第3张图片

 

 

 


3.文本分析(可选):jieba分词、wordcloud可视化
4.数据分析与可视化
#读取文件
def read_file():
    lines = []
    #读出编码格式为utf-8
    f = open(r"C:\lianjia\quanzhou.txt", "r", encoding='utf-8')
    #读取一行
    line = f.readline()
    #循环
    while line:
        print(line, end="")
        line = f.readline()
        lines.append(line)
    f.close()
    sorted(lines)
    return lines
Python高级应用程序设计任务_第4张图片

 

 


(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)
    # 获取房屋列表
    houselist = gethouse(3)
    # 获取房屋价格列表
    pricelist = getprice(3)
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    s = pd.Series(pricelist[0:6],houselist[0:6])
    # 设置图表标题
    s.plot(kind='bar', title='6个房屋价格的对比')
    # 输出图片
    plt.show()

 

Python高级应用程序设计任务_第5张图片

 

 


 5.数据持久化
# 数据持久化存入new_move_list.txt
def saveData(houselist, urllist, pricelist):
    try:
        # 创建新文件夹
        os.mkdir("C:\lianjia")
        print("创建文件夹成功")
    except:
        # 如果文件夹存在则提示
        "文件夹已存在"
        # 在新目录下创建文件用于存储爬取到的数据
        #写入格式为utf-8
    with open("C:\\lianjia\\quanzhou.txt", "w", encoding='utf-8') as f:
        #填入标题名称
        title = '房屋地点' + '  ' + '月租金' + '   ' + '链接' + '\n'
        f.write(title)
        for i in range(len(houselist)):
            info = houselist[i] + '  ' + str(pricelist[i]) + '   ' + urllist[i] + '\n'
            f.write(info)
        print("存储成功")

Python高级应用程序设计任务_第6张图片

 

 

 6.附完整程序代码
import requests, re, os
import pandas as pd
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
import pandas as pd


#爬取链家html页面
def gethtml(url):
    #请求头伪装
    kv = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    #判断是否异常
    try:
        #timeout设置延时
        data = requests.get(url, headers=kv, timeout=10)
        #判断页面是否爬取成功
        data.raise_for_status()
        # 使用HTML页面内容中分析出的响应内容编码方式
        data.encoding = data.apparent_encoding
        #返回页面内容
        return data.text
    except:
        #如果爬取失败,返回“爬取失败”
        return "爬取失败"


#获取房屋地点
def gethouse(pages):
    house = []
    for page in range(1, pages+1):
        #获取信息的目标url
        url = 'https://quanzhou.lianjia.com/zufang/pg{}10'.format(page)
        html = gethtml(url)
        #页面格式化
        soup = BeautifulSoup(html, 'html.parser')
        ptag = soup.find_all("p", attrs="content__list--item--des")
        for tag in ptag:
            hous = tag.find_all('a')[2].text
            house.append(hous)
    return house


#获取房屋页面链接
def geturl(pages):
    urls = []
    for page in range(1, pages+1):
        #获取信息的目标url
        url = 'https://quanzhou.lianjia.com/zufang/pg{}10'.format(page)
        html = gethtml(url)
        #页面格式化
        soup = BeautifulSoup(html, 'html.parser')
        ptag = soup.find_all("p", attrs="content__list--item--title twoline")
        for tag in ptag:
            url = 'https://quanzhou.lianjia.com' + tag.a.attrs['href']
            urls.append(url)
    return urls


# 获取房屋价格
def getprice(pages):
    prices = []
    for page in range(1, pages + 1):
        # 获取信息的目标url
        url = 'https://quanzhou.lianjia.com/zufang/pg{}10'.format(page)
        html = gethtml(url)
        # 页面格式化
        soup = BeautifulSoup(html, 'html.parser')
        span = soup.find_all('span', attrs='content__list--item-price')
        for tag in span:
            price = tag.find_all('em')[0].contents
            prices.append(int(price[0]))
    return prices


# 数据持久化存入new_move_list.txt
def saveData(houselist, urllist, pricelist):
    try:
        # 创建新文件夹
        os.mkdir("C:\lianjia")
        print("创建文件夹成功")
    except:
        # 如果文件夹存在则提示
        "文件夹已存在"
        # 在新目录下创建文件用于存储爬取到的数据
        #写入格式为utf-8
    with open("C:\\lianjia\\quanzhou.txt", "w", encoding='utf-8') as f:
        #填入标题名称
        title = '房屋地点' + '  ' + '月租金' + '   ' + '链接' + '\n'
        f.write(title)
        for i in range(len(houselist)):
            info = houselist[i] + '  ' + str(pricelist[i]) + '   ' + urllist[i] + '\n'
            f.write(info)
        print("存储成功")


#读取文件
def read_file():
    lines = []
    #读出编码格式为utf-8
    f = open(r"C:\lianjia\quanzhou.txt", "r", encoding='utf-8')
    #读取一行
    line = f.readline()
    #循环
    while line:
        print(line, end="")
        line = f.readline()
        lines.append(line)
    f.close()
    sorted(lines)
    return lines


def main():
    # 自定义爬取页数
    pages = 3
    #获取房屋链接列表
    urllist = geturl(pages)
    #获取房屋列表
    houselist = gethouse(pages)
    #获取房屋价格列表
    pricelist = getprice(pages)
    #保存数据
    saveData(houselist, urllist, pricelist)
    #读取数据
    read_file()


if __name__ == '__main__':
    main()
    #图形化界面
    # 获取房屋列表
    houselist = gethouse(3)
    # 获取房屋价格列表
    pricelist = getprice(3)
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    s = pd.Series(pricelist[0:6],houselist[0:6])
    # 设置图表标题
    s.plot(kind='bar', title='6个房屋价格的对比')
    # 输出图片
    plt.show()

 

 

四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?
从选取的6个房屋的租金对比,可以得出结论紫湖山庄和中骏四季花城2期的租金相对较低些,而金圣豪园就相对较高些。
2.对本次程序设计任务完成的情况做一个简单的小结。
通过这次的网站爬取任务,可以发现自己的诸多问题,遇到只有多花时间去理解,不懂得网上查资料跟同学交流是最好的办法,
要学的东西还有很多,只有自己亲历亲为经历过才会有不一样的收获,希望自己可以一直保持正确的学习态度,才能不断进步。

你可能感兴趣的:(Python高级应用程序设计任务)