Scrapy爬取二手房信息+可视化数据分析

本篇介绍一个scrapy的实战爬虫项目,并对爬取信息进行简单的数据分析。目标是北京二手房信息,下面开始分析。

网页结构分析

采用安居客网页信息作为二手房的信息来源,直接点击进入二手房信息的页面。


每页的住房信息:


点开链接后的详细信息:


博主并没有采用分区域进行爬取,博主是直接进行全部爬取,然后循环下一页完成的。步骤很简单,如下:


  1. 先把每一页的所有二手住房详细链接爬取到

  2. 请求每一个爬取到的详细链接,解析住房信息

  3. 完成所有解析后,请求下一页的链接

  4. 返回步骤一循环,直到返回内容为空


Scrapy代码实现


数据结构定义


Scrapy中的元数据field其实是继承了Python中的字典数据类型,使用起来很方便,博主直接定义了几个住房的信息,如下代码所示。当然还有高级的用法,配合itemloader加入processor,这里只使用简单的定义即可。


class AnjukeItem(scrapy.Item):
   # define the fields for your item here like:
   # name = scrapy.Field()
   price = scrapy.Field()
   mode = scrapy.Field()
   area = scrapy.Field()
   floor = scrapy.Field()
   age = scrapy.Field()
   location = scrapy.Field()
   district = scrapy.Field()
   pass


爬虫解析

  • 定义了一个继承Scrapy自带的爬虫类Spider

  • 然后一个必不可少的东西是name,它贯穿了整个Scrapy的始终,后面会看到它的作用。

  • start_urls是初始请求的url的列表,也可以有多个初始url,这里只有一个。

  • 由于ScrapySpider类中默认使用了Request请求,因此这里选择不覆盖Request,使用默认请求,且请求中调用parse回调函数。

  • 解析部分用Scrapy的高级selector选择器的xpath进行解析。


parse函数请求中有两个yield,代表生成器。

  • 第一个yield返回每一页的下一页链接next_pageurl。

  • 第二个yield返回每一页所有的住房详细链接,并再次Request请求跟进,然后调用下一个回调函数parse_detail


请求的过程中如果速度过快,会要求输入验证码,这里放慢了请求速度,暂不处理验证部分(后续慢慢介绍)。


class AnjukeSpider(scrapy.Spider):
   name = 'anjuke'
   # custom_settings = {
   #     'REDIRECT_ENABLED': False
   # }
   start_urls = ['https://beijing.anjuke.com/sale/']
   def parse(self, response):
       # 验证码处理部分
       pass
       # next page link
       next_url = response.xpath(
           '//*[@id="content"]/div[4]/div[7]/a[7]/@href').extract()[0]
       print('*********' + str(next_url) + '**********')
       if next_url:
           yield scrapy.Request(url=next_url,
                                callback=self.parse)
       # 爬取每一页的所有房屋链接
       num = len(response.xpath(
           '//*[@id="houselist-mod-new"]/li').extract())
       for i in range(1, num + 1):
           url = response.xpath(
               '//*[@id="houselist-mod-new"]/li[{}]/div[2]/div[1]/a/@href'
                   .format(i)).extract()[0]
           yield scrapy.Request(url, callback=self.parse_detail)

parse_detail回调函数中使用itemloader解析items住房信息,并返回载有信息的item

    def parse_detail(self, response):
       houseinfo = response.xpath('//*[@class="houseInfo-wrap"]')
       if houseinfo:
           l = ItemLoader(AnjukeItem(), houseinfo)
           l.add_xpath('mode', '//div/div[2]/dl[1]/dd/text()')
           l.add_xpath('area', '//div/div[2]/dl[2]/dd/text()')
           l.add_xpath('floor', '//div/div[2]/dl[4]/dd/text()')
           l.add_xpath('age', '//div/div[1]/dl[3]/dd/text()')
           l.add_xpath('price', '//div/div[3]/dl[2]/dd/text()')
           l.add_xpath('location', '//div/div[1]/dl[1]/dd/a/text()')
           l.add_xpath('district', '//div/div[1]/dl[2]/dd/p/a[1]/text()')
           yield l.load_item()


数据清洗

由于爬取后的items数据很乱,有各种\n,\t等符号,因此在pipelines中进行简单的清理工作,使用正则表达式实现,代码如下:


import re
def list2str(value):
   new = ''.join(value).strip()
   return new
class AnjukePipeline(object):
   def process_item(self, item, spider):
       area = item['area']
       price = item['price']
       loc = item['location']
       district = item['district']
       mode = item['mode']
       age = item['age']
       floor = item['floor']
       modes = list2str(mode)
       item['area'] = int(re.findall(r'\d+', list2str(area))[0])
       item['age'] = int(re.findall(r'\d+', list2str(age))[0])
       item['floor'] = list2str(floor)
       item['location'] = list2str(loc)
       item['district'] = list2str(district)
       item['price'] = int(re.findall(r'\d+', list2str(price))[0])
       item['mode'] = modes.replace('\t', '').replace('\n', '')
       return item

别忘记在setting里面设置pipeline参数。

ITEM_PIPELINES = {
  'anjuke.pipelines.AnjukePipeline': 300,
}


命令行运行

我们想要将爬取的数据输出到一个文件中,csv或者json,我们这里输出为csv格式的文件。

Scrapy中只需要一个command指令即可完成,在项目文件下的命令行输入:


scrapy crawl anjuke -o items.csv

