文档章节

python爬取自如数据

栋栋也疯狂
 栋栋也疯狂
发布于 09/16 12:43
字数 1409
阅读 20
收藏 0

前言

学习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

© 著作权归作者所有

共有 人打赏支持
栋栋也疯狂
粉丝 0
博文 27
码字总数 20667
作品 0
广州
国内顶尖白帽子用Python打造渗透工具集,当时花上万购买都被拒!

前言 python是门简单易学的语言,强大的第三方库让我们在编程中事半功倍,今天我们就来谈谈python在渗透测试中的应用,让我们自己动手打造自己的渗透工具集。 一、信息搜集--py端口扫描小脚本...

诸葛青云999
08/18
0
0
分分钟几万上下!用Python爬取包图网视频(附代码)切勿商用!

分析网页数据结构 目标抓取全站视频数据保存在本地, 并以网站视频名命名视频文件。 经分析我们可以发现总站数据 我们可以从这四这选项下手 分析网页数据格式 网页数据为静态 抓取下一页链接...

Python新世界
07/24
0
0
Python实用教学:如何用Python玩转各大网站

Hi~,各位小伙伴,Python是目前编程语言中的主流语言之一,也是公认最容易入门的编程语言,因为Python语言近几年的火爆,有很多小伙伴都开始学习这门语言。 编程语言学习,最重要的是“多看代...

W3Cschool小编
07/31
0
0
python爬头条妹子,为了不被查水表,就不好 多介绍了

先来几张漂亮小姐姐照片 首先需要安装的Python库: requests urllib 直接pip安装就好了 接着我们在网页上打开今日头条,在搜索栏搜索“街拍”(视频教程) 因为这里面的小姐姐多,漂亮 之后,...

Python新世界
07/27
0
0
手把手教你写网络爬虫(1):网易云音乐歌单

原文出处:拓海 大家好,《手把手教你写网络爬虫》连载开始了!在笔者的职业生涯中,几乎没有发现像网络爬虫这样的编程实践,可以同时吸引程序员和门外汉的注意。本文由浅入深的把爬虫技术和...

拓海
04/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

记录一次idea断点打不上的解决办法和猜测原因

写完代码,需要在本地调试一下,却发现断点打不上,正常打上断点应该是红点加勾,如下图: 但是今天打断点却出现圈+斜杠,类似下面这种: 出现这种情况大概有两种可能,一种是断点打在了错误...

edwardGe
16分钟前
0
0
使用PHP辅助快速制作一套自己的手写字体实践

一、背景 笔者以前在网上看到有民间高手制作字体的相关事迹,觉得把自己的手写字用键盘敲出来是一件很有意思的事情,所以一直有时间想制作一套自己的手写体,前几天在网上搜索了一下制作字体...

Mr_zebra
17分钟前
0
0
Python 中实现装饰器 @functools.wraps 的作用

废话不说,先看两端代码: 1、使用了@functools.wraps import timeimport functoolsdef timeit(func): @functools.wraps(func) def wrapper(): start = time.clock()...

fang_faye
20分钟前
0
0
spark任务出现Lost executor报错的几点解决方案

1、spark.executor.extraJavaOptions="-XX:MaxPermSize=2028m" 2、spark.akka.frameSize=1003、增加executor内存executor默认的永久代内存是64K,可以看到永久代使用率长时间为99%,通过...

KYO4321
28分钟前
0
0
全文检索Solr集成HanLP中文分词

以前发布过HanLP的Lucene插件,后来很多人跟我说其实Solr更流行(反正我是觉得既然Solr是Lucene的子项目,那么稍微改改配置就能支持Solr),于是就抽空做了个Solr插件出来,开源在Github上,...

左手的倒影
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部