栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python小组项目说明

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python小组项目说明

小组分工:李鹏博 代码;刘晨 项目说明报告; 钱增 展示

总体思路:分别编写函数来获取楼房信息:区域名、楼盘名称、具体地址、类型、售卖状态、房屋户型特点,评分、评价数、价格以及联系电话。最后再调用以上函数将其信息存于csv文件。

首先应项目要求,我们需要用到requests库于请求网页,csv库于保存信息于文件,bs4库于解析标签代码。

import requests
import csv
from bs4 import BeautifulSoup

随后以函数的形式来进行程序的编写。

Part1:获取区域名

def Quyuname(url):
    """
    获取所在省市的各区域名
    :param url:
    :return quyunamelist:
    """
    response = requests.get(url)
    page = BeautifulSoup(response.text,"html.parser")
    mainpart = page.find("li", id="quyu_name")
    quyuname = mainpart.find_all("a")[1:]
    quyunamelist = {}
    for h in quyuname:
        quyunamelist[h.text] = []
    return quyunamelist

首先调用requests库向网页发起请求并将内容存为response;接着调用bs4库将上述获得的名为response.text的文档进行解析,这里的html.parser是解析文档时所用的解析器。然后运用bs4中的find()语法匹配指定标签为“li”框架下属性为id=“quyu_name”的内容存于mainpart。接着用find_all()匹配“a”标签并将其后的区域名存入quyuname(find_all自动返回列表类型)。最后遍历quyuname将其存入字典中。

Part2:获取各楼盘所在区域和具体地址

def addrs(i):
    """
    获取单一楼盘所在区域和具体地址
    :param i:
    :return address,Address:
    """
    addrerss = i.find("div", class_="address").find("a")
    try:
        address = addrerss.find("span",class_="sngrey").text.replace("t","").replace("n","").strip("[").strip("]")
        Address = addrerss["title"]
    except:
        Address = addrerss["title"]
        address = addrerss.text.replace("t","").split("]")[0].replace("t","").replace("n","").strip("[").strip("]")
    address1 = [address, Address]
    print(address1)
    return address1

首先查询属性class_= “address”的标签“div”,嵌套find()查找标签“a”生成列表addrerss。关于这里为什么要用try except,是因为该网站关于房源地址的源代码有多种书写格式,有些文本需要用另一套方法去修改才能得到一致的文本排版格式。最后将得到的房源所在的区域名和具体地址存入列表。

Part3:获取楼盘名称

def names(i):
    """
    获取楼盘名
    :param i:
    :return Name:
    """
    name = i.find("div", class_="nlcd_name")
    Name = name.text.strip()
    return Name

与前几个步骤相同,find()获取对应信息并提取,然后用strip()去除文本前后空格。

Part4:获取楼盘类型

def types(i):
    """
    获取楼盘类型
    :param i:
    :return Type:
    """
    type = i.find("div", class_="house_type clearfix")
    Type = type.text.replace("t", "").replace("n", "")
    return Type

find()获取对应信息并提取,然后再按照所需格式对文本进行修改,如上述将一些提取到的文本中含空格或换行的字符替换。

Part5:获取楼盘状态

def situations(i):
    """
    获取楼盘状态
    :param i:
    :return Situation:
    """
    situtation = i.find("div", class_="fangyuan").find("span").text
    Situtation = situtation.replace("t", "").replace("n", "")
    return Situtation

find()获取相应信息,再对文本进行修改处理。

Part6:获取楼盘特点

def charas(i):
    """
    获取楼盘特点
    :param i:
    :return Chara:
    """
    Chara = []
    chara = i.find("div", class_="fangyuan").find_all("a")
    for n in chara:
        Chara.append(n.text)
    if len(Chara) == 0:
        Chara = "无相关信息"
    return Chara

find()获取相应信息,在对文本进行修改处理。由于某些房源此处没有信息,所以添加一个if条件,当无房源特点时,输出“无相关信息”。 

Part7:获取楼盘评分

