最近房地产市场进一步收紧,多地地方政府出台各种收紧政策,以保证房地产健康发展,因此云朵君就想到运用Python网络爬虫,抓取部分房产信息,了解下最近房地产的情况。

接下来以房天下二手房信息,以获取某个城市各个区域二手房房产信息及价格,来一起学习下Python网络爬虫的基本方法。

备注,本文仅以学习交流,对于爬虫浅尝辄止,以免对服务器增加负担。

一、BeautifulSoup解析数据

分析网站

运用谷歌浏览器开发者工具分析网站

# 各区域网站地址如下规律
https://cd.esf.fang.com/house-a0129/
https://cd.esf.fang.com/house-a0130/
https://cd.esf.fang.com/house-a0132/# 每个区域不同页的网址规律
https://cd.esf.fang.com/house-a0132/i32/
https://cd.esf.fang.com/house-a0132/i33/
https://cd.esf.fang.com/house-a0132/i34/# 因此可定义网址形式如下
base_url = 'https://cd.esf.fang.com{}'.format(region_href)
tail_url = 'i3{}/'.format(page)
url = base_url + tail_url

网址获取

接下来重点获取region_href, page可以循环获取。

HTML中找到所有区域及region_href

代码

from requests_html import UserAgent
import requests
from bs4 import BeautifulSoup
user_agent = UserAgent().random
url = 'https://cd.esf.fang.com/'
res = requests.get(url, headers={"User-Agent": user_agent})
soup = BeautifulSoup(res.text, features='lxml')  # 对html进行解析,完成初始化
results = soup.find_all(attrs={'class': "clearfix choose_screen floatl"})
regions = results[0].find_all(name='a')
region_href_list = []
region_name_list = []
for region in regions:region_href_list.append(region['href'])region_name_list.append(region.text)

本次使用BeautifulSoup解析网页数据,获取region_href及对应行政区域名称region_name
可以参考《Beautiful Soup解析数据模块》

获取数据

宏观分析

由于每个行政区域及其各页数据可重复循环获取,因此这里只介绍一个区域(青羊区)的第一页。

分析每条数据所存在的地方。

微观分析

查看每个信息所在的节点。

代码

import re
regex = re.compile('\s(\S+)\s')
results = soup.find_all(attrs={'class': 'clearfix', 'dataflag': "bg"})
result = results
content = result.dd# 获取项目简述
title = regex.findall(content.h4.a.text)
','.join(title)
>>> '精装修套三,视野好'# 获取项目名称与地址
name = regex.findall(content.find_all(name='p', attrs={'class': 'add_shop'})[0].text)[0]
address = regex.findall(content.find_all(name='p', attrs={'class': 'add_shop'})[0].text)[1]
name
>>> '成都花园上城'
address
>>> '贝森-成都花园上城家园南街1号'# 获取项目描述,包括户型、区域、楼层、朝向、建筑年代
describe = regex.findall(content.find_all(name='p', attrs={'class': 'tel_shop'})[0].text)
describe
>>> ['3室2厅', '|', '141.26㎡', '|', '中层(共22层)', '|', '西向', '|', '2008年建', '|', '杨斌']# 获取优势标签
labels = regex.findall(content.find_all(name='p', attrs={'class': 'clearfix label'})[0].text)
labels
>>> ['距7号线东坡路站约830米']# 获取价格
prices = result.find_all(name='dd', attrs={'class': 'price_right'})[0].text
prices
>>> '\n\n380万\n26900元/㎡\n'

其余部分只需要循环获取即可。

结果

import pandas as pd
data = pd.read_csv("成都二手房_青羊.csv")
data.sample(5)

本次获取一个行政区共6027个二手房信息。

data.shape
>>> (6027, 13)

Selenium模拟浏览器

由于此网站监控较为严格,可利用selenium模拟浏览器一定程度上规避反爬机制。
可参考《selenium 爬取动态加载信息》

分析网页的方法同上,但此次并不是循环请求网页获取网页数据,而是通过模拟浏览器操作,再通过Xpath获取数据。
可参考《XPath解析》

