2021-05-14

                                                                                                    安居客python二手房数据采集

一:对采集数据进行分析

1.这是打开网页的一级页面。对其中的数据进行分析

其中的小区名称,户型,总面积,朝向这些数据都是我们要进行爬取的,诸如此类,可以提取相关的信息。

 

2.打开二级页面。发现还有一些数据可以进行爬取

这些房源信息也是我们需要爬取的,还有相应的房屋唯一编码,方便我们对后续的数据进行预处理以及可视化分析

通过这些整理处理的数据表结构是这样的:编号;区县;片区;小区名称;房屋单价;房屋总价;户型;面积;朝向;装修;建设时间;房屋属性;用途;产权;产权时间;唯一住房;中介公司;挂牌时间;楼层位置;楼层数;首付;月供

 

二:对数据进行爬取

爬取数据我们要用到python的requests库和beautifulsoup还有re

1.用requests库获取网页链接

url = “https://beijing.anjuke.com/sale/”

我们要爬取多页的数据,通过对url进行分析发现网页链接有规律,可以用for循环对网页链接进行一个拼接

如下:strurl = “https://beijing.anjuke.com/sale/p” + str(i)

获取到网页链接后传入下一个参数,用requests库的get方法获取相应网页的text信息,方便后续的数据提取

 

2.通过对网页内容的分析发现,可以用beautifulsoup来获取二级页面的网页链接,查找相应的a标签中href属性

如下:

代码如下: soup = BeautifulSoup(content,"html.parser")     #html.parser是一个网页解析器
     ultags = soup.find("section",class_="list")                        #find和find_all是beautifulsoup的两个查询方法
     dict = {"tongji_tag":"fcpc_ersflist_gzcount","class":"property"}
     litags = ultags.find_all("div",dict)
     for litag in litags:
         detailUrl = litag.find("a")["href"]
         print(detailUrl)

 

3.对链接处理完之后,把这些获取的text传入相应的网页数据获取的函数中

按f12可以发现网页的编写格式以及我们需要获取的网页数据在哪一个节点

对一个数据进行爬取,代码如下:  bianhao = soup.find("div",class_="banner-title-code").getText()  #getText是为了获取文本内容

诸如此类,可以获取到我们需要的数据。

需要注意的是,我们需要打开一个text,把我们的爬取的数据放到一个文本文档中。

如下:   f = open("安居客.txt", mode="a+", encoding="utf-8")

需要用append把我们的爬取数据添加到text中,例:  contentlist.append(bianhao) #contentlist = [ ] 是我们定义的一个空列表,方便我们存爬取数据

重点!!!!!!

(1)                                                                                                                                              (2)

发现有的有唯一住房,有的没有唯一住房,这是我们需要进行对数据进行处理。代码如下:

 

labelTags = soup.find_all("span", class_="houseInfo-main-item-label")
    nameTags = soup.find_all("span", class_="houseInfo-main-item-name")
    if len(labelTags) == len(nameTags):
        labelDict = {}
        for i in range(0, len(labelTags)):
            lable = labelTags[i].getText().replace("\n","")
            name = nameTags[i].getText().replace("\n", "")
            labelDict[lable] = name

        contentlist.append("" if labelDict.get("产权性质") == None else labelDict.get("产权性质"))
        contentlist.append("" if labelDict.get("物业类型") == None else labelDict.get("物业类型"))
        contentlist.append("" if labelDict.get("产权年限") == None else labelDict.get("产权年限"))
        contentlist.append("" if labelDict.get("房本年限") == None else labelDict.get("房本年限"))
        contentlist.append("" if labelDict.get("唯一住房") == None else labelDict.get("唯一住房"))
        contentlist.append("" if labelDict.get("参考预算") == None else labelDict.get("参考预算"))
        contentlist.append("" if labelDict.get("发布公司") == None else labelDict.get("发布公司"))
        contentlist.append("" if labelDict.get("发布时间") == None else labelDict.get("发布时间"))

    strLine = ";".join(contentlist) + "\n"

 

最后爬取数据的结果是这样的:

房屋编码:1904398733534217;龙泉驿;航天片区;御岭春天;11821.0元/㎡;95 万 ;2室2厅1卫;中层(共26层);80.37㎡ ;南;毛坯;2014年竣工/普通住宅            ;商品房住宅;普通住宅;70年产权;满二年;;首付28万,月供3529.33元;永好房产;2021-3-13
房屋编码:1932842576108553;彭州;彭州城区;置信逸都丹郡A区;9955.0元/㎡;88 万 ;2室2厅1卫;中层(共26层);88.4㎡ ;南北;精装修;2012年竣工/普通住宅            ;商品房住宅;普通住宅;70年产权;满五年;;首付26万,月供3269.28元;星业房地产;2021-4-2
房屋编码:1932379485757448;龙泉驿;航天片区;御岭春天;11717.0元/㎡;94.9 万 ;2室2厅1卫;中层(共26层);81㎡ ;南北;毛坯;2014年竣工/普通住宅            ;商品房住宅;普通住宅;70年产权;满五年;是;首付28万,月供3525.62元;北美地产;2021-4-2
房屋编码:1932515569459202;新都;石油大学;我的大学;11760.0元/㎡;99 万 ;2室2厅1卫;中层(共27层);84.19㎡ ;南北;精装修;2009年竣工/普通住宅            ;商品房住宅;普通住宅;70年产权;满二年;;首付29万,月供3677.94元;大唐房屋;2021-4-2
房屋编码:1943849909787655;新都;新都老城区;桂湖名城;12099.0元/㎡;98 万 ;2室2厅1卫;中层(共26层);81㎡ ;南北;精装修;2015年竣工/普通住宅            ;商品房住宅;普通住宅;70年产权;满二年;;首付29万,月供3640.79元;众诚房产;2021-4-10
房屋编码:1950821116945411;新都;新都老城区;桂湖名城;12099.0元/㎡;98 万 ;2室2厅1卫;中层(共26层);81㎡ ;南北;精装修;2016年竣工/普通住宅            ;商品房住宅;普通住宅;70年产权;满二年;;首付29万,月供3640.79元;大唐房屋;2021-4-15

