1 前言

租房/有房要出租的小伙伴们看过来~

衣食住行是生活的基本需求。衣和食好解决,不喜欢的衣服可以买新的,不好吃的食物可以换一家吃。可是在住宿上,买房和租房的置换成本都相对较高,因此房源选择尤为慎重。作为目前买不起房的自然人,我们一般是通过中介来实现租房的需求,比如自如,贝壳找房和链家。看来宇宙的尽头是铁岭,租房的尽头是链家……

链家占据了租赁市场的主导地位,且提供的信息相对公允。但每当我刷超过十个房源,我就会记不起来每一个的信息,也无法可视化去比较很多个房源。那么让我们开始动手,用万能的Python来让链家变成你家,获取链家网上的你想要的信息吧。(真的不是广告)

2 获取房源数据

此次侧重XPath的使用和反爬虫小技巧。XPath是用路径表达式在XML文档中选取节点,这里也同样适用于HTML文档的搜索。

2.1 确定URL

打开上海链家网的租房页面,选择筛选条件,示例如下。确认后地址栏的URL会根据筛选条件而发生变化。(当然如果没有想好想要住的区域,地铁线,租金,面积,朝向,户型也没有关系,可以直接爬取全部的上海房源数据。)

共计28页房源信息,点击切换下一页,观察URL会发现链家网是静态的网页,页面切换通过在URL中加入pg{i}参数实现。因此我们只要能爬取一页的信息,就可以通过参数循环来爬取所有页面。

2.2 解析页面

按F12打开开发者工具,在页面中选择一个元素以进行检查。可以看到右侧的房源列表模块和左边的房源信息是一一对应的。左侧的每一条房源信息都等价于右侧的class属性为content__list--item的一个div图层。因此我们只需要观察了解第一个房源信息即可。

继续展开这个div图层,会发现我们需要的信息基本都被包含在属性为content__list--item--main的子div图层中,尤其是其中几个class为title,description,price的元素里。

以属性为content__list--item--title的paragraph为例,其中包含了租赁方式,街区,房屋朝向等信息。我们可以用XPath来匹配和定位到这个段落,取出里面的文本。常用的匹配规则为 / 代表选取直接子节点,// 代表选择所有子孙节点,. 代表选取当前节点,.. 代表选取当前节点的父节点,@ 则是加了属性的限定,选取匹配属性的特定节点。下面是租赁方式(整租/合租)的匹配方式。

LeaseMethod = li.xpath('.//div[@class="content__list--item--main"]/p[@class="content__list--item--title"]/a/text()')[0].strip().split(' ')[0].split('·')[0]

以此类推,我们可以轻易的取出街区,租赁方式,朝向,每月租金,行政区,板块,房屋面积,格局和发布时长等信息。

2.3 反爬虫解决措施

网站的反爬措施有很多,比如检测访问请求头。且如果一个header短期频繁发送请求,也很容易被识别。这种情况下可以通过添加多个请求头,每次随机选取一个header,伪装成浏览器访问;且设置time sleep,每次发送请求随机间隔一段时间来防止出现error403/404。还有一些方法如添加Referer,host,代理IP等,这里不做过多阐述,感兴趣的小伙伴欢迎自行探索。

完整代码和最终结果如下。可以看到第一步在链家主页搜索时显示的828条记录已经全部获取到数据框中。可以进行下一步的分析啦!