导入并初始化浏览器驱动

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
from requests_html import UserAgent
from openpyxl import Workbook
import os
import json
import numpy as npdef init():"""初始化谷歌浏览器驱动:return:"""chrome_options = webdriver.ChromeOptions()# 不加载图片prefs = {"profile.managed_default_content_setting.images": 2}chrome_options.add_experimental_option("prefs", prefs)# 使用headless无界面浏览模式chrome_options.add_argument('--headless')chrome_options.add_argument('--disable-gpu')# 加载谷歌浏览器驱动browser = webdriver.Chrome(options=chrome_options,executable_path='chromedriver.exe')browser.get('https://cd.esf.fang.com/')wait = WebDriverWait(browser, 10)  # 最多等待十秒wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'screen_al')))return browser

获取数据

按页获取数据

此方法是根据xpath路径获取数据。

content_list = browser.find_elements_by_xpath("//div[@class='shop_list shop_list_4']/dl")
content_list

得到以 WebElement对象为元素的列表。

可通过遍历的方法遍历获取。

content = content_list[0]
describe = content.find_elements_by_xpath('dd')[0].text
price = content.find_elements_by_xpath('dd')[1].text
row = [describe, price, city]
row

其中一天信息如下。

代码

def get_page_content(browser, sheet, region):"""按页获取每页内容:param browser: 浏览器驱动:param sheet: excel 工作表:param region: 行政区域名称:return:"""content_list = browser.find_elements_by_xpath("//div[@class='shop_list shop_list_4']/dl")for content in content_list:try:describe = content.find_elements_by_xpath('dd')[0].textprice = content.find_elements_by_xpath('dd')[1].textrow = [describe, price, region]sheet.append(row)except:passreturn browser, sheet

按行政区获取数据

def get_region_content(browser, href, sheet, region):"""获取行政区域内容:param browser:谷歌浏览器驱动:param href: 请求地址:param sheet: excel 工作表:param region: 行政区域:return:"""print(f'正在爬取{region}区'.center(50, '*'))browser.find_element_by_xpath(f"//a[@href='{href}']").click()# 滑动到浏览器底部,已保证全部加载完成browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')time.sleep(2)# 重新滑动到浏览器顶部browser.execute_script('window.scrollTo(0,0)')wait = WebDriverWait(browser, 15)  # 最多等待十秒wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'page_box')))browser, sheet = get_page_content(browser, sheet, region)time.sleep(np.random.randint(10, 15))# 按页获取每一页的内容for page in range(2, 101):print(f'正在爬取{region}区的第{page}页'.center(30, '-'))try:browser.find_element_by_xpath(f"//a[@href='{href}i3{page}/']").click()browser, sheet = get_page_content(browser, sheet, region)time.sleep(np.random.randint(14, 15))except:breakreturn browser, sheet

综合获取数据

def get_content():region_href_list, region_name_list = get_href_list()for ind, href in enumerate(region_href_list):browser = init()region = region_name_list[ind]wb = Workbook()sheet = wb.activesheet.title = regionheader = ['描述', '价格', '行政区']sheet.append(header)browser, sheet = get_region_content(browser, href, sheet, region)wb.save(f'{region}.xlsx')print(f'{region}.xlsx已经存储完毕'.center(60, '#'))time.sleep(np.random.randint(15, 20))browser.quit()

结果

获取数据后,可以对数据清洗并分析。

推荐阅读

-- 数据STUDIO --