这样我们的爬取过程就结束了

源代码如下:

import requests
from bs4 import BeautifulSoup
import re

headDict = {
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42"
}

def parsershouse(webcontent):
    soup = BeautifulSoup(webcontent,"html.parser")
    f = open("安居客.txt", mode="a+", encoding="utf-8")
    contentlist = []
    bianhao = soup.find("div",class_="banner-title-code").getText()
    jiegou = soup.find("div",class_="maininfo-model-strong").getText()
    louceng = soup.find("div",class_="maininfo-model-weak").getText()
    mianji = soup.find("div",class_="maininfo-model-item maininfo-model-item-2").find("div",class_="maininfo-model-strong").getText()
    zhuangxiu = soup.find("div",class_="maininfo-model-item maininfo-model-item-2").find("div",class_="maininfo-model-weak").getText()
    chaoxiang = soup.find("div",class_="maininfo-model-item maininfo-model-item-3").find("i",class_="maininfo-model-strong-text").getText()
    zhuzhai = soup.find("div",class_="maininfo-model-item maininfo-model-item-3").find("div",class_="maininfo-model-weak").getText().replace("\n","")
    jiage = soup.find("div",class_="maininfo-price").find("div",class_="maininfo-price-wrap").getText()
    danjia = soup.find("div",class_="maininfo-avgprice").find("div",class_="maininfo-avgprice-price").getText().replace("\n","").replace(" ","")
    div2 = soup.find_all("div",class_="maininfo-community-item")
    dizhi1 = div2[0].getText().replace("所属小区","").replace("地理位置","").replace("\n","").replace(" ","")
    dizhi2 = div2[1].getText().replace("所属区域","").replace("\n","")
    results = re.findall("([\u4e00-\u9fa5]+)", dizhi2)
    area = results[0] if len(results)>0 else "未知"
    dizhi3 = results[1] if len(results) > 1 else "未知"
    contentlist.append(bianhao)
    contentlist.append(area)
    contentlist.append(dizhi3)
    contentlist.append(dizhi1)
    contentlist.append(danjia)
    contentlist.append(jiage)
    contentlist.append(jiegou)
    contentlist.append(louceng)
    contentlist.append(mianji)
    contentlist.append(chaoxiang)
    contentlist.append(zhuangxiu)
    contentlist.append(zhuzhai)

    labelTags = soup.find_all("span", class_="houseInfo-main-item-label")
    nameTags = soup.find_all("span", class_="houseInfo-main-item-name")
    if len(labelTags) == len(nameTags):
        labelDict = {}
        for i in range(0, len(labelTags)):
            lable = labelTags[i].getText().replace("\n","")
            name = nameTags[i].getText().replace("\n", "")
            labelDict[lable] = name

        contentlist.append("" if labelDict.get("产权性质") == None else labelDict.get("产权性质"))
        contentlist.append("" if labelDict.get("物业类型") == None else labelDict.get("物业类型"))
        contentlist.append("" if labelDict.get("产权年限") == None else labelDict.get("产权年限"))
        contentlist.append("" if labelDict.get("房本年限") == None else labelDict.get("房本年限"))
        contentlist.append("" if labelDict.get("唯一住房") == None else labelDict.get("唯一住房"))
        contentlist.append("" if labelDict.get("参考预算") == None else labelDict.get("参考预算"))
        contentlist.append("" if labelDict.get("发布公司") == None else labelDict.get("发布公司"))
        contentlist.append("" if labelDict.get("发布时间") == None else labelDict.get("发布时间"))

    strLine = ";".join(contentlist) + "\n"
    print(strLine)
    f.write(strLine)
    f.close()

def parsercontent(content):
     soup = BeautifulSoup(content,"html.parser")
     ultags = soup.find("section",class_="list")
     dict = {"tongji_tag":"fcpc_ersflist_gzcount","class":"property"}
     litags = ultags.find_all("div",dict)
     for litag in litags:
         detailUrl = litag.find("a")["href"]
         print(detailUrl)
         code, content = urlcontent(detailUrl)
         if code != 200:
             continue
         parsershouse(content)


def downurl():
    for i in range(1, 101):
        strUrl = "https://chengdu.anjuke.com/sale/p" + str(i)
        print(strUrl)
        code, content = urlcontent(strUrl)
        if code != 200:
            continue
        parsercontent(content)


def urlcontent(url):
    r = requests.get(url,headers=headDict)
    r.encoding = r.apparent_encoding
    print(r.status_code)
    return r.status_code, r.text


if __name__ == "__main__":
    downurl()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值