import requests
from lxml import etree
import random
import time
import pandas as pd#伪装请求头
user_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60','Opera/8.0 (Windows NT 5.1; U; en)','Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0','Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 ','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36',"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14","Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)",'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11','Opera/9.25 (Windows NT 5.1; U; en)','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)','Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)','Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12','Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',"Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7","Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 "
]def getHeaders():user_agent = user_agents[random.randint(0, len(user_agents)-1)] headers = {'User-Agent': user_agent}return headers#对一个URL发送请求,解析结果,获取所需数据
def get_data(url):#反爬虫策略1:随机取headersresponse = requests.get(url, headers=getHeaders(), stream=True)tree = etree.HTML(response.text)# 定位到content__listli_list = tree.xpath('//div[@class="content w1150"]/div[@class="content__article"]/div[@class="content__list"]/div')# all_house_list = []for li in li_list:#下面是两种定位方式,都可# Nbhood = li.xpath('.//div[@class="content__list--item--main"]/p[@class="content__list--item--title"]/a[@class="twoline"]/text()')[0].strip().split(' ')[0].split('·')[1]Nbhood = li.xpath('.//div[@class="content__list--item--main"]/p[@class="content__list--item--title"]/a/text()')[0].strip().split(' ')[0].split('·')[1]LeaseMethod = li.xpath('.//div[@class="content__list--item--main"]/p[@class="content__list--item--title"]/a/text()')[0].strip().split(' ')[0].split('·')[0]HouseOrientation = li.xpath('.//div[@class="content__list--item--main"]/p[@class="content__list--item--title"]/a/text()')[0].strip().split(' ')[2]Rent = li.xpath('.//div[@class="content__list--item--main"]/span[@class="content__list--item-price"]/em/text()')[0]District = li.xpath('.//div[@class="content__list--item--main"]/p[@class="content__list--item--des"]/a/text()')[0]Location = li.xpath('.//div[@class="content__list--item--main"]/p[@class="content__list--item--des"]/a/text()')[1]Size = li.xpath('.//div[@class="content__list--item--main"]/p[@class="content__list--item--des"]/text()')[4].strip()HouseType = li.xpath('.//div[@class="content__list--item--main"]/p[@class="content__list--item--des"]/text()')[6].strip()releaseTime = li.xpath('.//div[@class="content__list--item--main"]/p[@class="content__list--item--brand oneline"]/span[@class="content__list--item--time oneline"]/text()')[0]Link = li.xpath('.//div[@class="content__list--item--main"]/p[@class="content__list--item--title"]/a[@class="twoline"]//@href')[0]all_house_list.append((Nbhood,LeaseMethod,HouseOrientation,Rent,District,Location,Size,HouseType,releaseTime))return all_house_list#循环爬取所需租房信息
pages = ['https://sh.lianjia.com/ditiezufang/li143685063/pg{}rt200600000001l1l0ra1ra2ra0rp5rp6/'.format(x) for x in range(1,29)]
all_house_list = []
count = 0
for page in pages:a = get_data(page)#反爬虫策略2:每次爬取随机间隔3-10stime.sleep(random.randint(3,10))count=count+1print ('the '+str(count)+' page is sucessful')name = ["街区", "租赁方式", "朝向", "每月租金", "行政区","板块","房屋面积","格局","发布时长"]
page_data = pd.DataFrame( columns= name,data=all_house_list)

3 总结

一句话总结,爬取数据的本质就是观察和找规律。那么祝大家找到满意的房子!有时间的话下次写写基于获取的房源信息做的分析,当然,如果鸽了的话当我没说~

