用Python来扒Q房网

作者: Garfield_Liang | 来源:发表于2017-02-24 21:31 被阅读804次

<p>嗯,这一篇文章更多是想分享一下我的网页分析方法。玩爬虫也快有一年了,基本代码熟悉之后,我感觉写一个爬虫最有意思的莫过于研究其网页背后的加载过程了,也就是分析过程,对性能没有特殊要求的情况下,编程一般是小事。</p>

<p>以深圳地区的Q房网为例吧。Q房网的主页非常简洁,输入相应的地区就可以找到对应的二手房或者一手房。这一篇文章主要就给大家介绍我在做Q房网爬虫的分析过程。</p>

<p>注意:本文采用Chrome作为分析加载工作,如果使用其他浏览器,请参考具体的规则。</p>

首先想到的

<p>嗯,你首先要跳出编程,从使用者甚至是产品经理的角度去思考:在浏览这个页面的时候,如何就能看到全市的二手房的情况。通过主页的一个区一个区的输入,搜索,然后将页面的单元下载,嗯这是一个方法。</p>

南山区首页的情况

<p>如上图所示,只要更改keyword后面的参数,就可以获得不同区的二手房数据。编程的时候只需要手动写入一个含有各个区的list,然后通过循环去更改keyword后面的参数,从而开始一个区域,再爬取其中的链接。这个方法确实是可行的,深圳一共也没有多少个区。这个方法我试过是可行的。</p>

我实际想说的

<p>上面的这个方法固然可行,但并不是我想推荐的方法,大家看回首页,搜索栏旁边有一个地图找房。点进去你就能看到深圳全区域的房子,要是能在这里弄个爬虫,不就简单多了。</p>

地图找房位置 深圳全区域的二手房

<p>可以看到截图的右侧有所有二手房的链接,我们的任务就是下载右边的所有二手房的数据。首先第一步就先查看页面的源代码(Ctrl+U),可以从右边链表那里复制一些关键字,在源代码里面找找看,在源代码里面Ctrl+F搜索观澜湖试试,结果是没有,再尝试几个关键词好像都没有,但通过检查元素(Ctrl+Shift+I),是可以定位到这些关键词的位置。这样可以初步判断右边的链表是通过Js来加载,需要证实。</p>

关键词**观澜湖**的在源代码里面的搜索结果 关键词**观澜湖**的在页面元素里面的搜索结果

<p>尝试对观澜湖上方的元素在源代码里面定位,例如no-data-wrap bounce-inup dn,就可以在源代码里面找到。仔细对比一下两边的上下文,可以看到在节点<ul id ="roomList">下面的内容有非常大的差异。通过这个roomList作为关键词继续查找。</p>

**no-data-wrap bounce-inup dn** 在检查元素内的位置 **no-data-wrap bounce-inup dn** 在源代码的位置

<p>在检查元素里面可以发现roomList下面的加载的内容就是我们所需要的房屋列表,并且这部分内容再源代码里面没有。而在源代码页通过搜索roomList,却发现出现在script里面,证实roomList里面的内容是通过Js来加载的:</p>

源代码中roomList出现的位置

<p>下面就变成是找这个roomList了,由于是通过js加载的,打开控制台的network,并重新刷新页面,查看页面里面各个元素的加载过程,在过滤器里面输入roomList,可以找到一条信息:</p>

roomList的搜索结果

<p>点开看response里面下载的内容,发现那不就是我们要找的东西吗!里面有给出详细的页面数量(roomPageSize),那一个个的八位数字显然就是每一个房子的id嘛,然后每一页的加载数量是一定的,下面有对应id里面有房子的经纬度、户型、面积以及朝向等等信息(在这里做一个提醒,需要做heatmap的同学注意了,这里的经纬度用的是百度坐标,如果你后续可视化用的是google地图、高德或者GPS,是需要转换坐标的)。</p>

roomList的内容

<p>找到内容之后,接着就是看他的Headers,看看是如何加载的。</p>

  • Request Url表明其访问的链接,Request Method表明他的请求方法是Post;
  • Request的头定义(Headers)里面包括Host、Origin、Referer、User-Agent等;
  • 请求的参数(parameters)里面有三个参数,这三个参数是直接放映在其Url链接上面,里面包括当前页的页码(currentPage)、页面大小(pageSize)以及s(这个s一开始也不同清楚是什么,但是发现每一次请求都有变化,后面才知道这个是时间戳,表示1970纪元后经过的浮点秒数);
  • 此外Post函数还可以发送数据到服务器做请求,这里所发送的数据包括始末经纬度、gardenId(这个到后期发现是对应的小区编号)和zoom(代表地图上面放大以及缩小的倍数,数字越大,放大倍数越高)
Header第一页 Herader第二页

<p>基本扒到这里,对整个页面就比较清晰了,也知道我们的爬虫要怎么去写了。</p>

开始写代码了

<p>逻辑整理出来后,整个代码就写的非常轻松了。首先通过post方式访问http://shenzhen.qfang.com/map/sale/roomList,通过正则表达式提取Reponse里面的roomPageSize,或者最大页数。然后对每一页的内容进行爬取,并将信息输出。</p>

