用Python爬取好奇心日报

本项目最后更新于2018-7-24,可能会因为没有更新而失效。如已失效或需要修正,请联系我!

本项目已授权微信公众号“菜鸟学Python”发表文章 爬取5万篇好奇心日报文章,一个非常适合小白练手的综合实战案例 注: 链接失效了。。。。

在写这个项目时,我还不会Python的协程编程,用协程可提升爬虫速度至少5倍,参考我的文章线程,协程对比和Python爬虫实战说明

声明

  • 代码、教程均为张思淡本人原创,且仅限于学习交流,请勿用于任何商业用途!

前言

因为我是最近才关注好奇心日报的,感觉之前的许多好文章我都没看,所以打算找出这些好文章。
一般来说一篇好文的分享数或者评论数比较多,所以我只要爬下
好奇心日报的每篇文章的评论数和分享数就行了。

准备工作

第一步是发现好奇心日报的文章地址编码是按数字递增的,例如:
http://www.qdaily.com/articles/38425.html
截止今天,好奇心日报的文章编码已经从1到55613了,共5万篇文章。
然后我发现文章的标题,分享数和文章发布日期都写死在页面里,但是评论数不在页面中
为了找到评论数,我使用谷歌浏览器的F12的network功能,发现了评论是通过json数据获得的,地址类似:
http://www.qdaily.com/comments/article/38425/0.json
看到json的数据自带评论,于是我顺便把评论的内容也爬下来了,顺便做一个评论的词云

爬虫代码编写

先写建数据库的代码

def create():# 创建数据库global connconn = sqlite3.connect('qdaily.db')conn.execute("""create table if not exists qdaily(id INTEGER PRIMARY KEY ,title varchar DEFAULT NULL,sharenum int DEFAULT NULL,date DATE DEFAULT NULL,comments int DEFAULT NULL)""")conn.execute("""create table if not exists comments(id INTEGER PRIMARY KEY ,url_id int DEFAULT NULL,comment varchar DEFAULT NULL)""")

然后写爬取的核心代码,在这段代码里,我使用了requests库来获取网页。

def func(id=0):if id == 0:print("id=0,error!")returnreal_url = url+str(id)+".html"try:r1 = requests.get(real_url, timeout=10)r1.encoding = r1.apparent_encodingdemo = r1.textif "页面出错" in demo:returnsoup = BeautifulSoup(demo, "html.parser")sharenum = int(soup.find('span', 'num').string)title = soup.find('h2', 'title').stringdate = soup.find('span', 'date smart-date').attrs['data-origindate'][:-15]comment_url = "http://www.qdaily.com/comments/article/" + \str(id)+"/0.json"r2 = requests.get(comment_url, headers=head, timeout=10).textjsDict = json.loads(r2)feeds = jsDict['data']['feeds']comments = jsDict['data']['total_count']tuple1 = (id, title, sharenum, date, comments)while jsDict['data']["has_more"]:more_comment = jsDict['data']['last_key']more_comment_url = "http://www.qdaily.com/comments/article/" + \str(id)+"/"+str(int(more_comment))+".json"r3 = requests.get(more_comment_url, headers=head, timeout=10).textjsDict = json.loads(r3)for i in jsDict['data']['feeds']:feeds.append(i)save(tuple1, feeds)except Exception as e:print()print(str(id)+"error!")print(e)

接着写一个保存数据到数据库的函数:

def save(tuple1=None, list1=None):global connif tuple1 == None:returncommand1 = "insert into qdaily \(id,title,sharenum,date,comments) values (?,?,?,?,?);"command2 = "insert into comments\(url_id,comment) values (?,?);"conn.execute(command1, tuple1)for i in list1:temp = (tuple1[0], i['content'])conn.execute(command2, temp)if i['child_comments'] != []:for j in i['child_comments']:temp = (tuple1[0], j['content'])conn.execute(command2, temp)conn.commit()

完整的爬虫代码在 qdaily-spider

爬虫结果展示

我爬完5万篇文章用了快一天,虽然多线程可以加快速度,但我采用单线程减轻好奇心日报服务器的压力。
先是根据文章分享数排序:

然后是根据文章的评论数排序:

好奇心日报文章id与评论数的关系

我感觉好奇心日报用的人越来越多了,那么随着id的增加,文章的平均评论数应该也会增加。
代码如下:

import matplotlib.pyplot as plt
import sqlite3
conn = sqlite3.connect(r"qdaily.db")
url_id = conn.execute("select id from qdaily order by id;").fetchall()
comment = conn.execute("select comments from qdaily order by id;").fetchall()
plt.title("id与评论数关系图", fontproperties='SimHei', fontsize=25)
plt.xlabel("id", fontproperties='SimHei', fontsize=15)
plt.ylabel("comment", fontproperties='SimHei', fontsize=15)
plt.plot(url_id, comment, '-r')
conn.close()

画出的图如下:

可以看出越到后面,平均每篇文章的分享数就越多,反映出好奇心日报的用户数变多
生成文章id与评论数关系图的完整代码在 qdaily-id-comment

根据评论生成词云

既然我把评论也爬了下来,那么我就写一个根据评论生成词云的代码

