【数据采集】不到十行核心代码实现房产数据抓取

背景

从去年开始大湾区、豪宅税的取消、行示范区的概念,深圳房地产市场可谓是红红火火,未买房的刚需瑟瑟发抖。现在经历过疫情影响深圳房价市场到底如何了?那么写个小爬虫爬取下链家网站,大致了解下当下深圳房市的整体情况。

因为网站主要是js动态渲染,因此普通的http请求获取不到动态数据,这里主要采用selenium ,selenium技术是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,支持大多数常见的浏览器。
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。

废话不多说直接上源代码,大家也可以直接通过附件下载源代码跑一跑数据。

from selenium import webdriver
from lxml import html

base="https://sz.lianjia.com"
fileObject = open('sampleListnanshan.txt', 'w')

browser = webdriver.Chrome("/Users/house/Downloads/chromedriver")

datasets = []

def get_singel_cummunity_data(community):
    datas=""
    try:
        browser.get(community)
        innerHTML = browser.execute_script("return document.body.innerHTML")
        trees = html.fromstring(innerHTML)
        result_name = trees.xpath('//*[@id="sem_card"]/div/div[1]/div[1]/div/a[1]/text()')  # 小区名
        result_number = trees.xpath('//*[@id="sem_card"]/div/div[1]/div[2]/div[4]/div[2]/text()')  # 带看数据
        mean_price = trees.xpath('//*[@id="sem_card"]/div/div[1]/div[2]/div[1]/a/text()')  # 小区均价
        days90 =      trees.xpath('//*[@id="sem_card"]/div/div[1]/div[2]/div[3]/a/text()')  # 近90天成交
        onsale =     trees.xpath('//*[@id="sem_card"]/div/div[1]/div[2]/div[2]/div[2]/text()')  # 小区在售
        print(""+result_name[0]+",近30天带看:"+result_number[0]+",均价:"+mean_price[0]+"近90天成交:"+days90[0]+",在售套数:"+onsale[0])
        datas= ""+result_name[0]+","+result_number[0]+","+mean_price[0]+","+days90[0]+","+onsale[0]
        return datas 
    except:
        print("this community dataset get error"+str(community))
    #return  datasets

## 获取区域里面的小区
def get_all_communites_by_region(region):
    browser.get(region)
    innerHTML = browser.execute_script("return document.body.innerHTML")
    tree = html.fromstring(innerHTML)
    communities = tree.xpath('/html/body/div[4]/div[1]/ul/li/div[2]/div/a/@href')  # 获取某个片区数据
    #小区列表页
    return communities

## 获取某个区的街道办
def get_all_regions_by_district(district):
    browser.get(district)
    innerHTML = browser.execute_script("return document.body.innerHTML")
    tree = html.fromstring(innerHTML)
    regions = tree.xpath('/html/body/div[3]/div[1]/dl[2]/dd/div/div[2]/a/@href')  # 获取所有区下面的区域
    return regions

2
## 获取深圳所有的小区
url='https://sz.lianjia.com/xiaoqu/' #需要爬数据的网址
def get_all_districts(url):
    browser.get(url)
    innerHTML = browser.execute_script("return document.body.innerHTML")
    tree = html.fromstring(innerHTML)
    districts = tree.xpath('/html/body/div[3]/div[1]/dl[2]/dd/div/div[1]/a/@href')  # 获取所有区
    print(districts)
    return districts

#burl='https://sz.lianjia.com/xiaoqu/baoanqu/' #需要爬数据的网址
#furl='https://sz.lianjia.com/xiaoqu/futianqu/' #需要爬数据的网址
nurl='https://sz.lianjia.com/xiaoqu/nanshanqu/' #需要爬数据的网址
#luohuurl='https://sz.lianjia.com/xiaoqu/luohuqu/' #需要爬数据的网址

#strict=get_all_districts(url) #可以抓取深圳所有区的链接
#print("深圳的所有区"+str(strict))

districts=['https://sz.lianjia.com/xiaoqu/nanshanqu/']
datasets = [] #存储每个小区信息的数组
regions=get_all_regions_by_district(nurl)


for region in regions:
    datasets.append(region)
    communities=[]
    if region.startswith(base):
        communities=get_all_communites_by_region(region)
    else:
        communities=get_all_communites_by_region(base+region)

    datas="" # 某个小区数据
    for community in communities:
        if community.startswith(base):
            datas=get_singel_cummunity_data(community)
        else:
            datas=get_singel_cummunity_data(base+community)

        datasets.append(datas)


for ip in datasets:
    fileObject.write(ip)
    fileObject.write('\n')
fileObject.close()

browser.close()
 

运行结果:

在这里插入图片描述
主要采集了每个小区近30天带看次数,均价,近90天成交套书,以及在售套数。

关键点解析:

1、浏览器指定

browser = webdriver.Chrome("/Users/house/Downloads/chromedriver")
这块要替换成自己电脑浏览器执行文件路径,也可以选择其它浏览器去执行抓取,chrome注意要下载对应的的执行文件,https://www.cnblogs.com/EthanHe97/p/11270528.html
2、页面Xpath解析抽取
在这里插入图片描述
如上图通过定位对应的字段copy xpath 就可以 获取里面的内容 如

onsale = trees.xpath(’//*[@id=“sem_card”]/div/div[1]/div[2]/div[2]/div[2]/text()’)#
具体xpath规则可以自行google。
结果图

在这里插入图片描述

根据南山区爬行的结果,统计成图标如上图,Y轴是带看次数,x轴是价格,可以看出带看多的 还是便宜的房子。
这里只是简单的采集了每个小区的部分数据,数据输出到一个txt文件当中可以大致看到每个片区链家上的带看、销售情况,大致判断出哪些片区比较火,哪些楼盘价格低等信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章