死亡公司公墓

本次爬取的是新经济死亡公司数据库,从死亡原因,获投状态,存活天数等多个指标呈现死亡公司全貌。
使用Scrapy爬虫框架抓取数据。

抓取

1.分析请求

url = "https://www.itjuzi.com/deathCompany"
通过刷新页面可以在网络请求里发现Ajax请求,返回数据格式为Json。
向该响应的Request URL发送请求即可。

2.明确抓取字段

抓取字段如下:

    # 公司id
    com_id = scrapy.Field()
    # 公司名称
    com_name = scrapy.Field()
    # 关闭时间
    com_change_close_date = scrapy.Field()
    # 公司简介
    com_des = scrapy.Field()
    # 行业
    cat_name = scrapy.Field()
    # 地点
    com_prov = scrapy.Field()
    # 获投状态
    com_fund_status_name = scrapy.Field()
    # 成立时间
    born = scrapy.Field()
    # 存活天数
    live_time = scrapy.Field()
    # 团队
    com_team = scrapy.Field()
    # 行业标签
    com_tag = scrapy.Field()
    # 死亡原因
    closure_type = scrapy.Field()

3.spider/解析数据

使用Jsonpath。

class OrangeSpider(scrapy.Spider):
    name = 'orange'
    allowed_domains = ['www.itjuzi.com']
    page = 1
    url = "https://www.itjuzi.com/api/closure?com_prov=&sort=&keyword=&cat_id=&page="
    start_urls = [url+str(page),]

    def parse(self, response):
        data = json.loads(response.text)
        infos = jsonpath.jsonpath(data,"$..info")[0]
        for info in infos:
            item = ItjuziItem()

            # 公司id
            item['com_id'] = jsonpath.jsonpath(info,'$..com_id')[0]
            # 公司名称
            item['com_name'] = jsonpath.jsonpath(info,'$..com_name')[0]
            # 关闭时间
            item['com_change_close_date'] = jsonpath.jsonpath(info,'$..com_change_close_date')[0]
            # 公司简介
            item['com_des'] = jsonpath.jsonpath(info,'$..com_des')[0]
            # 行业
            item['cat_name'] = jsonpath.jsonpath(info,'$..cat_name')[0]
            # 地点
            item['com_prov'] = jsonpath.jsonpath(info,'$..com_prov')[0]
            # 获投状态
            item['com_fund_status_name'] = jsonpath.jsonpath(info,'$..com_fund_status_name')[0]
            # 成立时间
            item['born'] = jsonpath.jsonpath(info,'$..born')[0]
            # 存活天数
            item['live_time'] = jsonpath.jsonpath(info,'$..live_time')[0]
            # 团队
            item['com_team'] = jsonpath.jsonpath(info,'$..com_team..name')
            # 行业标签
            item['com_tag'] = ",".join(jsonpath.jsonpath(info,'$..com_tag..tag_name'))
            # 死亡原因
            item['closure_type'] = jsonpath.jsonpath(info,'$..closure_type..name')
            yield item
        self.page += 1
        yield scrapy.Request(self.url+str(self.page),callback=self.parse)

Jsonpath返回一个列表。

4.middlewares

爬取数据过多会封禁IP,所以在下载中间件里加上IP代理。

class ItjuziDownloaderMiddleware(object):
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the downloader middleware does not modify the
    # passed objects.
    def __init__(self):
        self.user_agents = [
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134',
            'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
            'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
            'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko',
            'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)'
        ]
    def proxy(self):
        # 代理服务器
        proxyHost = "http-dyn.abuyun.com"
        proxyPort = "9020"

        # 代理隧道验证信息
        proxyUser = "H262AH098992ITYD"
        proxyPass = "18C9DE75BD618524"

        proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
            "host": proxyHost,
            "port": proxyPort,
            "user": proxyUser,
            "pass": proxyPass,
        }

        # proxies = {
        #     "http":proxyMeta,
        #     "https":proxyMeta,
        # }
        # 这里不要加 HTTP
        proxies = proxyMeta
        return proxies

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_request(self, request, spider):
        """在请求发送之前处理请求"""
        # 随机的User-Agent
        request.headers['User-Agent'] = random.choice(self.user_agents)
        # 设置代理
        request.meta['proxy'] = self.proxy()
        # 取消SSL验证
        request.meta['verify']= False
        
        return None

    def process_response(self, request, response, spider):
        # Called with the response returned from the downloader.
        # Must either;
        # - return a Response object
        # - return a Request object
        # - or raise IgnoreRequest
        return response

    def process_exception(self, request, exception, spider):
        # Called when a download handler or a process_request()
        # (from other downloader middleware) raises an exception.

        # Must either:
        # - return None: continue processing this exception
        # - return a Response object: stops process_exception() chain
        # - return a Request object: stops process_exception() chain
        # return self._retry(request, exception, spider)
        pass

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)

5.pipelines

处理Item,存入数据库。

6.settings

配置数据库信息,开启相关配置。

  • 设置下载延时
  • 开启下载中间件
  • 开启PIPELINES
完整代码地址:https://github.com/wwxxee/ITjuzi

简单分析

数据清洗:剔除2000年以前的公司数据,数据截止2019-11-15
  • 每年死亡公司数:


    每年死亡公司数

    在2017年达到最高值2145。

  • 各地累计死亡公司数:


    各地死亡公司数

    大多数公司坐落北上广。

  • 行业


    行业

电商行业竞争十分激烈。

  • 获投状态


    获投状态

    其中有两家已上市的公司。


    image.png
  • 平均存活天数


    存活天数

    最小值与最大值
  • 死亡原因词云图


    死亡原因

    行业竞争与烧钱位列第一。

  • 公司标签词云图


    标签词云图

    大多数公司的创业方向依然是电商与企业服务。

报表完整地址:(点击可查看)
https://app.powerbi.cn/view?r=eyJrIjoiOGZlZjgyOWEtMDA5MS00ZWE1LWJjYWMtMWEzZGIzN2RkOTdlIiwidCI6IjkxYTQ2YmM4LWM3YWMtNDE2NC04YmU4LWQ0ZTkyMGE4MzljNSJ9

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354