python 爬取贝壳网小区名称_Python爬虫实战:爬取贝壳网二手房40000条数据

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

以下文章来源于啤酒就辣条 ,作者啤酒就辣条

一、网页分析

爬取贝壳网石家庄二手房信息,先打开链接

https://sjz.ke.com/ershoufang/。

d25db2c8bca902b694346ef730bb7f2c.png

不添加筛选条件,发现总共有42817套房子。我们点击第二页,再查看链接变成了https://sjz.ke.com/ershoufang/pg2/。所以,可发现/pg{i},i就是页码。

2a6493c48a2e47bcc2b534edacd2a3c7.png

所以最多可爬取3000套房产信息,距离上面给出的4万多差的还很远,于是尝试把pg{i}的那个i人为改变一下,点击回车请求一下。

返回房产信息数据都一样。都是第100页的信息,于是乎,得出结论。通过贝壳网web端,查看某一条件下的房产信息,最多可以查看3000套。

1bbf67c736b2b2e2d422cb226d1aec93.png

所以呢,我们增加一些条件,比如,满五唯一,2室的。请求之~

063da343d20ce9bab0a13f3e2bd2bae7.png

发现链接变成了https://sjz.ke.com/ershoufang/pg2mw1l2/。mw1l2这个玩意应该筛选条件。看到只有2399套,欧克,咱们就爬它了。

二、撸起袖子写代码

麻雀虽小五脏俱全,本爬虫设计三个部分,爬取,解析,储存。

爬取

爬取利用requests库,比python内置库urllib要好用很多。

importrequestsdefget_a_page(url):

result=requests.get(url)print(result.text)if __name__ == '__main__':for i in range(1, 101):

get_a_page(f'https://sjz.ke.com/ershoufang/pg{i}mw1l2/')

for循环打印返回数据,发现没问题。其实i循环到81就好了,毕竟咱们知道了,只有不到2400套嘛。

解析

解析使用pyquery ,这个库使用起来类似于Jquery。完整API,https://pythonhosted.org/pyquery/api.html。还有一个解析库`bs4,下次再尝试。

5987ca72f0d5a675151810180c04875c.png

在这里插入图片描述

发现读取如图所示ul里面一个div就可以拿到我们想要的数据。

importrequestsfrom pyquery importPyQuery as pqimportjsondefget_a_page(url):

result=requests.get(url)

doc=pq(result.text)

ul= doc('.sellListContent')

divs= ul.children('.clear .info.clear').items()for div indivs:

count+= 1title= div.children('.title a').text()

place= div.children('.address .flood .positionInfo a').text()

msg= div.children('.address .houseInfo').text()

price= div.children('.address .priceInfo .totalPrice span').text()

per_meter= div.children('.address .priceInfo .unitPrice').attr('data-price')

dict={'title': title,'place': place,'msg': msg,'price': price,'per_meter': per_meter

}print(str(count) + ':' + json.dumps(dict, ensure_ascii=False))

代码如上,pyquery 的children方法是查找子标签,find方法是找子孙标签,此处我们只需要找下一代就好。然后通过text找到标签所包含的文本。attr是获取属性内容的,因为那个per_meter从属性中获取比较简单,标签中的内容还包含了“元/平米”。

储存

本次我们直接储存到csv中,一种类似于excel的文件格式。利用的是pandas库。

完整代码如下:

importrequestsfrom pyquery importPyQuery as pqimportjsonimportpandas as pd

columns= ['title', 'msg', 'price', 'per_meter']#爬取某网页

defget_a_page(url):

result=requests.get(url)

doc=pq(result.text)

ul= doc('.sellListContent')

divs= ul.children('.clear .info.clear').items()

count=0

titles=[]

places=[]

msgs=[]

prices=[]

per_meters=[]for div indivs:

count+= 1title= div.children('.title a').text()

place= div.children('.address .flood .positionInfo a').text()

msg= div.children('.address .houseInfo').text()

price= div.children('.address .priceInfo .totalPrice span').text()

per_meter= div.children('.address .priceInfo .unitPrice').attr('data-price')

dict={'title': title,'place': place,'msg': msg,'price': price,'per_meter': per_meter

}

titles.append(title)

places.append(place)

msgs.append(msg)

prices.append(price)

