今天,我们就以链家网南京地区为例,来学习爬取链家网的成交房源数据。

这里推荐使用火狐浏览器,并且安装firebug和firepath两款插件,你会发现,这两款插件会给我们后续的数据提取带来很大的方便。

首先创建一个名称为lianjia的项目。

需求分析

爬取数据的第一步当然是确定我们的需求,大方向就是我们想拿到南京地区的房源成交信息,但是具体的细节信息,我们需要从网页来看,,我们直接在浏览器中输入以下的网址https://nj.lianjia.com/chengjiao/,会显示南京地区的成交的房源信息,包括名称,房屋简介,地理位置,成交日期,成交价格,成交单价等详细信息,这样我们就确定了我们想要的信息,我们在items.py文件中定义如下的一些字段。

#items.py
from scrapy import Item,Fieldclass LianjiaItem(Item):region = Field()      #行政区域href = Field()        #房源链接name = Field()        #房源名称style = Field()       #房源结构area = Field()           #小区orientation = Field()    #朝向decoration = Field()     #装修elevator = Field()       #电梯floor = Field()          #楼层高度build_year = Field()     #建造时间sign_time = Field()      #签约时间unit_price = Field()     #每平米单价total_price = Field()    #总价fangchan_class = Field()   #房产类型school = Field()         #周边学校subway = Field()         #周边地铁

请注意,以上的信息,并不是每一套房源都有的,比如下面的地铁,学校,很多房源都是没有的。

问题

  • 你会发现一个问题,每一个页面会呈现30条的房源信息,最下面一共可以显示100页,总计最多也就是3000条信息,南京地区的成交房源信息肯定不止这区区的3000条,那么如果直接从这个页面通过翻页来获取数据,最多只能获取到3000条信息,所以我们这里需要转思路。

  • 还是这个页面,可以看到页面上部列出了南京地区的行政区,我们随意选择一个,会发现,新的页面依然是每一页30条,共计100页,但是我们有11个行政区,那么其数量也是翻了好几倍了。

  • 这个时候,你可能还是不满足,我们想办法看一下是不是还可以进一步向下划分,没错那就是小区,我们把房源从11个行政区划分到小区上,以小区为单位,每一个小区上面还有房源数据,这样的话,我们的信息可以说比较全面了,当然了,我们需要做的工作也是要翻倍的。

总结

这里我们通过分析,总结出了如下的思路:

  • 以行政区为单位,先获取南京地区所有的小区信息
  • 以小区为单位,获取每一个小区里面的房源数据
  • 最后就是获取具体的每一个房源的信息。

具体实施

现在明确了我们的思路,下面就开始具体的实施。

编写spider.py文件

