背景
从去年开始大湾区、豪宅税的取消、行示范区的概念,深圳房地产市场可谓是红红火火,未买房的刚需瑟瑟发抖。现在经历过疫情影响深圳房价市场到底如何了?那么写个小爬虫爬取下链家网站,大致了解下当下深圳房市的整体情况。
因为网站主要是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文件当中可以大致看到每个片区链家上的带看、销售情况,大致判断出哪些片区比较火,哪些楼盘价格低等信息。