per_meters.append(per_meter)print(str(count) + ':' + json.dumps(dict, ensure_ascii=False))

datas={'title': titles,'place': places,'msg': msgs,'price': prices,'per_meter': per_meters

}

df= pd.DataFrame(data=datas, columns=columns)

df.to_csv('sjz.csv', mode='a', index=False, header=False)if __name__ == '__main__':for i in range(1, 101):

get_a_page(f'https://sjz.ke.com/ershoufang/pg{i}mw1l2/')

多进程

由于get_a_page函数要运行100次,有点小慢,所以利用多进程加快速度,这部分代码,请直接copy。

将主函数改成如下所示

from multiprocessing.pool importPoolif __name__ == '__main__':

pool= Pool(5)

group= ([f'https://sjz.ke.com/ershoufang/pg{x}mw1l2/'for x in range(1, 101)])

pool.map(get_a_page,group)

pool.close()

pool.join()

三、结束

查看下效果:

72c21e6ed3102ab84254694f502e189c.png

效果还可以。有人会说,为什么不把msg信息拆分一下,分别储存楼层、几室几厅、建筑年代等等多好。刚开始,我是那么做的,结果发现这个msg数据那几项不是必填项,有的建筑年代、楼层什么的房主不填写,索性就整个拿过来了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hive mysql5.7_安装并使用mysql5.7作为hive的metastore

前言hive的metastore默认是使用derby来作为metastore,但是derby有一个缺点是不能支持多用户链接,虽然你可以通过切换目录来支持,但是不同目录的metastore会不一致,所以这里使用mysql来作为hive的metastore。在linux上安装mysql数据…

gitee如何搭建mysql_Windows基于gitee使用hexo搭建个人博客笔记

声明"全局变量"(以后我提到的站点配置文件和主题配置文件地址):"站点配置文件"位置为 hexo/_config.yml"主题配置文件"位置为 hexo/themes/next/_config.yml搭建hexo安装hexo命令行中输入以下命令(npm即为Node.js环境,如果…

mysql error nr.2003_[MySQL]在安装windows版MySQL时遇到过如下问题Error Nr.1045和Error.Nr.2003,相应解决办法如下...

1、准备mysql server-5.0.27.exe2、按照指导安装,在安装到最后一步时遇到如下两个错误:2.1、出现错误Error Nr.1045解决办法:a).停止MySQL服务:我的电脑-->右键-->管理-->服务和应用程序-->服务 找到名为"MySQL&…

java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题

递归递归需要遵守的重要规则1) 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)2) 方法的局部变量是独立的,不会相互影响, 比如 n 变量3) 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.4) 递归 必须向退出递归…

cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?

原标题:并发环境下,先操作数据库还是先操作缓存?来源:捡田螺的小男孩前言在分布式系统中,缓存和数据库同时存在时,如果有写操作,先操作数据库还是先操作缓存呢?本文将分5种方案 展开…

java 查看垃圾收集器_JVM系列:查看JVM使用的什么垃圾收集器

一、方法一打印虚拟机所有参数[rootlocalhost ~]# java -XX:PrintFlagsFinal -version | grep :uintx InitialHeapSize : 258689024 {product}uintx MaxHeapSize : 4139778048 {product}bool PrintFlagsFinal : true {product}bool UseCompressedOops : true {lp64_product}boo…

java在W n8安装_在windows中安装JDK8并配置环境变量-java环境变量设置

学习JAVA,必须得安装一下JDK(Java development kit java开发工具包),配置一下环境就可以学习JAVA了,下面是下载和安装JDK的教程:一、去oracle官网上下载jdk8的下载地址:https://www.oracle.com/technetwork/java/javas…

java将图片上传数据库_〔技巧实例〕轻松实现将上传图片到数据库

很久就想自己写一写程序了,不过由于赖就不想写我,今天刚好有空,所以写了这个小小的程序很容易一看就知道的,不多说了就此开始:我们做一个上传的。数据据库的字段就id自动编号 big 字段类型是 OLE 呵呵就简单的那个字段…

java计算雷达扫描范围_雷达扫描 - linyinmobayu - 博客园

1、设计思想雷达扫描图,在影视作品中见到较多,比如飞机雷达、舰艇雷达,有一个扫描线转圈代表雷达一周旋转或一个批次的收发,发现目标就在表盘上标记位置。和汽车仪表盘类似,汽车仪表盘有底盘背景图、同圆、刻度、刻度值…

