python爬虫-36kr网+Django+Echarts图表

Python 69 2017-11-07 09:47

一.爬虫作业:抓取36kr网站数据

爬虫代码和数据sql脚本在下方链接,抓取过程主要是抓包找到url递归解析的规律,三个主要的函数 以及 表结构脚本如下

#建表语句(写爬虫时候忘记添加user_url 后续数据处理时候update补全了这个字段)
CREATE TABLE `36kr` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `column_id` varchar(255) DEFAULT NULL COMMENT '专题id',
  `tag` varchar(255) DEFAULT NULL COMMENT '专题名',
  `b_id` varchar(255) DEFAULT NULL COMMENT '文章id',
  `article_url` varchar(255) DEFAULT NULL COMMENT '文章url',
  `title` varchar(255) DEFAULT NULL COMMENT '标题',
  `user_id` varchar(255) DEFAULT NULL COMMENT '用户id',
  `user_name` varchar(255) DEFAULT NULL COMMENT '用户名',
  `total_words` varchar(255) DEFAULT NULL COMMENT '文章总字数',
  `close_comment` varchar(255) DEFAULT NULL COMMENT '关闭评论数',
  `favorite` varchar(255) DEFAULT NULL COMMENT '收藏数',
  `likes` varchar(255) DEFAULT NULL COMMENT '赞数',
  `pv` varchar(255) DEFAULT NULL COMMENT 'pv浏览量',
  `pv_app` varchar(255) DEFAULT NULL COMMENT 'app浏览量',
  `pv_mobile` varchar(255) DEFAULT NULL COMMENT '手机端浏览量',
  `view_count` varchar(255) DEFAULT NULL COMMENT '观看次数统计',
  `extraction_tags` text COMMENT '文章标签',
  `summary` text COMMENT '摘要',
  `title_mobile` text COMMENT '手机端标题',
  `introduction` varchar(255) DEFAULT NULL COMMENT '简介',
  `published_at` varchar(255) DEFAULT NULL COMMENT '发表时间',
  `created_at` varchar(255) DEFAULT NULL COMMENT '创建时间',
  `updated_at` varchar(255) DEFAULT NULL COMMENT '更新时间',
  `related_company_id` varchar(255) DEFAULT NULL COMMENT '公司id',
  `related_company_type` varchar(255) DEFAULT NULL COMMENT '公司类型',
  `related_company_name` varchar(255) DEFAULT NULL COMMENT '公司名称',
  `full_url` varchar(255) DEFAULT NULL COMMENT '请求url',
  `user_url` varchar(50) DEFAULT NULL COMMENT '用户url',,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29045 DEFAULT CHARSET=utf8;

爬虫核心三个函数 人工构造导航栏(字段tag)的 column_ids和 column_names列表 进行字典映射 请求数据后将导航栏数据写入数据库,第一次请求url只有column_id动态 per_page参数写死=1

    #第一次请求解析出后续的请求url
    def parse_column(self):
        column_ids = self.column_ids_dict['column_ids']
        print(column_ids, self.column_dict)
        for column_id in column_ids:
            self.parse_first_req(column_id)
    #第一次请求url只有column_id动态 per_page参数写死=1
    def parse_first_req(self, column_id):
        first_url = self.start_url.format(column_id)
        print(first_url)
        html = requests.get(first_url).text
        items = json.loads(html)['data']['items']
        if items:
            last_b_id = items[-1]['id']
            full_url = self.base_url.format(column_id, last_b_id)
            print('解析导航栏:%s-->首页,id-->%s' % (self.column_dict[column_id], column_id))
            self.parse_json(full_url)
        else:
            pass
    #解析 http://36kr.com/api/post?column_id=23&b_id=5070043&per_page=100 数据网为100个item循环遍历
    def parse_json(self, full_url):
        print("解析组合url--->", full_url)
        self.req_urls.append(full_url)
        html = requests.get(full_url).text
        items = json.loads(html)['data']['items']
        if items:
            for item in items:
                parse_item = item
                parse_item['tag'] = self.column_dict[item['column_id']]
                parse_item['full_url'] = full_url
                self.insert_item(parse_item)
            last_b_id = items[-1]['id']
            column_id = items[-1]['column_id']
            next_req_url = self.base_url.format(column_id, last_b_id)
            print('下一次请求url-->', next_req_url)
            #递归
            self.parse_json(next_req_url)
        else:
            pass

最终根据网站导航栏的结构进行抓取了29000多篇文章,数据维度包括作者,创建及发布和更新时间,pv浏览量,收藏数,点赞数等

python爬虫-36kr网+Django+Echarts图表-JEESNS
爬虫数据

二.Django+echarts图表 放在上一篇文章maoyan的项目中 新建了app tskr

python爬虫-36kr网+Django+Echarts图表-JEESNS
各年份发表文章数占比

可以看出2016年网站发表文章数接近一半,2017年近10个月的数据和2016年相差不是很大.

python爬虫-36kr网+Django+Echarts图表-JEESNS
写作字数作者TOP10
python爬虫-36kr网+Django+Echarts图表-JEESNS
文章收藏总数TOP10

这两个图表中同时出现的有36氪的朋友们,人人都是产品经理,高小倩,卢晓明

下图是文章pv浏览量排行前10


python爬虫-36kr网+Django+Echarts图表-JEESNS
文章pv浏览量TOP10

三.爬虫和django代码

36kr网代码地址:https://github.com/chengcxy/spiders/blob/master/36kr.py

36kr网站数据的抓取放在django项目maoyan中 app名为tskr

36kr网图表:https://github.com/chengcxy/Django_project/tree/master/maoyan
文章评论