Scrapy中古住宅情報+可視化データ分析


著者:xiaoyu微信公衆番号:Pythonデータ科学知乎:Pythonデータアナリスト
本編では,scrapyの実戦爬虫類プロジェクトを紹介し,爬虫類情報の簡単なデータ分析を行った.目標は で、分析を開始します.
Web構造解析
安居客のホームページ情報を中古住宅の情報源として採用している.中古住宅情報のページを直接クリックします.
各ページの住宅情報:
点開リンク後の詳細:
ブロガーは区域別に這い出すのではなく、ブロガーは直接すべて這い出し、次のページをループして完成した.手順は簡単です.次のようになります.
  • まず各ページのすべての中古住宅の詳細なリンクを
  • に登ります.
  • は、各登った詳細なリンクを要求し、住宅情報
  • を解析する.
  • すべての解析が完了すると、次のページへのリンク
  • が要求される.
  • は、戻るコンテンツが空の
  • になるまでステップのループを返す.
    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があってもよいが、ここでは1つしかない.
  • ScrapySpiderクラスではRequestリクエストがデフォルトで使用されているため、ここではRequestを上書きしないことを選択し、デフォルトリクエストを使用し、リクエストでparseコールバック関数を呼び出す.
  • 解析部は、Scrapyの上位selectorセレクタのxpathで解析する.
  • parse関数要求には、ジェネレータを表す2つのyieldがあります.
  • 第1のyieldは、各ページの次のページリンクnext_pageurlを返す.
  • 第2の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のデータは乱れており、様々な
    ,\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('
    ', '') return item
    settingpipelineパラメータを設定することを忘れないでください.
    ITEM_PIPELINES = {
       'anjuke.pipelines.AnjukePipeline': 300,
    }

    コマンドライン実行
    私たちは登ったデータを1つのファイルに出力したいです.csvまたはjsonです.ここではcsv のファイルを出力します.
    Scrapyではcommandのコマンドが1つで完了し、プロジェクトファイルの下のコマンドラインに入力します.
    scrapy crawl anjuke -o items.csv

    コマンドラインのanjukeは、最初に定義したnameです.
    爬取開始:
    データ可視化分析
    データを取得すると、csvのファイルが表示されます.
    次に、jupyter notebookを使用してデータ分析を行います.コードは次のとおりです.
    各区の を簡単に分析してみると、データは部分的で、ブロガーはデータを全部登っていないので、参考にしてください.もちろん、実際の状況に基づいてより複雑なデータ分析と機械学習を行い、住宅価格の予測を行うこともできます.
    効果図は以下の通りです.
    まとめ
    本編は簡単な例にすぎず、完全な効率的な爬虫類には多くの改善が必要である.
  • エージェントip
  • に加入する.
  • scrapdの配置分布式爬虫類
  • 増量式爬虫類考慮
  • ....

  • これらは後でゆっくり紹介して、終わります.
    微信公衆番号Pythonデータ科学に注目し、120G人工知能学習資料を取得した.