python爬取自如数据
为什么80%的码农都做不了架构师?>>>
前言
学习python有一小段时间了,爬虫也看了一些,所以想拿个简单点的练一下手,而且最近碰上自如比较火,这里就用自如来练手把
分析
链接:http://www.ziroom.com/z/nl/z3.html
上面那个是自如北京的搜索页面,按照我的理解,所有的房源和一些基本信息应该都可以从这个页面得来(自如宅是自如自己的广告,不是我们需要的),这些都是页面看到的信息,还有一个信息我们其实也可以拿下来,用于以后如果有需要的时候用,就是每一个房源的详细页面链接
然后我们看到其实链接都是固定套路,不一样的只是后面那串数子,我猜就是数据库保存的主键了,那么我们也就可以开始准备我们自己的数据格式了(我这里是保存在mysql的)
CREATE TABLE `beijing` (`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键id',`price` int(10) NOT NULL DEFAULT '0' COMMENT '价格',`size` decimal(10,2) DEFAULT '0.00' COMMENT '大小',`floor` int(10) NOT NULL DEFAULT '0' COMMENT '楼层',`total_floor` int(10) NOT NULL DEFAULT '0' COMMENT '总楼层',`room` int(10) NOT NULL DEFAULT '0' COMMENT '房',`hall` int(10) NOT NULL DEFAULT '0' COMMENT '厅',`line` varchar(20) NOT NULL DEFAULT '' COMMENT '几号线',`station` varchar(20) NOT NULL DEFAULT '' COMMENT '地铁站',`distance` int(10) NOT NULL DEFAULT '0' COMMENT '距离',`taps` varchar(200) NOT NULL DEFAULT '' COMMENT '标签',`href` varchar(100) NOT NULL DEFAULT '' COMMENT '链接',`address` varchar(100) NOT NULL DEFAULT '' COMMENT '附近地址',`area` varchar(20) NOT NULL DEFAULT '' COMMENT '区',`phase` varchar(20) NOT NULL DEFAULT '' COMMENT '收费周期',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
接下来我们就开始分析页面,首先我发现,点击分页2的时候,url改变了
http://www.ziroom.com/z/nl/z3.html?p=2 很简单,只是一个普通的p来控制,但是这个会有一个问题,就是我们看全部的这个页的时候,发现只有50页,后面的数据就出不来了,北京的房源实际是不止那么少的,我就去点了另外一个链接
http://www.ziroom.com/z/nl/z3-d23008614.html
出现了只有13页,是不是说,每个标签的全部下面都不会超过50的分页,我们只需要去拿这些链接下面的数据就可以了呢,然后我就点了朝阳区下面的全部的这个链接,发现页数也是50,也就是说,我们不能拿这个标签,还需要再细一级,拿每一个区域下面的每一个标签(不拿全部的这个标签,因为数据这样就重复了),拿这些标签是在zindex6下面的ul下的每一个li的第三个span开始一直到最后的一个span里面的a变迁的href的属性
r = requests.get(self.url)bsObj = BeautifulSoup(r.text, 'lxml')lis = bsObj.select('.zIndex6 ul li')for li in lis[1:]:hs = li.select('span')[2:]for h in hs:# 这个就是了href = 'http:' + h.select('a')[0].attrs.get('href')
这里,我们拿到了每一个页面,我们还需要知道这个页面有多少分页,好方便我们去循环
bsObj = self.get_html(url)
page_str = bsObj.find(string=re.compile('共([0-9]*)页'))
page = re.search('共([0-9]*)页', page_str).group(1)
接下来我们是不是就可以开始抓取了呢,不是的,其实还有一个问题,我们看价格
它的价格既不是文本,也不是图片,而是用css来控制的,怎么控制
我们找到这个css后面的背景图,发现是一个类似雪碧图的东西
而刚刚那个价格是怎么来的,2130,
2对应的位移是270,在雪碧图的最第十个(index=9),1对应的位移是30,在雪碧图的第二个(index=1),3对应的位置是60,在雪碧图的第三个
我们已经找到规律了
i = re.search('background-position:-([0-9]*)px', style).group(1)
k = int(int(i) / 30)
// code为雪碧图的数字
price_str += code[k:k + 1]
那么是不是我们这个图的数字排序是固定的,我们打开另外一个链接,发现不是的,这个图片是随机生成的,也就是说,我们没打开一个链接,都是不一样的,那么要怎么找到这个图片呢,看源码,我们发现这么一个js
<script>
var offset_unit = 30;
if(window.devicePixelRatio >1){$('body').addClass('ratio2');
}
var ROOM_PRICE = {"image":"//static8.ziroom.com/phoenix/pc/images/price/b7944d44332aca7b65a0df428ec83cads.png","offset":[[9,1,2,6],[9,5,4,6],[1,7,4,6],[1,7,4,6],[9,2,4,6],[9,9,4,6],[9,9,4,6],[1,7,8,6],[9,1,2,6],[9,7,8,6],[5,6,8,6],[8,6,8,6],[9,3,2,6],[9,8,2,6],[9,5,2,6],[9,8,8,6],[8,6,4,6],[9,6,4,6]]};$('#houseList p.price').each(function(i){var dom = $(this);if(!ROOM_PRICE['offset'] || !ROOM_PRICE['offset'][i]) return ;var pos = ROOM_PRICE['offset'][i];for(i in pos){var inx = pos.length -i -1;var seg = $('<span>', {'style':'background-position:-'+(pos[inx]*offset_unit)+'px', 'class':'num'});dom.prepend(seg);}var seg = $('<span>', {'style':'background-position:1000px', 'class':'num rmb'}).html('¥');dom.prepend(seg);
});
</script>
这个图片的链接就在这里,我们需要提取出来
js_str = bsObj.find(string=re.compile("//static8.ziroom.com/phoenix/pc/images/price/(.*).png"))
img_url = 'http:' + re.search('//static8.ziroom.com/phoenix/pc/images/price/(.*).png', js_str).group(0)
拿出来以后,我们还需要借助一个工具来识别出来这个数字是怎样的,下载下来放在一个地方,这样我们就得到了这个数字了,
path = './code.png'
urllib.request.urlretrieve(img_url, path)
image = Image.open(path)
code = pytesseract.image_to_string(image, config='--psm 6')
这样,我们就可以按照这个逻辑来一步一步的完成这个爬取,最后源码放在了GitHub,需要的自取合适的城市
https://github.com/gcdong/ziroom
转载于:https://my.oschina.net/gcdong/blog/2051977
python爬取自如数据相关推荐
- python 爬取自如租房的租房数据,使用图像识别获取价格信息
python 爬取自如租房的租房数据 完整代码下载:https://github.com/tanjunchen/SpiderProject/tree/master/ziru #!/usr/bin/py ...
- python爬取网页公开数据_如何用Python爬取网页数据
使用Python爬取网页数据的方法: 一.利用webbrowser.open()打开一个网站:>>> import webbrowser >>> webbrowse ...
- 编程python爬取网页数据教程_实例讲解Python爬取网页数据
一.利用webbrowser.open()打开一个网站: >>> import webbrowser >>> webbrowser.open('http://i.f ...
- Python爬取天气数据及可视化分析!
来源丨Python之王 Python爬取天气数据及可视化分析 说在前面 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向.相对湿度.空气质量等成为关注的焦点.本 ...
- Python爬取的数据存为json文件,并读取
Python爬取的数据存为json文件,并读取 import requests import time from lxml import etree import jsondef json_data_ ...
- python爬取自如房间信息(一)
使用python和selenium+Chrome Headless爬取自如房间信息,并将结果存储在MongoDB中.其中最麻烦的应该是每间房的价格,因为自如是用一张图片和offset来显示价格,所以不 ...
- python爬虫教程:实例讲解Python爬取网页数据
这篇文章给大家通过实例讲解了Python爬取网页数据的步骤以及操作过程,有兴趣的朋友跟着学习下吧. 一.利用webbrowser.open()打开一个网站: >>> import w ...
- python爬取股票数据,以上证指数为例,可以爬取任何股票,保存为temp.csv文件
python爬取股票数据,以上证指数为例,可以爬取任何股票,保存为temp.csv文件 import requests import pandas as pd# market: 0:沪市 1:深市 # ...
- python爬取微博数据词云_用Python爬取微博数据生成词云图片
原标题:用Python爬取微博数据生成词云图片 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求职,一站式搞定! 对商业智能BI.大数 ...
最新文章
- 带有BERT模型代码的BILSTM+BERT+CRF
- 在c语言中除法运算符,c – 不需要的除法运算符行为,我该怎么办?
- 五十八、如何对一个数进行分解质因数
- 如何跑通第一个 SQL 作业
- HDU4607(求树中的最长链)
- 我终于搞清楚了和String有关的那点事儿
- UpdataPanel学习之 RenderMode
- 深度学习(10):自然语言处理(转)
- OSGi.NET 学习笔记 [模块化和插件化][概念]
- React-Native 爬坑爬坑
- html把毫秒转换成年月日,JS实现获取毫秒值及转换成年月日时分秒的方法
- 我说CMMI2.0之技术解决方案
- 当电脑接双屏扩展显示器时,系统崩溃,QQ浏览器出现显示异常,通过如下方法使之正常
- ARM7-LPC213x(五)UART0 和 UART1
- 将整数翻译成英文(C++)
- [Usaco2010Hol]Dotp
- iOS 全息备份研究
- 【web漏洞】弱口令
- 新浪微博--分享到微博的简单使用
- vmware 虚拟机安装成功,但没有虚拟网卡的解决方法
热门文章
- 计算机维修教学知识,《计算机组装与维护》——计算机组装与维修的基础知识教学教案.doc...
- 使用golang的mysql无法插入emoji表情的问题
- 客户端有道云上的图片不能加载
- Apache Pivot教程 -- SuggestionPopup输入建议
- 敬往事一杯酒,再好也不回头
- 3ds Max 2011\2012下载及安装方法
- 王权富贵:window7往Linux服务器上传文件
- 计算机毕设分享 springboot中药店商城系统(含源码+论文)
- 淮南市外观设计专利申请条件,简要说明要写哪些内容?
- GlobalObject::CollectGarbage Method