mysql降序后去重_Mysql 数据记录去重后按字段排序

实现效果:去重—取最新的—排序例子 : 按用户ID获取历史记录中某个人的记录,要求非重复的且每条只获取最新的,同时按添加时间倒序排列的实现 :SELECT *FROM (SELECT *FROM historysWHERE types_id1ORDER BY created DESC) AS BGRO…

linux php 守护进程,PHP程序员玩转Linux系列 使用supervisor实现守护进程

PHP程序员玩转Linux系列文章:首先遇到的问题是,部署nodejs的博客程序时,我把执行nodejs的命令放到后台,使用加&和nohup命令如:nodejs index.js & 或者 nohup nodejs index.js &&这个使用是当退出此次终端会话的时候就会停止, nohup这个命令理论上是…

计算机初级包括php吗,计算机的基本组成包括什么

计算机的基本组成包括控制器、运算器、存储器、输入设备和输出设备。其中,控制器是整个计算机的中枢神经,它的功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据,协调计算机各部分工作及内存与外…

ubuntu11.10 源码编译安装php5.3.8,Ubuntu 11.10编译安装Nginx、PHP 5.3.8、MySQL、MongoDB、Memcached、SSL、SMTP...

手动安装php mongo扩展sudo apt-get install autoconfwget http://pecl.php.net/get/mongo-1.2.6.tgztar -zxvf mongo-1.2.6.tgzcd mongo-1.2.6/usr/local/php/bin/phpize./configure --with-php-config/usr/local/php/bin/php-configmakesudo make installecho extension mon…

java实现图像处理高通滤波,图像处理入门——滤波 - leo_de_macondo的个人页面 - OSCHINA - 中文开源技术交流社区...

模糊图像模糊的方法可以将每个像素的rgb值用周围像素的加权平均值来代替。比如用周围的9个像素来计算加权平均值,权值可以用一个3x3的矩阵来表示:| 1 2 1 || 2 4 2 | * (1/16)| 1 2 1 |中间的像素是要处理的像素,越靠近中间权…

matlab数据接口技术,matlab接口技术与应用

matlab接口技术与应用来源:mamingkeda作者:华仔浏览:1070时间:2016-08-10 14:18标签:摘要:matlab接口技术与应用应用程序接口的使用方法。全书分为10章,第1章是matlab环境和编程语言的概述&…

ssrf 过滤.php,SSRF技巧之如何绕过filter_var( )

0x00 前言前几天我读了两篇非常棒的论文:第一篇是发表在blackhat.com上的“A New Era of SSRF ”,讲述的是不同编程语言的SSRF问题;第二篇是由Positive Technology发表的一篇名为“PHP Wrapper” 的论文,它主要讲述的是如何以多种…

如何用notepad写php,notepad新手怎么使用

新手使用notepad的几个小技巧:一、软件始终置于屏幕最前方有时候我们在运行程序时,需要将notepad放置到屏幕最前方,此时只需要在工具栏中点击:view——always on tops;此时notepad就会一直处于屏幕最前方。注&#xff…

双网卡主机配置oracle监听,VirtualBox设置双网卡实现虚机上网及主宿机互访

VirtualBox 虚拟机之间互连、主宿机互连、以及主宿机连接互联网的功能非常实用。下面介绍实现主宿机通过虚拟网卡互连方式。1 全局配置VirtualBox安装完成后,会在系统中装一块虚拟网卡,我们在 管理> 全局设定中可以看到。这块网卡是在 Host-Only 连接…

linux无filelength函数,Linux Shell 自定义函数(定义、返回值、变量作用域)介绍

定义Shell函数(define function) 语法:[ function ] funname [()]{action;[return int;]}说明:可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。参数返回,可以显示加:return 返回,如果不加&…

linux ssh登录历史,Linux中的SSH登录

在Linux系统中需要使用SSH远程登录到另一个Linux系统,可以使用SSH命令加用户和IP地址的方法。ssh命令用于远程登录上的Linux主机。常用格式:ssh [-l login_name] [ –p port] [userhostname]例如不指定用户:ssh 192.168.0.100指定用户&#x…