一.爬虫作业:抓取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浏览量,收藏数,点赞数等
爬虫数据二.Django+echarts图表 放在上一篇文章maoyan的项目中 新建了app tskr
各年份发表文章数占比可以看出2016年网站发表文章数接近一半,2017年近10个月的数据和2016年相差不是很大.
写作字数作者TOP10 文章收藏总数TOP10这两个图表中同时出现的有36氪的朋友们,人人都是产品经理,高小倩,卢晓明
下图是文章pv浏览量排行前10
文章pv浏览量TOP10
三.爬虫和django代码
36kr网代码地址:https://github.com/chengcxy/spiders/blob/master/36kr.py
36kr网站数据的抓取放在django项目maoyan中 app名为tskr
网友评论