运用Python抓取二手房价格与信息的两种常用方法相关推荐

  1. 运用Python爬取二手房价格与信息的两种常用方法

    最近房地产市场进一步收紧,多地地方政府出台各种收紧政策,以保证房地产健康发展,因此云朵君就想到运用Python网络爬虫,抓取部分房产信息,了解下最近房地产的情况. 接下来以房天下二手房信息,以获取某个 ...

  2. 用python抓取智联招聘信息并存入excel

    用python抓取智联招聘信息并存入excel tags:python 智联招聘导出excel 引言:前一阵子是人们俗称的金三银四,跳槽的小朋友很多,我觉得每个人都应该给自己做一下规划,根据自己的进步 ...

  3. Python 抓取动态网页表格信息

    五一假期,研究了下Python抓取动态网页信息的相关操作,结合封面的参考书.网上教程编写出可以满足需求的代码.由于初涉python,过程中曲折很多,为了避免以后遇到问题找不到相关的信息创建本文. 准备 ...

  4. python定时器的使用方法_Python timer定时器两种常用方法解析

    这篇文章主要介绍了Python timer定时器两种常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方法一,使用线程中现成的: 这种一般 ...

  5. python抓取大众点评商户信息

    数据说明: 本次爬取大众点评共8个字段信息,包括: 商户名字, 口味评分, 环境评分,服务评分,人均价格,评论数量,地址,商户星级 然后把数据存入excel表格 一 .首页部分 我们可以看到有很多分类 ...

  6. Python抓取电影天堂电影信息

    最近想做一个电影资讯的App,由于豆瓣不对外开发API了,正愁怎么录入数据呢.最近在学Python想想那就用它来抓取电影信息吧. Python2.7 Mac OS 抓取的是电影天堂里面最新电影的页面. ...

  7. python抓取豌豆荚app数据信息

    一个哥们参加app大赛,我帮他写的抓取程序,但是好像抓取的数据挺少的,不知道怎么回事,先贴上来大家研究研究吧 # -*- coding: utf-8 -*- """ Cr ...

  8. 用python抓取中北大学贴吧信息看热点

    经过几天的学习已可以写出简单的爬虫了,无聊逛贴吧就实验一下, 一.明白你的目的是什么             我只是想看一下最近贴吧小萌新讨论什么在,反应讨论内容的就是标题了,因此我们要把他们的标题爬 ...

  9. python抓取京东的商品信息

    一.需要具备的技能以及开发环境: 1. 安装python开发环境 2. requests库  BeautifulSoup库 3. 具备python一定基础 二.分析JD搜索商品的URL参数 1. 经过 ...

最新文章

  1. Thinkpad SL400 issue
  2. 使用cpau.exe让不是管理员的用户也有权限运行哪些需要管理员权限的软件。
  3. python教程:封装、多态、反射
  4. css为网页顶部和底部都加入背景图
  5. rm: cannot remove directory `misc': Device or resource busy
  6. xilinx-arm-linux交叉编译链安装
  7. 实时数据产品实践——美团大交通战场沙盘
  8. 语音识别学习日志 2019-7-14 语音识别基础知识准备2 {EM算法与混合高斯模型(Gaussian mixture model, GMM)}
  9. 《程序员面试宝典》精华 编程语言部分
  10. ArchLinux(2013)中的网络配置和静态IP时DNS刷新的解决方法
  11. 20200723:198周周赛学习记录
  12. 海量ICLR论文点评公开,用这几个工具可以读得更轻松
  13. MongoDB在单机上搭建分片副本集群(windows)
  14. python 趋势线表达式_python添加趋势线
  15. 微信公众号申请需要哪些材料
  16. 2013 01 12 三星发布最新八核处理器SoC “Exynos 5 Octa”
  17. Love for music
  18. Appium 手机 App 自动化代码说明_启动微信app
  19. 【笨木头Unity】入门之旅007:Demo之四处找死(二)_主角移动和旋转
  20. Telnet访问百度www.baidu.com

热门文章

  1. 机器学习算法(二十六):文本表示模型
  2. Android开发手机通讯录
  3. 20210514面试题自我分类及总结(一)
  4. Mybatis和MybatisPlus3.4的使用
  5. python项目练习四:新闻聚合
  6. 头文件intrins.h的用法
  7. python程序题求roc-auc是一种常用的模型评价指标_模型评价方法
  8. 踏上自媒体之路,分享必备技能心得
  9. 香港在线下和线上以科技呈献缤纷耀眼的圣诞
  10. 软件性能测试负载测试,软件性能测试VS负载测试VS压力测试[2]