命令行中的anjuke就是最开始我们定义的name

开始进行爬取:


数据可视化分析

爬取数据后,我们得到了一个csv文件,打开显示如下:


然后,我们将使用jupyter notebook进行数据分析,代码如下:



简单分析一下各大区的每平米二手房单价和各大区二手房数量,数据仅为部分,博主没等数据全部爬取完,仅供参考。当然也可根据实际情况进行更复杂的数据分析和机器学习进行房价预测。


效果图如下:


总结

本篇只是一个简单的例子,一个完整的高效的爬虫还有很多需要完善。

  • 加入代理ip池

  • scrapd的部署分布式爬虫

  • 增量式的爬虫考虑

  • ....

这些将在后续会慢慢进行介绍,完毕。

  • 6
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 安居客出租房(武汉为例)爬虫+数据分析+可视化 这个爬虫是我前段时间在淘宝上做单子的时候遇见的一个客户需求。本来以为就是一个简单的爬虫项目。但后面客户加了数据清洗和数据分析的要求。而后又加了要详细代码解释的需求等等。直到最后客户坦白说这是他们大专的毕设.......但是这个单子坐下来只有200左右,我想了一下,感觉好亏啊。在淘宝上随便找一个做毕设的都要好多钱的,而且客户本身的代码能力、数学、逻辑能力都很差,导致我每行都给注释以及看不懂,在我交付代码后又纠缠了我一个多礼拜。反正总体做下来的感觉就是烦躁。头一次感觉到了客户需求变更带来的巨大麻烦。 总之这是一次不是很愉快的爬虫经历。但是作为我写爬虫以来注释最详细的一次,以及第一次真正使用像matplotlib这种数据分析库的代码,我认为还是有必要分享出来给大家当个参考的(PS:大佬轻拍~)。爬虫本身几乎没有什么难度,写的也比较乱,敬请见谅。 **功能** 爬取安居客上的出租房信息(武汉地区的),并通过爬取的数据进行数据清洗以及数据分析。给出四个不同层面的可视化图。最终结果如下图所示: ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/1.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/2.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/3.png) ![Image text](https://raw.githubusercontent.com/srx-2000/git_spider/master/anjuke_room_rent_info/result/4.png) **环境** 1. Windows 10 2. python3.7 **使用方法** 首先声明该爬虫由于是特定情况下写的,所以本身的通用性特别差,仅可以对安居客网站上的武汉的出租房信息进行爬取,且需要自己手动更新cookie。同时在对数据进行分析及可视化的时候由于也是特别针对武汉出租房的进行的,所以针对性也比较强。如果别的需求需要自己进行更改。 1. 访问[安居客网址](https://wuhan.anjuke.com/),获取cookie。 > tip:获取cookie的方法可根据[此链接](https://jingyan.baidu.com/article/5d368d1ea6c6e33f60c057ef.html) 2. 在项目中找到`spider.py`的文件,将第12行的cookie换成你自己的cookie。 3. 运行`spider.py`,获取房源信息。运行后应会产生一个`武汉出租房源情况.csv`的文件。此文件为我们从安居客爬取的房源信息,其中包含`房屋租住链接、房屋描述、房屋地址、房屋详情(户型)以及经纪人、房屋价格`五个属性。 4. 在获取了数据之后我们运行`matplotlib.py`文件。进行数据清洗,分析,可视化。运行后即可获得**功能**中展示四个图片。 **技术栈** 1. request 2. parsel 3. pandas 4. matplotlib **进步(相比之前)** 此次爬虫相比之前的技术上可以说有减无增。但其中注释相当详细,可谓是每行代码都有注释。所以对于初学者应该有一些用处。同时使用matplotlib进行了数据分析可视化等。对于数据处理的代码的注释也是几乎每行都有注释的。
好的,下面是一个基于Scrapy和数据可视化的考研数据爬取和展示案例: 1. 分析考研数据网站的页面结构和数据接口,确定需要爬取的数据字段和请求方式。假设目标网站为“考研帮”(https://www.kaoyan.com/)。 2. 使用Scrapy框架创建一个新的Spider,定义起始URL和解析函数。在解析函数中,使用XPath或CSS选择器提取页面中的数据,并将其存储到Item对象中。需要爬取的数据可能包括考研院校、专业、科目、分数线等信息。 3. 在Spider中配置Pipeline,将Item对象中的数据存储到本地文件或数据库中,并使用pandas库进行数据清洗和处理。可以将数据保存为CSV或Excel格式,以便在后续的数据可视化中使用。 4. 在本地创建一个HTML文件,并使用Bootstrap和Chart.js等库进行数据可视化设计。在HTML中嵌入JavaScript代码,使用Ajax技术从本地读取数据,并将其转换为图表或地图等可视化效果。例如,可以使用柱状图展示各院校的分数线情况,使用地图展示各省份的考研人数和录取情况等。 5. 运行Spider,使用命令行工具或IDE启动爬虫,等待爬取结果。 6. 在本地打开HTML文件,查看可视化效果,对数据进行交互式操作和分析。可以根据自己的需求和兴趣,设计不同类型的图表和可视化效果,以达到更好的展示效果和数据分析目的。 需要注意的是,考研数据涉及敏感信息,因此在进行爬取和处理时应该遵守相关法律法规和保护用户隐私的原则。另外,数据可视化需要有一定的前端编程和设计经验,如果您不熟悉相关技术,可以参考一些在线教程或模板,快速搭建可视化页面。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值