import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
from scipy.misc import imread
import sqlite3
conn = sqlite3.connect('qdaily.db')
wordlist = []
for i in conn.execute("select comment from comments").fetchall():wordlist.append(i[0])
wl_space_split = " ".join(wordlist)
mask_png = imread("mask.jpeg")
my_wordcloud = WordCloud(font_path=r"C:\Windows\Fonts\simhei.ttf",background_color="white",  # 背景颜色max_words=500,  # 词云显示的最大词数max_font_size=100,  # 字体最大值random_state=42,mask=mask_png,width=1000, height=860, margin=2).generate(wl_space_split)
image_colors = ImageColorGenerator(mask_png)
plt.figure()
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.axis("off")
plt.show()
my_wordcloud.to_file("wordcloud.png")

生成的词云结果如下:

生成词云代码在 qdaily-comment

GitHub此项目仓库地址:https://github.com/zhang0peter/qdaily-spider
欢迎大家关注我的GitHub:https://github.com/zhang0peter

用Python爬取好奇心日报相关推荐

  1. python 开发安卓应用商店_用Python爬取各Android市场应用下载量(3分钟学会)

    就是这么简单! 文章目录 前言 设计一个函数 构造要爬取的网址 确定要爬取的内容的位置 构建输入和调用部分 程序完整代码 0 前言 有时候,总有一些重复又琐碎的工作,却不得不做-- 一个个统计,也不是 ...

  2. 如何用python爬取网页数据,python爬取网页详细教程

    大家好,本文将围绕python怎么爬取网站所有网页展开说明,如何用python爬取网页数据是一个很多人都想弄明白的事情,想搞清楚python如何爬取网页数据需要先了解以下几个事情. 1.如何用Pyth ...

  3. python爬取电影评分_用Python爬取猫眼上的top100评分电影

    代码如下: # 注意encoding = 'utf-8'和ensure_ascii = False,不写的话不能输出汉字 import requests from requests.exception ...

  4. python爬取新闻并归数据库_Python爬取数据并写入MySQL数据库操作示例

    Python爬取数据并写入MySQL数据库的实例 首先我们来爬取 http://html-color-codes.info/color-names/ 的一些数据. 按 F12 或 ctrl+u 审查元 ...

  5. Python 爬取北京二手房数据,分析北漂族买得起房吗?(附完整源码)

    来源:CSDN 本文约3500字,建议阅读9分钟. 本文根据Python爬取了赶集网北京二手房数据,R对爬取的二手房房价做线性回归分析,适合刚刚接触Python&R的同学们学习参考. 房价高是 ...

  6. python爬取天气_python3爬取各类天气信息

    本来是想从网上找找有没有现成的爬取空气质量状况和天气情况的爬虫程序,结果找了一会儿感觉还是自己写一个吧. 主要是爬取北京包括北京周边省会城市的空气质量数据和天气数据. 过程中出现了一个错误:Unico ...

  7. html如何获取请求头变量的值。_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  8. python爬取网页书籍名称代码_python爬取亚马逊书籍信息代码分享

    我有个需求就是抓取一些简单的书籍信息存储到mysql数据库,例如,封面图片,书名,类型,作者,简历,出版社,语种. 我比较之后,决定在亚马逊来实现我的需求. 我分析网站后发现,亚马逊有个高级搜索的功能 ...

  9. python爬取资料_Python爬取FLASH播放器中的资料

    Python爬取FLASH播放器中的资料. 一.首先了解一下AMF协议:AMF(Action Message Format)是Flash与服务端通信的一种常见的二进制编码模式,其传输效率高,可以在HT ...

最新文章

  1. python练习:猜价钱小游戏
  2. 生命简史——跨越地球40亿年
  3. 计算机语言E9,九种编程语言大对比
  4. 基于 abp vNext 和 .NET Core 开发博客项目 - 统一规范API,包装返回模型
  5. 收费标准_互联网推广收费标准
  6. cocos2d-x开发之动作游戏实战--5
  7. java星座查询系统_星座查询示例代码
  8. 让你成为有钱一族的黄金理财法则?
  9. java面试题_Java面试题总结(2020年多家公司整理的300道Java面试题手册)
  10. hdu 4333 Revolving Digits
  11. 特斯拉第四季度生产超30.5万台车 全年交付近百万台
  12. BasicAuth和OAuth
  13. php mysql 备份还原_php 数据库备份还原
  14. Hyperledger下子项目
  15. 一款基于jQuery的图片分组切换焦点图插件
  16. SPSS数据插补方法
  17. 只读更新全程图解教程(转)
  18. 英语语法新思维初级分享
  19. 使用PS制作毛玻璃效果
  20. 按头安利 好看又实用的SolidEdge 3d模型素材看这里

热门文章

  1. djaogo知识点 python_python Django知识点总结
  2. 打开 hyper-v 批处理_如何控制批处理服务器
  3. Science:纽约西奈山医学院房刚组定量分析真核生物DNA 6mA解析细菌污染的影响...
  4. QIIME 2教程. 27语义类型Semantic(2020.11)
  5. Science Bulletin:上海植生所王二涛组发表基于绝对丰度的植物根际微生物群落“扩增-选择”组装模型
  6. 本年扩增子、宏基因组课程报名已满,想要学最早等明年
  7. PNAS:皮肤微生物群综合分析揭示人类皮肤的独特性并为其在哺乳动物的系统发育共生现象提供证据...
  8. R语言head函数和tail函数获取dataframe、列表list、向量vector的头部和尾部数据:tail提取数据对象的尾部数据、head提取数据对象的头部数据、默认6条数据、自定义设置返回条数
  9. R语言构建LogisticRegression模型并计算AUC指标
  10. Pandas把dataframe的索引、复合索引变换为数据列:包含单索引到单列(重命名)、复合索引到多数据列、复合索引的其中一个水平变换为数据列、