zoukankan      html  css  js  c++  java
  • 4. 使用Scrapy爬取链家房价

    这里通过使用Scrapy对链家上的成都新房进行爬取

    所需信息,房源名称,售价,大小,位置

    创建Spider

      
    import scrapy
    
    
    class homelink(scrapy.Spider):
        # 定义spider的名字,在调用spider进行crawling的时候会用到:
        #   scrapy crawl <spider.name>
        name = "homelink"
        # 如果没有特别指定其他的url,spider会以start_urls中的链接为入口开始爬取
        start_urls = [
            "https://m.lianjia.com/cd/loupan/"
        ]
    
        # 获取全部分页链接
        # 可以采用递归更好,这里只是已获取到所有页数,整简单点
        for page in range(1, 50):
            url = "https://m.lianjia.com/cd/loupan/pg{0}/".format(page)
            start_urls.append(url)
    
    
        # parse是scrapy.Spider处理http response的默认入口
        # parse会对start_urls里的所有链接挨个进行处理
        def parse(self, response):
            pass    

    分析网站:

      链接新房售价页面,每个房源对应一个item_list,找到房源名称div,。

    进一步分析每个房源信息,包括所对应的售价,位置信息,看似比较简单。

    接下来就是直接在spider回调函数中通过selector 把所要的信息拿出来,so easy。

    简单代码完整后:

    # -*- coding: utf-8 -*-
    
    import scrapy
    
    class homelink(scrapy.Spider):
        # 定义spider的名字,在调用spider进行crawling的时候会用到:
        #   scrapy crawl <spider.name>
        name = "homelink"
        # 如果没有特别指定其他的url,spider会以start_urls中的链接为入口开始爬取
        start_urls = [
            # "http://cd.fang.lianjia.com/zhuanti/50/",
            # "http://cd.fang.lianjia.com/zhuanti/50/pg2/",
            # "http://cd.fang.lianjia.com/zhuanti/50/pg3/",
            # "http://cd.fang.lianjia.com/zhuanti/50/pg4/",
            "https://m.lianjia.com/cd/loupan/"
        ]
    
        # 获取全部分页链接
        # 可以采用递归更好,这里只是已获取到所有页数,整简单点
        for page in range(1, 50):
            url = "https://m.lianjia.com/cd/loupan/pg{0}/".format(page)
            start_urls.append(url)
        # parse是scrapy.Spider处理http response的默认入口
        # parse会对start_urls里的所有链接挨个进行处理
        def parse(self, response):
            # 获取当前页面的房屋列表
            # print 'xxx', response
            # house_lis = response.xpath('//ul[@class="house-lst"]/li/div[@class="info-panel"]')
            # all_page = response.xpath('//*[@id="matchid"]/div/div/div')
            loupan = response.xpath("//div[@class='item_list']")
    
            with open("homelink.log", "ab+") as f:
                for house_li in loupan:
                    title = house_li.xpath(
                            './div[@class="item_main item_flexbox"]/span[@class="name text_cut"]/text()').extract_first()
                    where = house_li.xpath(
                            './div/span[@class="location text_cut"]/text()').extract_first()
                    area = house_li.xpath(
                            './div/div[@class="location"]/text()').extract_first()
                    price = house_li.xpath(
                            './div/div[@class="price_total"]/text()').extract_first()
                    # print "Title: {0}	Price:{1}	Link: {2} 	Area: {3}
    ".format(title.encode('utf-8'), price, where,
                    # print "Title:{0}	Price:{1}	Area:{2}	Link:{3}
    ".format(title.encode('utf-8'), price, area.encode('utf-8'),
                    #                                                      where.encode('utf-8'))
                    f.writelines(
                            "Title:{0}	Price:{1}	Area:{2}	Link:{3}	
    ".format(title.encode('utf-8'), price,
                                                                                     area.encode('utf-8').strip().replace(
                                                                                         ' ', ''),
                                                                                     where.encode('utf-8').strip().replace(
                                                                                         ' ', '')))

    生成结果如下(后面可以整个数据库存起来,分析下各区域房价走势。。呵呵呵):

      

    PS:

      1. 不知道为啥从链家首页进入所有新房页面,会跳转到移动版。。

      2. https网站直接爬取会被禁止,可设置ROBOTSTXT_OBEY = False。

      3. 写文件的时候老是最后两行空行,后来发现是原始数据里面很多空格,需要去掉。。坑!

    补充:

      对于有些网站防爬虫的,可以设置一些cookie, header模拟浏览器。

  • 相关阅读:
    ORACLE 利用 REPLACE函数替换字段字符串
    EXCEL中对1个单元格中多个数字求和
    Oracle插入日期格式出现 ORA-01843: not a valid month的解决办法
    深入浅出设计模式——装饰模式(Decorator Pattern)
    深入浅出设计模式——组合模式(Composite Pattern)
    深入浅出设计模式——桥接模式(Bridge Pattern)
    深入浅出设计模式——适配器模式(Adapter Pattern)
    深入浅出设计模式——单例模式(Singleton Pattern)
    深入浅出设计模式——原型模式(Prototype Pattern)
    深入浅出设计模式——建造者模式(Builder Pattern)
  • 原文地址:https://www.cnblogs.com/gcm688/p/6497536.html
Copyright © 2011-2022 走看看