Python爬虫获取租房数据相关推荐

  1. python Chrome + selenium自动化测试与python爬虫获取网页数据

    一.使用Python+selenium+Chrome 报错: selenium.common.exceptions.SessionNotCreatedException: Message: sessi ...

  2. python爬虫获取基金数据2

    用sklearn分析基金数据<1> python爬虫获取基金数据<2> 数据预处理:数据清洗.生成样本数据<3> 用sklearn训练样本数据<4> 用 ...

  3. python如何过获取双色球信息_【编程】Python爬虫获取双色球数据

    #爬虫获取双色球的全部开奖数据 #使用class, #格式: import urllib.request import platform from bs4 import BeautifulSoup i ...

  4. python爬虫获取天气数据

    #encoding:utf-8 import requests from bs4 import BeautifulSoup import urllib.request import random#设置 ...

  5. Python数据分析挖掘案例:Python爬虫助力疫情数据追踪

    通过学习Python数据分析挖掘案例,可以掌握通过Python爬虫获取的数据进行处理以及可视化分析的主要方法和技能,并为后续相关课程学习及将来从事数据分析工作奠定基础. 新冠病毒疫情在武汉突然爆发,确 ...

  6. Python爬虫获取文章的标题及你的博客的阅读量,评论量。所有数据写入本地记事本。最后输出你的总阅读量!

    Python爬虫获取文章的标题及你的博客的阅读量,评论量.所有数据写入本地记事本.最后输出你的总阅读量!还可以进行筛选输出!比如阅读量大于1000,之类的! 完整代码在最后.依据阅读数量进行降序输出! ...

  7. 我是如何把python爬虫获取到的数据写入Excel的?

    如何将爬虫获取的数据写入Excel,这一点我在爬虫文章几乎都是采用这种方式来进行操作的 写入Excel的目的是为了后续更加方便的使用pandas对数据进行清洗.筛选.过滤等操作. 为进一步数据研究.可 ...

  8. Python 爬虫 | 获取历史涨停数据

    最近想研究一下连板的个股有没有什么规律(暴富我来了),这一篇主要就是做数据准备的. 目录 1.数据获取 2.代码实现 1.数据获取 数据来源就是问财,查指定日期的涨停即可获得当日的数据. 2.代码实现 ...

  9. Python爬虫获取基金持仓股票数据

    Python爬虫小实战 . 通过Python爬虫获取基金持仓股票数据,按照基金持仓金额对股票进行排行,并储存在本地数据库. from urllib import request from bs4 im ...

  10. 编写python爬虫 获取中华英才网全网工资数据

    做数据分析 数据挖掘,第一步是获取数据,在这里,我们要分析现今全国各地各个职业的工资情况. 我们选择较为权威的'中华英才网',编写python爬虫获取该网站上的各个招聘信息说给出的工资,再取其行业工资 ...

最新文章

  1. 今年你的双11包裹,也是自动驾驶卡车送来的吗?
  2. 中商惠民李超:500,000+ 便利店背后的精细化管理
  3. [云炬创业学笔记]第一章创业是什么测试16
  4. Linux 访问文件的acl信息,linux文件权限管理与ACL访问控制列表
  5. 汇编 debug调试没有执行对应文件源码指令---》失灵---》正确使用debug第一步
  6. Mybaits插入记录返回主键值
  7. yum install -y iptraf 显示找不到命令
  8. 容器入门(2) - podman
  9. javascript笔记—— call 简单理解
  10. RFM 客户价值分析
  11. 夜曲歌词 拼音_《夜曲》的歌词 - 歌手:周杰伦 (Jay Chou)
  12. 第二届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2023)
  13. 等保三全面安全检查表_全面的安全方法
  14. Field not found; typically this occurs with arrays which are not mapped as single value
  15. 什么是Oracle数据库伪列,ORA-00976: 此处不允许指定的伪列或运算符
  16. 小胖 机器人作文_作文《我的小机器人》,学生:这是我自己写的!老师:写的不错...
  17. 在安卓系统中集成YAHFA框架
  18. 读《深入理解计算机系统》
  19. C# Invoke,begininvoke的用法详解
  20. 用计算机寻找规律,用计算器找规律练习题

热门文章

  1. 饼图制作软件,饼图的制作方法
  2. 一步成高手:终极图解内存(上篇)
  3. 第3章【思考与练习4】数据清洗,从studentsInfo.xlsx 文件的“Group1”表单中读取数据。数据填充,使用习题1的数据,使用列的平均值填充“体重”和“成绩”列的NaN数据。
  4. Unity C#编程优化——枚举
  5. Android版疯狂填字第三关,iOS/安卓版《疯狂填字3》答案攻略第140关
  6. 哪怕我变成一个庸俗女子
  7. MVX-Net: Multimodal VoxelNet for 3D Object Detection
  8. word替换妙用小技巧:批量去除多余空格、空行、换行
  9. java-第十三章-类的无参方法(一)-模拟一个简单的购房商贷月供计算器
  10. iOS-QQ音乐播放器的简单实现