数据挖掘分析租售比
场景:
前几个周末看到一个租售比的数据,于是自己花了一个周末的时间写了个python程序,从链家上爬宁波市区的数据进行分析。
解决:
主要思路是这样的:利用Selenium、WebDriver模拟用户在链家上的操作,爬取网页上的租房、二手房的数据(目前只写了这两部分),然后保存在本地。在用python进行对应的数据分析。
一些结果图如下:爬取网页上标题、价格、小区等信息
主要函数如下:其实就是找页面上各个元素的值,等加载完后获取数据,然后下一页。
# 获取数据 def get_data(driver,district): begin_page = 1 end_page = 2 page = begin_page data = pd.DataFrame(columns=['Title', 'Price','Community','Area','District','UnitPrice']) page_element = driver.find_element(By.XPATH,"//*[@page-data]") # 获取data-totalpage属性的值 page_data_attr = page_element.get_attribute('page-data') # 使用正则表达式提取 totalPage 的值 match = re.search(r'"totalPage":\s*(\d+)', page_data_attr) if match: end_page = int(match.group(1)) # 将提取到的字符串转换为整数 print(f"共:{end_page} 页数据,开始获取") else: print("未找到 totalPage 值") # 翻页逻辑,这里需要根据实际页面元素进行调整 try: while page < end_page: print(f"进入页数为:{page} 的数据") # 获取当前页面的所有房源信息 #elements = WebDriverWait(driver, 30).until( # EC.find_elements((By.CLASS_NAME, "content__list--item")) #) elements = driver.find_elements(By.XPATH,"//*[@data-lj_action_housedel_id]") for index,element in enumerate(elements): title = element.find_element(By.CLASS_NAME,"title").text.replace('\n','') des = element.find_element(By.CLASS_NAME,"flood").text.replace('\n','') # 小区 community = des.strip().split('-')[0] # 面积 area_text = element.find_element(By.CLASS_NAME,"houseInfo").text.replace('\n','') area_text = area_text.strip().split('|')[1] match = re.search(r'\d+\.\d+|\d+', area_text) if match: area = float(match.group(0)) # 将匹配到的字符串转换为浮点数 else: print("没有找到数字") # 价格 total_price = element.find_element(By.CLASS_NAME,"totalPrice").text.replace('\n','') unit_price = element.find_element(By.CLASS_NAME,"unitPrice").text.replace('\n','').replace('"','') new_row = {'Title': title, 'Price': total_price,'Community':community,'Area':area,'District':district,'UnitPrice': unit_price} # print(f"{new_row}") data.loc[len(data.index)] = new_row try: page_element = driver.find_element(By.XPATH,"//*[@page-data]") # print(f"{page_element}") xpath_expression = "//a[normalize-space(text())='下一页']" next_page_button = page_element.find_element(By.XPATH,xpath_expression) # 滚轮 driver.execute_script("arguments[0].scrollIntoView();", next_page_button) # 执行一些操作,例如点击 next_page_button.click() finally: # 关闭浏览器 # driver.quit() page_element = driver.find_element(By.CSS_SELECTOR,'[class="on"]') page = int(page_element.text) # 避免死循环 # break #print(f"页数为:{page} 的数据获取完毕") except Exception as e: print("发生错误:", e) # 存储开始页数结束页数 print(f"共获取从{begin_page}页到{page}页的数据") # 返回数据 return data
然后用同样的方法获取租房、二手房的数据信息,在小区维度租售比分析:
想做的好一些,可以用图表进行绘制,也可以分析不同地区、不同类型房子的租售比。用来学习数据爬虫,还是有点意思的。有需要源码的联系我吧,不过只实现了一个demo。