今天闲来无事,帮助同学做一个经济学作业的爬虫部分,题目如下:爬自如上面北京的租房数据,包括小区,面积,朝向,区域,租金,大致位置(比如距离某地铁站多少米)这些信息

作为爬虫只写过
page = requests.get(‘link’)
print(page.txt)
这两句的一个纯纯纯小小小小白白白白白,我打算从头开始边学边写整个的函数,把学习的过程记录一下~。

过程中用到的爬虫函数就是最简单的这两个正则表达式:
re.search()
re.findall()
所有的代码我都加了详细的注释,上传到了我的github上。

文章目录

  • 第一步,获取每个房子的链接
  • 第二步,从每个房子链接中获得信息
    • 价格的获取
  • 第三步,读完的信息存到表格里面
  • 一点总结

第一步,获取每个房子的链接

先上自如网上看看这些房子在网页上都是什么一个逻辑:打开了主页http://www.ziroom.com/z/,随便点进一个房子的链接,http://www.ziroom.com/x/807283871.html。发现小区,面积,朝向,租金,大致位置这些信息,除了区域都有了。区域怎么办呢,于是我回去发现原来区域在首页找房子的时候就确定好了。http://www.ziroom.com/z/d23008614/?isOpen=0

一共有13个区域,每一个区域之间的差别仅仅在网址的d2300____后面的几位数里面。遍历一遍就可以了,但是我实在是懒得给这13个区域额外写函数遍历,就直接把各个区域的网址复制下来,做成了一个Array,代码如下

# 手动分出来北京的区域
district = ['d23008614', '东城', 'd23008626', '西城', 'd23008613', '朝阳', 'd23008618', '海淀', 'd23008617', '丰台','d23008623', '石景山', 'd23008625', '通州', 'd23008611',  '昌平', 'd23008615', '大兴','d23008629', '亦庄开发区', 'd23008624', '顺义', 'd23008616', '房山', 'd23008620', '门头沟']
for i in range(int(len(district) / 2)):# 第一层循环,各个区域的链接dis_link = "http://www.ziroom.com/z/" + district[2 * i] + "/?isOpen=0"

这样就有了我们的第一层循环:区域循环。用request.get()得到了这些区域以后,会发现每个区域下面都会有很多页,页码仅仅是在链接的后面加了一个"-p"再直接跟数字。也是可以直接循环的,问题就是不知道一共需要循环到多少页。有的区域是50页,有的只有8页。所以就直接在每个区域的网页代码里面用正则表达式搜索一下"共+数字+页"就可以得到了。也就是搜索这个地方的文字:

代码:

page_num = re.search('共(\d+)页', dis_page.text, re.S).group(1)

有了page_num,相当于我们已经有了区域下每一页的链接,就又可以遍历了。

for j in range(int(page_num)):print("\r第"+str(j+1)+"页,共"+page_num+"页", end='')sub_link = "http://www.ziroom.com/z/"+district[2 * i]+"-p"+str(j+1)+"/"

下一步,我们就需要从每一页的信息里面提取出每一个房子的链接了。这里面我观察了一个网页源代码,发现旦凡是房子的链接都是以www开头,.html结尾。而满足这个条件的链接除了房子,就只有一个http://www.ziroom.com/about/lianxi.html这个链接了。所以逻辑很简单,直接用re.findall()函数把符合条件的链接提取出来,遇到那个联系自如,就停下来就好了。

实际上在联系自如后面还是会有一堆房子链接,也是满足www—html条件的,点进去也是北京的房子。但是在浏览器界面上,联系自如下面就没有任何房子链接了。我也不知道源码上写这么一堆是什么意思。。就没管他。

联系自如这个链接前面的,都是两个两个的,看源代码就会发现,是房子的名称一个链接,房子的图片一个链接。所以遍历的时候跳着读就可以了。

代码:

for k in range(len(link_box)):if link_box[2*k] == '.ziroom.com/about/lianxi.':breaklink_info = link_box[2*k]link = "http://www"+link_info+"html"

到这,我们已经得到了所有的房子的链接。我对获取链接的代码进行了一些修饰,加了一些用户界面和链接去重,详细的代码在这里。

第二步,从每个房子链接中获得信息

打开房子的源代码,开始寻找每一个信息。这里面我对信息的提取的逻辑非常简单,先用一个大范围的re.search()找到一大段话,再用小范围的re.search()或re.findall()把我们要的变量获取到。

