爬取5万篇好奇心日报文章,一个非常适合小白练手的综合实战案例

浏览: 2118

Python的知识很多,基本的入门就有很多东西要学,还有各种合样的库要学习。很多同学学了一段时间,进展很慢,学了前面忘了后面!要么就是揠苗助长找一些特别难的例子,结果太难了,失去信心,完全没有成就感!

个人建议是学Python应该趣味性结合,如果跟自己平时的工作相关的应用更好,如果没有,找到合适的例子,通俗有趣的例子非常重要。今天我就给大家介绍一个非常简单的爬虫小例子,来综合练习,非常不错!

要点:

  • 练习基本的入门知识

  • 练习Python类的使用

  • 练习爬虫的最简单使用

  • 练习最简单的数据库的使用

01

爬取的目标


我们这次选择一个比较好玩的网站叫"好奇心日报",我经常访问这个网站,里面的内容非常惬意。尤其是在星巴克喝点咖啡,拿IPad看看文章,感觉很好。里面的内容非常有趣,而且图片都是高清,非常漂亮,今天我们就探索一下好奇心日报的爬取。

02

准备工作

前期需要对这个网站进行简单的分析,网页的结构,源码的查看,有无反爬策略等等。

  • 第一步是发现好奇心日报的文章地址编码是按数字递增的,例如:http://www.qdaily.com/articles/38425.html  

  • 截止今天,好奇心日报的文章编码已经从1到55613了,共5万篇文章。  

  • 然后我发现文章的标题,分享数和文章发布日期都写死在页面里,但是评论数不在页面中  。

  • 为了找到评论数,我使用谷歌浏览器的F12的network功能,发现了评论是通过json数据获得的,地址类似:http://www.qdaily.com/comments/article/38425/0.json  。   

  • 看到json的数据自带评论,于是我顺便把评论的内容也爬下来了,顺便做一个评论的词云 。

03

主体代码


1).先创建数据库

数据库我们用选择最最简单的sqlite3,这个数据非常适合小白入门。这个库的详细用法,我前面讲了很多(学会最简单的数据库|看完这7招就够了),这里不在重复。

用一个类QDaily_DB来专门处理db的创建,保存和关闭.上面的代码是创建部分:

  • 创建一个数据库名字叫qdaily.db,里面分布建2张表

  • 一张表qdality用来保存好奇心日报的id,标题,点赞分享数,日期和评论数

  • 一张表comments用来保存好奇心日报的id和每一条评论的内容

2).网页爬取

网页的爬取,我们这里并没有用什么高深的库和爬虫框架,用简单的requests+bs4的组合,这一个一套比较适合小白上手的库,也没有用并发框架。

1).网页的下载

前面说了,好奇心日报的url的规则已经找到,只要一个一个解析就行!

  • 我们输入一个id,来构造一个url,然后把这个url填入到requests中解析即可。

  • 注意编码方式,获得页面的内容html_content,然后把详细的html_content内容填入parse_html类函数中进行详细处理.

  • 为了防止出现爬取异常,一定要加入try/except和finally这样的异常保护

3).页面的解析和评论内容的获取

下面就是这个项目稍微难有点的地方,需要用BeautifulSoup来详细解析页面的内容。

评论区的内容稍微有一点点的复制,需要用构造一个header取获取,直接解析页面无法获取。

我们用两个简单数据结构,一个是primary_data这个可以是列表,元组或者字典,这是一种数据结构,用来保存我们爬取获得每一篇文章的id,日期,标题等等。另外一个是 comments_data用来存放评论区的内容,然后返回即可。

04

数据存入数据库


前面我们有一个类QDaily_DB,用了创建的类函数,现在用它的save_db函数来把数据入库。

sqlite的操作非常简单,用的也是SQL的语法,上手来说非常方便。我们用insert语句动态插入数据,然后execute去执行,最后不要忘记commit!

05.

数据的展示

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

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

06

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


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

可以看出越到后面,平均每篇文章的分享数就越多,反映出好奇心日报的用户数变多。

07

根据评论生成词云


用matplotlib和wordcloud库生成一个词云评论图,看看哪些关键字比较集中!

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")

(代码可以左右滑动)

生成的词云结果如下:

发现评论比较多的是"哈哈哈","是的","呵呵","谢谢"这样的短口语词汇。

本文的内容原创来自忠实粉丝Peter Zhang,我对源码进行了修正和重新排版。整个这个实战小例子还是非常有趣的,从数据爬取-数据入库,数据分析和词云,一条龙服务,还是非常值得去试试,对初学者强化基础知识,入门比较有帮助。

推荐 0
本文由 菜鸟学Python 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册