from scrapy import Spider,Request
import re
from lxml import etree
import json
from urllib.parse import quote
from lianjia.items import LianjiaItemclass Lianjia_spider(Spider):name = 'lianjia'allowed_domains = ['nj.lianjia.com']regions = {'gulou':'鼓楼','jianye':'建邺','qinhuai':'秦淮','xuanwu':'玄武','yuhuatai':'雨花台','qixia':'栖霞','jiangning':'江宁','liuhe':'六合','pukou':'浦口','lishui':'涟水','gaochun':'高淳'}def start_requests(self):for region in list(self.regions.keys()):url = "https://nj.lianjia.com/xiaoqu/" + region + "/"yield Request(url=url, callback=self.parse, meta={'region':region}) #用来获取页码def parse(self, response):region = response.meta['region']selector = etree.HTML(response.text)sel = selector.xpath("//div[@class='page-box house-lst-page-box']/@page-data")[0]  # 返回的是字符串字典sel = json.loads(sel)  # 转化为字典total_pages = sel.get("totalPage")for i in range(int(total_pages)):url_page = "https://nj.lianjia.com/xiaoqu/{}/pg{}/".format(region, str(i + 1))yield Request(url=url_page, callback=self.parse_xiaoqu, meta={'region':region})def parse_xiaoqu(self,response):selector = etree.HTML(response.text)xiaoqu_list = selector.xpath('//ul[@class="listContent"]//li//div[@class="title"]/a/text()')for xq_name in xiaoqu_list:url = "https://nj.lianjia.com/chengjiao/rs" + quote(xq_name) + "/"yield Request(url=url, callback=self.parse_chengjiao, meta={'xq_name':xq_name, 'region':response.meta['region']})def parse_chengjiao(self,response):xq_name = response.meta['xq_name']selector = etree.HTML(response.text)content = selector.xpath("//div[@class='page-box house-lst-page-box']")  #有可能为空total_pages = 0if len(content):page_data = json.loads(content[0].xpath('./@page-data')[0])total_pages = page_data.get("totalPage")  # 获取总的页面数量for i in range(int(total_pages)):url_page = "https://nj.lianjia.com/chengjiao/pg{}rs{}/".format(str(i+1), quote(xq_name))yield Request(url=url_page, callback=self.parse_content, meta={'region': response.meta['region']})def parse_content(self,response):selector = etree.HTML(response.text)cj_list = selector.xpath("//ul[@class='listContent']/li")for cj in cj_list:item = LianjiaItem()item['region'] = self.regions.get(response.meta['region'])href = cj.xpath('./a/@href')  if not len(href):continueitem['href'] = href[0]content = cj.xpath('.//div[@class="title"]/a/text()') if len(content):content = content[0].split()  # 按照空格分割成一个列表item['name'] = content[0]item['style'] = content[1]item['area'] = content[2]content = cj.xpath('.//div[@class="houseInfo"]/text()')if len(content):content = content[0].split('|')item['orientation'] = content[0]item['decoration'] = content[1]if len(content) == 3:item['elevator'] = content[2]else:item['elevator'] = '无'content = cj.xpath('.//div[@class="positionInfo"]/text()')if len(content):content = content[0].split()item['floor'] = content[0]if len(content) == 2:item['build_year'] = content[1]else:item['build_year'] = '无'content = cj.xpath('.//div[@class="dealDate"]/text()')if len(content):item['sign_time'] = content[0]content = cj.xpath('.//div[@class="totalPrice"]/span/text()')if len(content):item['total_price'] = content[0]content = cj.xpath('.//div[@class="unitPrice"]/span/text()')if len(content):item['unit_price'] = content[0]content = cj.xpath('.//span[@class="dealHouseTxt"]/span/text()')  if len(content):for i in content:if i.find("房屋满") != -1:  # 找到了返回的是非-1得数,找不到的返回的是-1item['fangchan_class'] = ielif i.find("号线") != -1:item['subway'] = ielif i.find("学") != -1:item['school'] = iyield item

我们对上面关键的地方进行解释:

  • start_requests
    这个就是我们以行政区为单位,目的是爬取每一个行政区的小区列表。
  • parse
    对行政区返回的response进行解析,我们目的是拿到这个大的行政区,包含多少个页面,其中的
    total_pages就是具体的页面数,接下来就是按照页码请求每一个页面。
  • parse_xiaoqu
    上面返回了每一个页面的信息,这个时候我们就把当前页面的小区列表拿到,而后,在针对小区列表,每一个小区进行一次请求。
  • parse_chengjiao
    解析小区的页面数,上面说到了,我们请求了每一个小区数据,这个小区肯定不止包含一页的数据,那么我们这个方法就是将这个小区包含的页面数抽取出来,而后针对每一个页面进行请求
  • parse_content
    这个方法就是解析具体的页面了,可以看到,这个方法里面包含了非常多的条件判断,这是因为,我们之前定义的item字段里面的信息,并不是每一个小区都有的,就是说,我们要的信息他不是一个规规矩矩的信息,很多的房源没有提供相关的信息,比如地铁,周边学校等等的信息,我们这里就是如果有这个信息,我们就把它提取出来,如果没有的话,我们就给他自定义一个内容
    。最后将item提交给item pipeline进行后续的处理。

由于这一节的信息比较多,我们就把它分为两个小节,在下一节中,我们对拿到的数据进行后续的处理。

