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}\tPrice:{1}\tLink: {2} \tArea: {3}\r\n".format(title.encode('utf-8'), price, where,
                # print "Title:{0}\tPrice:{1}\tArea:{2}\tLink:{3}\r\n".format(title.encode('utf-8'), price, area.encode('utf-8'),
                #                                                      where.encode('utf-8'))
                f.writelines(
                        "Title:{0}\tPrice:{1}\tArea:{2}\tLink:{3}\t\n".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模拟浏览器。

 

 

posted @ 2017-03-03 17:04  小阿Q的博客  阅读(3786)  评论(0编辑  收藏  举报