def rates(i):
    """
    获取楼盘评分
    :param i:
    :return Rate:
    """
    rate1 = len(i.find("ul", class_="star_group").find_all("li", class_="orange-star"))
    rate2 = len(i.find("ul", class_="star_group").find_all("li", class_="half-star"))
    rate = 0.5 * rate2 + rate1
    Rate = "评分:" + str(rate)
    return Rate

  获取网页信息后,如上图网页源代码中的绿色字体所述,按照这个公式对房源进行一个评分。

Part8:获取楼盘价格

def prices(i):
    """
    获取楼盘价格
    :param i:
    :return Price:
    """
    try:
        Price = i.find("div", class_="nhouse_price").text.replace("t", "").replace("n", "")
    except:
        Price = i.find("div", class_="kanesf").text.replace("t", "").replace("n", "")
    return Price

ps:有些楼盘无价格或未取得预售证。

 Part9:获取楼盘联系方式

def tels(i):
    """
    获取楼盘联系方式
    :param i:
    :return Tel:
    """
    try:
        Tel = i.find("div", class_="tel").text.replace("t", "").replace("n", "")
    except:
        Tel = "无电话号码"
    return Tel

 获取后对于文本进行修改处理。由于部分房源没有联系电话,所以当没有电话时返回“无电话号码”。

Part10:获取评论数

def coms(i):
    """
    获取评论数
    :param i,quyu:
    :return Comment:
    """
    Comment = i.find("span", class_="value_num").text.replace("t", "").replace("n", "")
    return Comment

Part11:房屋信息整合

def details(quyunamelist,Name, Address, Type, Situation, Chara, Rate, Comment, Price, Tel):
    if Type == "":
        detail = [Name, Address[1], "未知", Situation, Chara, Rate, Comment, Price, Tel]
    else:
        detail = [Name, Address[1], Type, Situation, Chara, Rate, Comment, Price, Tel]
    try:
        quyunamelist[Address[0]].append(detail)
    except:
        pass

 此部分函数将上述函数的返回值整合起来并存入字典。由于某些房屋类型未知,此处用if else处理。Address默认为列表,Address[0]是区域,Address[1]是具体地址。运用try将其同一区域的房源放在一起,由于有些房源没有所属区域,直接跳过。

Part12:将房屋信息写入文件

def writecsv(file,quyu):
    """
    写入csv文件当中
    :param file:
    :return:
    """
    f = open(file, mode="w", encoding="utf-8")
    csvwriter = csv.writer(f)
    headerlist = ["区域", "楼盘名", "具体地址", "类型", "状态", "特点", "评分", "评价人数", "价格", "联系电话"]
    csvwriter.writerow(headerlist)
    for key, value in quyu.items():
        if len(value) == 0:
            csvwriter.writerow(
                [key, "本地区没有相关信息", "本地区没有相关信息", "本地区没有相关信息", "本地区没有相关信息", "本地区没有相关信息", "本地区没有相关信息", "本地区没有相关信息",
                 "本地区没有相关信息", "本地区没有相关信息"])
        else:
            for o in value:
                csvwriter.writerow([key, o[0], o[1], o[2], o[3], o[4], o[5], o[6], o[7], o[8]])
    f.close()

此处编写函数将房源信息存于csv文件。用到csv库相关语法进行书写。

Part13:调用上述函数

def main():
    """
    爬取楼盘主要信息
    :return:
    """
    quyu = Quyuname(url)
    for k in range(1, 39):
        newurl = "https://newhouse.fang.com/house/s/b9" + str(k)
        response1 = requests.get(newurl)
        page1 = BeautifulSoup(response1.text, "html.parser")
        mainpart1 = page1.find_all("div", class_="nlc_details")
        for i in mainpart1:
            details(quyu,names(i),addrs(i), types(i), situations(i), charas(i), rates(i), coms(i), prices(i), tels(i))
    writecsv(file,quyu)
file = '北京各区楼盘信息.csv'
url = "https://newhouse.fang.com/house/s/"
main()
print("scrapying is over")

最有编写主程序main()调用上述函数。将1-38页的房源信息一一遍历处理写入文件。

最后结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/993840.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号