python2.7 爬取简书30日热门专题文章之简单分析_20170207
昨天在简书上写了用Scrapy抓取简书30日热门文章,对scrapy是刚接触,跨页面抓取以及在pipelines里调用settings,连接mysql等还不是很熟悉,今天依旧以单独的py文件区去抓取数据。同时简书上排版不是很熟悉,markdown今天刚下载还没来得及调试,以后会同步更新
简书文章:http://www.jianshu.com/p/eadfdb4b5a9d
一、下面是将爬取到的数据写到Mysql数据库代码:
插入数据库titletime字段需要将字符型转化为datetime型 用time模块显得冗长 下一步用datetime改进
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests
from lxml import etree
import MySQLdb
import time
import datetime def insertinto_MySQL():
try:
conn=MySQLdb.connect(host='localhost',user='root',passwd='你的密码',db='local_db',port=3306,charset='utf8')
with conn:
cursor=conn.cursor()
for i in range(0, 6):
url = 'http://www.jianshu.com/trending/monthly?page=%s' % str(i)
html = requests.get(url).content
selector = etree.HTML(html)
infos = selector.xpath("//ul[@class='note-list']/li")
for info in infos:
author = info.xpath('div/div[1]/div/a/text()')[0]
title = info.xpath('div/a/text()')[0]
titleurl = 'http://www.jianshu.com' + str(info.xpath('div/a/@href')[0])
strtime = info.xpath('div/div[1]/div/span/@data-shared-at')[0].replace('+08:00', '').replace('T'," ")
timea = time.strptime(strtime, "%Y-%m-%d %H:%M:%S")
timeb = time.mktime(timea)
timec = time.localtime(timeb)
titletime = time.strftime('%Y-%m-%d %H:%M:%S', timec)
reader = int(str(info.xpath('div/div[2]/a[1]/text()')[1]).strip())
comment_num = int(str(info.xpath('div/div[2]/a[2]/text()')[1]).strip())
likes = int(info.xpath('div/div[2]/span/text()')[0])
rewards = int(str(info.xpath('div/div[2]/span[2]/text()')[0])) if len(info.xpath('div/div[2]/span[2]/text()')) != 0 else 0
cursor.execute("INSERT INTO monthly values(%s,%s,%s,%s,%s,%s,%s,%s)",(author,title,titleurl,titletime,reader,comment_num,likes,rewards))
conn.commit()
except MySQLdb.Error:
print u"连接失败!" if __name__ == '__main__':
insertinto_MySQL()
二、写python代码前预先在本地mysql数据库建表
CREATE TABLE monthly(
author VARCHAR(255),
title VARCHAR(255),
titleurl VARCHAR(255),
titletime DATETIME,
reader INT(19),
comment_num INT(19),
likes INT(19),
rewards INT(19)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
三、查看数据库,爬取了30日热门 通过查看异步加载请求的url一共加载了6页 119篇文章

四、时间关系简单分析,先看下汇总情况,按照时间以今天所在日期30天前和30天后为两部分,因此sql采用了纵向连接union all,和热门30天似乎能响应,最早的一票是简叔的,2015年的,浏览量超过了60万,
通过观察数据表数据结构,写sql看下总体情况
(
SELECT a.收录专题,a.时间区间,c.天数,b.作者数,a.文章数,a.累计PV浏览量,a.累计评论数,a.累计喜欢数,a.累计打赏数
FROM (
SELECT '30日热门' AS 收录专题,'30天前' AS 时间区间,COUNT(*) AS 文章数,SUM(reader) AS 累计PV浏览量,SUM(comment_num) AS 累计评论数,SUM(likes) AS 累计喜欢数,SUM(rewards) AS 累计打赏数
FROM monthly
WHERE titletime<DATE_ADD(CURRENT_DATE,INTERVAL -30 DAY)
) AS a
LEFT JOIN (
SELECT 时间区间,COUNT(作者) AS 作者数
FROM (
SELECT 时间区间,author AS 作者
FROM (
SELECT *,'30天前' AS 时间区间
FROM monthly
WHERE titletime<DATE_ADD(CURRENT_DATE,INTERVAL -30 DAY)
) AS b0
GROUP BY author
) AS b1
) AS b ON a.时间区间=b.时间区间
LEFT JOIN (
SELECT 时间区间,COUNT(发表日期) AS 天数
FROM (
SELECT 时间区间,发表日期
FROM (
SELECT *,'30天前' AS 时间区间,DATE(titletime) AS 发表日期
FROM monthly
WHERE titletime<DATE_ADD(CURRENT_DATE,INTERVAL -30 DAY)
) AS b0
GROUP BY 发表日期
) AS b1
) AS c ON a.时间区间=b.时间区间
)
UNION ALL
(
SELECT a.收录专题,a.时间区间,c.天数,b.作者数,a.文章数,a.累计PV浏览量,a.累计评论数,a.累计喜欢数,a.累计打赏数
FROM (
SELECT '30日热门' AS 收录专题,'近30天' AS 时间区间,COUNT(*) AS 文章数,SUM(reader) AS 累计PV浏览量,SUM(comment_num) AS 累计评论数,SUM(likes) AS 累计喜欢数,SUM(rewards) AS 累计打赏数
FROM monthly
WHERE titletime>=DATE_ADD(CURRENT_DATE,INTERVAL -30 DAY)
) AS a
LEFT JOIN (
SELECT 时间区间,COUNT(作者) AS 作者数
FROM (
SELECT 时间区间,author AS 作者
FROM (
SELECT *,'近30天' AS 时间区间
FROM monthly
WHERE titletime>=DATE_ADD(CURRENT_DATE,INTERVAL -30 DAY)
) AS b0
GROUP BY author
) AS b1
) AS b ON a.时间区间=b.时间区间
LEFT JOIN (
SELECT 时间区间,COUNT(发表日期) AS 天数
FROM (
SELECT 时间区间,发表日期
FROM (
SELECT *,'近30天' AS 时间区间,DATE(titletime) AS 发表日期
FROM monthly
WHERE titletime>=DATE_ADD(CURRENT_DATE,INTERVAL -30 DAY)
) AS b0
GROUP BY 发表日期
) AS b1
) AS c ON a.时间区间=b.时间区间
)

从这里看出热门30天专题收录的时间大致接近最近50多天的数据,简叔的那个数据应该算是异常值,时间关系我没来得及改where条件,这两个时间段前后收录的文章数差距很大,作者数也差距很大,30天前的pv浏览量如果去掉简书的60多万PV 差距也会很大,但从评论数和喜欢数上来看,30天前的文章文笔比近30天的文笔要好一些,吸引了吃瓜群众的吐槽,在文章数差距比较大的情况下,这两个数据变化不是很大,甚至30天前的喜欢数远超近30天。
五、看下专题收录文章前10名作者的情况
#30日热门收录文章数前10名的作者
SELECT a.*,b.首次被专题收录时间,c.最近被专题收录时间,DATEDIFF(c.最近被专题收录时间,b.首次被专题收录时间) AS 间隔天数,d.发表天数
FROM (
SELECT '30日热门' AS 收录专题,author AS 作者,COUNT(titleurl) AS 被收录几次,COUNT(titleurl) AS 文章数,SUM(reader) AS 累计PV浏览量,SUM(comment_num) AS 累计评论数,SUM(likes) AS 累计喜欢数,SUM(rewards) AS 累计打赏数
FROM monthly
GROUP BY author
ORDER BY COUNT(titleurl) DESC
LIMIT 10
) AS a
LEFT JOIN (
SELECT author AS 作者,首次被专题收录时间
FROM (
SELECT author,DATE(titletime) AS 首次被专题收录时间
FROM monthly
GROUP BY author,DATE(titletime)
ORDER BY author,titletime
) AS b0
GROUP BY author
) AS b ON a.作者=b.作者
LEFT JOIN (
SELECT author AS 作者,最近被专题收录时间
FROM (
SELECT author,DATE(titletime) AS 最近被专题收录时间
FROM monthly
GROUP BY author,DATE(titletime)
ORDER BY author,titletime DESC
) AS c0
GROUP BY author
) AS c ON a.作者=c.作者
LEFT JOIN (
SELECT author AS 作者,COUNT(发表日期) AS 发表天数
FROM (
SELECT author,DATE(titletime) AS 发表日期
FROM monthly
GROUP BY author,DATE(titletime)
) AS d0
GROUP BY author
) AS d ON a.作者=d.作者

专题作者,后面字段还可以更完善,可以加上这个作者评论最多的文章,打赏最多的文章等等,以及下一步爬取专题作者页面获得作者注册时间,粉丝数,累计发表文章数,累计写了多少文字等等
时间关系,抽时间再完善一下分析的角度,收录专题中发表文章集中的时间段,打赏,浏览py的文章有什么特性等以及图表制作
python2.7 爬取简书30日热门专题文章之简单分析_20170207的更多相关文章
- python3 爬取简书30日热门,同时存储到txt与mongodb中
初学python,记录学习过程. 新上榜,七日热门等同理. 此次主要为了学习python中对mongodb的操作,顺便巩固requests与BeautifulSoup. 点击,得到URL https: ...
- Node爬取简书首页文章
Node爬取简书首页文章 博主刚学node,打算写个爬虫练练手,这次的爬虫目标是简书的首页文章 流程分析 使用superagent发送http请求到服务端,获取HTML文本 用cheerio解析获得的 ...
- Python爬取简书主页信息
主要学习如何通过抓包工具分析简书的Ajax加载,有时间再写一个Multithread proxy spider提升效率. 1. 关键点: 使用单线程爬取,未登录,爬取简书主页Ajax加载的内容.主要有 ...
- Scrapy+selenium爬取简书全站
Scrapy+selenium爬取简书全站 环境 Ubuntu 18.04 Python 3.8 Scrapy 2.1 爬取内容 文字标题 作者 作者头像 发布日期 内容 文章连接 文章ID 思路 分 ...
- 【python3】爬取简书评论生成词云
一.起因: 昨天在简书上看到这么一篇文章<中国的父母,大都有毛病>,看完之后个人是比较认同作者的观点. 不过,翻了下评论,发现评论区争议颇大,基本两极化.好奇,想看看整体的评论是个什么样, ...
- scrapy爬取简书整站文章
在这里我们使用CrawlSpider爬虫模板, 通过其过滤规则进行抓取, 并将抓取后的结果存入mysql中,下面直接上代码: jianshu_spider.py # -*- coding: utf-8 ...
- 爬取简书图片(使用BeautifulSoup)
import requests from bs4 import BeautifulSoup url_list = [] kv = {'User-Agent':'Mozilla/5.0'} r = re ...
- python 爬取简书评论
import json import requests from lxml import etree from time import sleep url = "https://www.ji ...
- python2.7爬取豆瓣电影top250并写入到TXT,Excel,MySQL数据库
python2.7爬取豆瓣电影top250并分别写入到TXT,Excel,MySQL数据库 1.任务 爬取豆瓣电影top250 以txt文件保存 以Excel文档保存 将数据录入数据库 2.分析 电影 ...
随机推荐
- 乐思启慧教学系列—Bootstrap布局规则
1外层变化,内层相应变化规则 col-md-6 col-md-4 外层6变成12,扩大了2倍,里面就得缩小2倍(除以2), 只有这样才能保持外部变化了,内部依然对齐 col-md-12 col-md- ...
- Swift 学习 用 swift 调用 oc
开发过程中 很可能 把swift不成熟的地方用成熟的oc 代码来弥补一下 , 下面简单来学习一下,我也是照着视频 学习的 卖弄谈不上 就是一次学习笔记, 具体问题还是具体分析吧. 需求 给展出出来的 ...
- 微服务架构~BFF和网关是如何演化出来的
介绍 BFF(Backend for Frontend)和网关Gateway是微服务架构中的两个重要概念,这两个概念相对比较新,有些开发人员甚至是架构师都不甚理解. 本文用假想的公司案例+图示的方式, ...
- Java技术路线
1.计算机基础: 1.1数据机构基础: 主要学习: 1.向量,链表,栈,队列和堆,词典.熟悉 2.树,二叉搜索树.熟悉 3.图,有向图,无向图,基本概念 4.二叉搜索A,B,C类熟练,9大排序熟悉. ...
- JQuery3 的新变化
1. for-of 循环 for-in 循环不被推荐遍历数组,forEach 循环不能中断,for-of 循环(ES6)则弥补了前两者的不足,又添加了更多拓展(比如能遍历字符串,DOM 元素等) 因此 ...
- python中偏函数
当一个函数有很多参数时,调用者就需要提供多个参数.如果减少参数个数,就可以简化调用者的负担. 比如,int()函数可以把字符串转换为整数,当仅传入字符串时,int()函数默认按十进制转换: >& ...
- 常用模块----time&random&hushlib&os
模块:本质就是一个.py文件 分为三部分: 内置模块 第三方模块 自定义模块(模块调用,包) 加载顺序:内置模块——>自定义模块 time 模块 # <1> 时间戳 >&g ...
- RAID 工作模式
RAID 工作模式 RAID磁盘阵列 优点: 1.提高传输速率:RAID通过在多个磁盘上同时存储和读取数据来大幅提高存储系统的数据吞吐量. 2.RAID可以达到单个磁盘驱动器几倍.几十倍甚至上百倍的速 ...
- 通过加载Xib文件来创建UITableViewCell造成复用数据混乱问题方案
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPa ...
- Eclipse开发快捷键精选
1.alt+?或alt+/:自动补全代码或者提示代码2.ctrl+o:快速outline视图3.ctrl+shift+r:打开资源列表4.ctrl+shift+f:格式化代码5.ctrl+e:快速转换 ...