Scrapy实战篇(一)之爬取链家网成交房源数据(上)相关推荐

  1. Scrapy实战篇(二)之爬取链家网成交房源数据(下)

    在上一小节中,我们已经提取到了房源的具体信息,这一节中,我们主要是对提取到的数据进行后续的处理,以及进行相关的设置. 数据处理 我们这里以把数据存储到mongo数据库为例. 编写pipelines.p ...

  2. python爬取链家网的房屋数据

    python爬取链家网的房屋数据 爬取内容 爬取源网站 爬取内容 爬取思路 爬取的数据 代码 获取房屋url 获取房屋具体信息 爬取内容 爬取源网站 北京二手房 https://bj.lianjia. ...

  3. 爬取链家网北京房源及房价分析

    爬取链家网北京房源及房价分析 文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍 1.数据获取 # 获取某市区域的所有 ...

  4. Python爬取链家网获取二手房数据并调用高德api获得经纬度

    链家网获得数据地址,高德api获得经纬度(同理链家网也可以换成其他58同城,赶集网的数据,因为反爬虫比较厉害,没时间整,就用链家网的数据先试试水) 首先爬链家网,Info包含一条信息 import j ...

  5. python爬虫——使用bs4爬取链家网的房源信息

    1. 先看效果 2. 进入链家网,这里我选择的是海口市点击跳转到链家网 3. 先看网页的结构,这些房子的信息都在li标签,而li标签再ul标签,所以怎么做大家都懂 4. 代码如下,url的链接大家可以 ...

  6. 爬取链家网二手房数据并保存到mongodb中

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 爬取链家网二手房数据并保存到mongodb中 文章目录 前言 一.爬虫的介绍 二.协程的介绍 三.css选择器 四.基于asyncio ...

  7. 基于python多线程和Scrapy爬取链家网房价成交信息

    文章目录 知识背景 Scrapy- spider 爬虫框架 SQLite数据库 python多线程 爬取流程详解 爬取房价信息 封装数据库类,方便多线程操作 数据库插入操作 构建爬虫爬取数据 基于百度 ...

  8. python爬取链家新房_Python爬虫实战:爬取链家网二手房数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 买房装修,是每个人都要经历的重要事情之一.相对于新房交易市场来说,如今的二手房交易市场一点也 ...

  9. python爬取链家新房数据_Python爬虫实战:爬取链家网二手房数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 买房装修,是每个人都要经历的重要事情之一.相对于新房交易市场来说,如今的二手房交易市场一点也 ...

最新文章

  1. excel另存为没有dbf_PDF转Excel怎么做的?节省工作时间,你要学会的办公技巧
  2. (转载)机器学习知识点(十二)坐标下降法(Coordinate descent)
  3. 【转】C# 中文URL编码
  4. php基础标签大全,HTML基础之HTML常用标签
  5. linux-basic(12)正则表达式与文件格式化处理
  6. [Silverlight]16进制颜色转ARGB及Color转Int32
  7. 解决:Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRA
  8. MATLAB imshow之后在四周加上边框
  9. 美国只有两样东西比中国贵
  10. 【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解
  11. c语言数组前缀和,关于最大子数组问题
  12. .NET的RedisProvider
  13. 【Vue】—项目的目录结构介绍
  14. “菜鸟”和“大神”de区别
  15. python打开txt文件
  16. linux系统ss命令详解,ss命令 - Linux命令大全 | linux教程
  17. 电脑开机后实现自动开启移动热点,再也不用担心没流量了
  18. html之解决边框重合问题,鼠标移动文字上文字抖动问题
  19. h3c linux驱动 wn612_安装Ubuntu双系统系列——64位Ubuntu安装H3C的INode客户端
  20. 4.1图像分割之区域生长法

热门文章

  1. javascript mobile web
  2. java中字符串转化为Ascii码
  3. Wcf 接收对http://*.*.*.*的的 HTTP 响应时发生错误... 的解决方法
  4. QT中封装的IP地址的widget
  5. Cacti安装插件:email,msn,fetion报警(转载)
  6. Android学习记录:SQLite数据库、res中raw的文件调用
  7. PAT甲级1083 List Grades:[C++题解]结构体、排序
  8. 安卓实训项目:基于储存卡音乐播放器实训报告4.0
  9. java中override快捷键_【基础回溯1】面试又被 Java 基础难住了?推荐你看看这篇文章。...
  10. java 多线程 异步日志_精彩技巧(1)-- 异步打印日志的一点事