<p>第一部分,加载库,需要用到requests, bs4, re, time(time是用来生成时间戳):</p>

from bs4 import BeautifulSoup
import requests, re, time

<p>第二部分,通过设定合理的post数据以及headers,通过post下载数据。其中payload里面包括地图所展示的经纬度信息(这个信息怎么获得,在Q房网页面上通过鼠标拖拉,找到合适的位置之后,到控制台Header内查看此时的经纬度就好了),headers则包含了访问的基本信息(加上有一定的反爬作用):</p>

url = 'http://shenzhen.qfang.com/map/sale/roomList'
payload = {'latitudeFrom':22.484438,
           'latitudeTo':22.83449,
           'longitudeFrom':113.844809,
           'longitudeTo':114.52206,
           'gardenId':'',
           'zoom':12}
headers = {'Host':'shenzhen.qfang.com',
           'Origin':'http://shenzhen.qfang.com',
           'Referer':'http://shenzhen.qfang.com/map/sale',
           'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
params = {'currentPage':1,
          'pageSize':15,
          's':time.time()}
response = requests.post(url, data=payload, headers = headers, params = params)
content = BeautifulSoup(response.text, 'lxml')
content

<p>页面下载后,对于第一次下载首先需要用正则表达式获得最大页面数,我们真正需要的内容结合Beautiful的get和find以及re来抓取就可以了:</p>

rommPageSize = re.search('roomPageSize=(\d*)', content.script.text).group(1)
for page in range(int(rommPageSize)):
    params['currentPage'] = page+1
    ##更新页数之后,需要重新request,然后用BeautifulSoup进行分析在爬取数据
    for li in content.find_all('li', class_='clearfix'):
        roomid = li.get('roomid')
        lat = li.get('lat')
        lng = li.get('lng')
        title = li.get('title')
        pSpan = li.find('p', class_ = 'hs-info-model clearfix')
        model = pSpan.span
        area = model.find_next('span')
        direction = area.find_next('span')
        print([roomid, lat, lng, title, model.text, area.text, direction.text])

<p>给一个在控制台里面输出的效果:</p>

最后的效果

最后

<p>这篇文章给出了我在写Q房网爬虫的整个分析的思路,如果你喜欢或者有其他的方法请分享,欢迎在评论区里面留言,也可以通过点赞,打赏的形式来支持我~</p>

相关文章

  • 用Python来扒Q房网

    嗯,这一篇文章更多是想分享一下我的网页分析方法。玩爬虫也快有一年了,基本代码熟悉之后,我感觉写一个爬虫最有意思的莫...

  • 热烈欢迎易居中国、Q房网莅小白租临指导工作

    细雨蒙蒙,小白租宁波总部迎来了两位地产界重量级的嘉宾——易居二手房研究院董琪院长和Q房网培训总监、Q房网·杭州“时...

  • python爬取历史天气数据

    原文链接: 环境说明 扒取的网站:天气网,http://lishi.tianqi.com/ Python版本:2....

  • 童年(三十九)

    (捉虾二) 我们家最常用的捉虾方式,是用扒网,俗称扒虾。一个人就能捉虾,而且可以流动作战。但是大扒网也是有...

  • 7.26

    上午: q房网一次培训助攻 下午: 百亿鸿回访送海报 问题: 1.录房难,有人因为录房手...

  • macs3 安装(Python)

    Q: 为啥用Python安装? A: 源码安装失败了!捂脸。。。。 Q: 咋失败的? A:git clone gi...

  • 用python帮你扒数据

    最近想写一篇文章,题目都想好了,叫《“双一流”高校治理体系的现代化——基于42所高校大学章程的文本分析》。起这个标...

  • python爬取小猪短租网信息

    用python的requests,bs4等库爬取了小猪短租网的杭州租房信息。注意 有些房子居然没有写地址,这房还怎...

  • Python——Pygame模块

    学习资料: Pygame官网 pygame系列 PyGame - Python Wiki 用Python和Pyga...

  • Python如何运行程序

    Python的运行 Q:什么是Python解释器 A:Python 解释器是运行Python程序的程序 Q:什么是...

网友评论

  • 菠萝仔GIS:楼主您好,爬到的数据很多是重复的,几千条数据去重后只有一百多条,请问怎么解决?(数据保存前已经根据id号进行判断,不过还是不行)
    Garfield_Liang:好想是的,但我之前是没有这个问题的。可能Q房网内部机制做了变化,我要看看再回复
  • 9a966c22fe28:挺好的!
  • 墙角:params['currentPage'] = page+1
    这一行运行为什么会出现:
    coercing to Unicode : need string or buffer , int found......百思不得其解:sob:
    Garfield_Liang: @墙角 是一点基础都没有就开始了吗
    墙角:@Garfield_Liang :smile: 谢谢回复,我才学第四天感觉挺迷茫的……
    Garfield_Liang:@墙角 这里我写错了。。。从正则表达式出来之后,roomPageSize是一个string。。需要转译维int。。。已经修改了。。

本文标题:用Python来扒Q房网

本文链接:https://www.haomeiwen.com/subject/irxywttx.html