以建筑面积为例,我们看到源代码,约42m2的面积,如果上来只用<dd>和</dd>来做research的话,用脑子想一下也知道在整张网页上一定会有重复的。所以先用变量名,也就是Z_home_info和下一个变量名tip-tempbox,来做初步的筛选,再用一个简单的正则表达式就可以精确的筛选到了。代码如下:

# 信息
info = re.search('Z_home_b(.*?)tip-tempbox', page.text, re.S).group(1)
info2 = re.findall('<dd>(.*?)</dd>', info, re.S)
print("面积:", info2[0])
print("朝向:", info2[1])
print("户型:", info2[2])

到这,我们就筛选到了除了价格之外所有的信息,代码在这里。这个价格是最坑的,我打算用一章来写他

价格的获取

其他的所有变量,都是直接在源代码上用正则表达式匹配一下,就能得到了,但是价格他的源代码是大长串的链接:他不是数字打上去的,他是画上去的!画上去的背景。在浏览器界面,用鼠标选定的时候,其他的字都能选上,就他选不上。
那么背景是怎么显示成价格的呢?我们从他给的背景的源码看回去,发现是这么一张图:

这个图就是0-9随机排列一下。然后具体价格是多少,就看是从这张图扣下来的第几个数字。比如这个例子,看源代码,位置偏置信息分别是-62.48,-218.68,-187.44,-249.92,要除以-31.24,得到的数字再加1,就得到了offset是3,8,7,9,意思就是分别对应这张原图的第3,8,7,9个数,于是就是3490。每一次打开链接指向的原图也不一样,不同的图的数字顺序也不一样。真的是太太太太坑了。不得不说这反爬虫的做的真不错。于是我们要调用图像识别的API来识别这一串数字。

这里面我们就直接调用百度的API了,要登录https://ai.baidu.com,右上角控制台登录进去创建一个你自己的项目,然后得到一个API Key和Secret Key。具体怎么配置我直接参考的这个链接,这个连接,直接把他的代码复制下来,把AK,SK,和图片地址一改就能识别到了:https://blog.csdn.net/tang_xiaotang/article/details/91516654

他的这个代码要求上传一个本地的图片,格式是二进制格式,我也懒得研究怎么把在线图片转成二进制了,就直接用图像处理的库把图片存成本地的tem.jpg,再上传就可以了。

这个库读的数据有一些不准,有时候字符串开头的1,显示不出来,主要是因为精度不够高。但是每天能让我免费调用50000次的也就只有这一个库了,我也不说啥了。

识别图片的链接在这里。

到这,我们终于得到了所有的信息。

第三步,读完的信息存到表格里面

这一步没什么技术含量,存就完事儿了,但是这里面我写了一些故障控制,比如说爬链接没爬到的话,他就一直在那等,我们可不希望我们的程序一直在等等等,所以设置了一些超时断开。还有正如前面所说,有的价格识别的不准。还有的链接进去了是404,这样是爬不到我们的信息的。异常的链接我给安排了三次机会,如果在三次之内能正常获取到的话,也可以,获取不到就当做故障处理了。


故障率还是很低的,这从7300-7700只有一条是故障,另外还有四条是故障了三次之内,程序自己给纠正回来了。

把这些所有故障的都挑出来,存成一个Error.xls的Excel表格。剩下的存成一张Beijing.xls的表格。整个程序就算是写完了。

运行的时候要注意,最好是在命令行窗口里面运行。因为运行的时候因为网络不好,还是会出现程序卡住的情况,这时候直接给一个control+C,就可以跳过这一环节往下运行了。pycharm里面我没找到怎么用control+C,只能强制停止。这样实际上运行个1000多条就断了,只能从头再来。shell就更不用说了,连print() 配置一个end=’‘ 都不行。

一点总结

  1. 学会爬虫了,yeah!
  2. 感谢昆哥给我提供了大力帮助(

    适合初学者的 Python3爬虫获取自如网北京租房数据相关推荐

    1. 当当网最新上架图书html,基于Python3爬虫获取最新上架图书的实现

      2018.04 1 概述 主题网络爬虫, 根据一定的网页分析算法过滤与主 题无关的链接保留主题相关的链接井将其放入待抓取的 URL队列: 然后根据一定的搜索策略从队列中选择下一 步要抓取的 URL, ...

    2. python爬虫实例网易云-Python3爬虫实例之网易云音乐爬虫

      本篇文章给大家带来的内容是Python3爬虫实例之网易云音乐爬虫.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 此次的目标是爬取网易云音乐上指定歌曲所有评论并生成词云 具体步骤: ...

    3. python图片分析中央气象台降水量预报_获取中央气象台网的气象数据 全流程技术解析(python 爬虫)...

      一.Python环境搭建 下载安装python 下载安装PyCharm,Community版即可 理论上应该先安装python再安装IDE(PyCharm),必要时按网上要求进行环境变量设置. 二.爬 ...

    4. PythonR爬取分析赶集网北京二手房数据(附详细代码)

      本文转载自数据森麟(ID:shujusenlin) 作者介绍:徐涛,19年应届毕业生,专注于珊瑚礁研究,喜欢用R各种清洗数据. 知乎:parkson 如何挑战百万年薪的人工智能! https://ed ...

    5. python爬取二手房信息_刚刚接触PythonR?教你爬取分析赶集网北京二手房数据(附详细代码)...

      原标题:刚刚接触Python&R?教你爬取分析赶集网北京二手房数据(附详细代码) 源 /数据森麟文 /徐涛 前言: 本文主要分为两部分:Python爬取赶集网北京二手房数据&R对爬取的 ...

    6. 爬虫实战-链家北京房租数据

      爬虫实战-链家北京房租数据 本篇是对 恋习Python 发布的原创文章<北京房租大涨?6个维度,数万条数据帮你揭穿>中涉及的代码部分的解读. < 在复现原文代码时,出现了一些报错,在 ...

    7. 爬虫实战—拿下最全租房数据 | 附源码

      「关注我,和我一起放下灵魂,让灵魂去搬砖.」 作者:小一 介绍:放不下灵魂的搬砖者 全文共6329字,阅读全文需17分钟 点赞再看,养成好习惯 Python版本3.8.0,开发工具:Pycharm 写 ...

    8. python二手房价格预测_Python爬取赶集网北京二手房数据R对爬取的二手房房价做线性回归分析...

      前言:本文主要分为两部分:Python爬取赶集网北京二手房数据&R对爬取的二手房房价做线性回归分析.文章思路清晰,代码详细,特别适合刚刚接触Python&R的同学学习参考. Part1 ...

    9. python爬虫爬取58网站数据_Python爬虫,爬取58租房数据 字体反爬

      Python爬虫,爬取58租房数据 这俩天项目主管给了个爬虫任务,要爬取58同城上福州区域的租房房源信息.因为58的前端页面做了base64字体加密所以爬取比较费力,前前后后花了俩天才搞完. 项目演示 ...

    最新文章

    1. python中约瑟夫环程序_Python实现约瑟夫环问题的方法
    2. python模块手册_python模块说明
    3. 由树先序遍历和中序遍历输出其后续遍历
    4. ASP.NET MVC Tip #31: 给 Master Pages 和 User Controls 传递数据
    5. 需求分析阶段各种图的功能
    6. 小夕说,不了解动态空间增长的程序喵都是假喵(下)
    7. 用心整理,尽量最全,一套目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)...
    8. css 标签上 title 和 alt 的区别
    9. Office server webs app 集成(JAVA)
    10. mysql通配符大全_MySQL模糊查询用法大全(正则、通配符、内置函数等)
    11. linux 主机支持远程唤醒_Linux远程开机
    12. 闲鱼平台API,item_search - 按关键字搜索闲鱼商品
    13. HFSS仿真侧馈微带天线学习笔记
    14. 20.JVM监控以及诊断工具-GUI篇
    15. C语言bool类型定义
    16. K-means聚类分析与python实现
    17. Apple Watch如何重新配对
    18. R语言曲线回归:多项式回归、多项式样条回归、非线性回归数据分析
    19. Qt基础之二十:进程间通信
    20. java课程设计家庭财务管理系统_javaEE-课程设计-个人财务管理系统

    热门文章

    1. java将古诗竖排_java控制台输入古诗(从左到右)按古诗风格从右往左输出.doc
    2. 我生命中的钱事:创业!
    3. 咳嗽的四种食疗预防法
    4. VVC(H.266)视频压缩编码格式介绍
    5. Thinkphp安装报错解决办法
    6. 震惊!用Python探索《红楼梦》的人物关系!
    7. 信创只是开始_《洛克菲勒写给儿子的38封信》 26 《结束只是开始》
    8. 利用python统计表格元素数量
    9. C++-实验一 CMatrix类设计
    10. java销毁窗口_java – 如何正确销毁JDialog?