1.前提:
总体思路,利用多线程(mutiSpider)爬取博客园首页推荐博客,根据用户名爬取该用户的阅读排行榜(TopViewPosts),评论排行榜(TopFeedbackPosts),推荐排行榜(TopDiggPosts),然后对得到的数据进行处理(合并目录),再进行基本排序(这里我们已阅读排行榜为例),排序阅读最多的文章,然后利用词云(wordcloud)生成图片,最后发送邮件给自己。(有兴趣的小伙伴可以部署到服务器上!)
1.1参考链接:
大神博客:https://www.cnblogs.com/lovesoo/p/7780957.html(推荐先看这个,我是在此博客基础上进行改进与扩充了的)
词云下载:https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud(我下载的这个wordcloud-1.5.0-cp36-cp36m-win32.whl)
邮件发送:https://www.runoob.com/python/python-email.html(菜鸟教程推荐)
1.2实现效果:
2.环境配置:
python3.6.5(对应cp36,最好记住这个,因为以后下载一些whl文件都会用到)
pycharm + QQ邮箱授权码 + wordcloud-1.5.0-cp36-cp36m-win32.whl
win10,64位(虽然我是64位,但是下载词云win_amd64.whl不兼容,改成win32.whl就兼容了)
2.0 读者需要提供的东西:
1.词云所需要的图片(我是avatar.jpg)与电脑字体(具体见View_wordcloud函数
2.邮箱的SMTP授权码(密码就是授权码)
3.默认所有代码、图片等都在同一文件夹下面。
)
2.1需要导入的库(词云 + 邮件 + 爬虫)
注:1.requests,beatuifulsoup,是爬虫需要,wordcloud,jieba,是词云需要,smtplib,email是邮件需要,其余都是些基本Python语法
2.安装wordcloud词云的时候容易报错,官方链接,官网下载然后在本地cmd下pip install 即可。
3.编写爬虫
3.1博客园首页推荐博客
选中XHR,找到https://www.cnblogs.com/aggsite/UserStats,直接requests获取,返回的是html格式
然后可以需要对数据进行基本处理,一种是使用Beautiful Soup解析Html内容,另外一种是使用正则表达式筛选内容。
其中BeautifulSoup解析时,我们使用的是CSS选择器.select方法,查找id="blogger_list" > ul >li下的所有a标签元素,同时对结果进行处理,去除了"更多推荐博客"及""博客列表(按积分)链接。
使用正则表达式筛选也是同理:我们首先构造了符合条件的正则表达式,然后使用re.findall找出所有元素,同时对结果进行处理,去除了"更多推荐博客"及""博客列表(按积分)链接。
这样我们就完成了第一步,获取了首页推荐博客列表。
然后,这里就能获取推荐用户的博客了,我们接下来需要进入某个用户博客,找到接口sidecolumn.aspx,这个接口返回了我们需要的信息:随笔分类,点击Headers查看接口调用信息,可以看到这也是一个GET类型接口,路径含有博客用户名,且传入参数blogApp=用户名:查看Header:
https://www.cnblogs.com/meditation5201314/mvc/blog/sidecolumn.aspx?blogApp=meditation5201314,直接发送requests请求即可
到此,便可以获得博客的分类目录及文章数量信息,其余2个我就不展示了,总共3个功能,获取用户的阅读排行榜(TopViewPosts),评论排行榜(TopFeedbackPosts),推荐排行榜(TopDiggPosts),具体见推荐博客另外多线程爬虫代码也在这里面,比较简单,然后就是对数据进行排序处理了。见如下代码
具体完整代码
4.生成词云
对推荐博客内容进行处理(List格式),有关词云具体使用可以百度,简单介绍就是在给定的img和txt生成图片,就是把2者结合起来,font_path是自己电脑本机上的,去C盘下面搜一下就行,不一定大家都一样。
注:词云安装:这个比较复杂,我在pycharm下面install 没安装好,我是先去官网下载了whl文件,然后在cmd下
pip install wordcloud-1.5.0-cp36-cp36m-win32.whl
然后把生成的文件夹重新放入到pycharm的venv/Lib/site_packages/下面,然后就弄好了(个人推荐这种办法,百试不爽!)
在上面代码中,我们利用cloud.to_file(path.join(bmppath, 'temp.jpg')),保存了temp.jpg,所以后面发送的图片就直接默认是temp.jpg了
5.发送邮件:
去QQ邮箱申请一下授权码,然后发送给自己就好了,内容嵌套img这个教麻烦,我查了很久,需要用cid指定一下,有点像ajax和format。
最终完整代码:
总结:总体功能就是根据推荐博客,爬取推荐用户的阅读排行榜 评论排行榜 推荐排行榜,然后数据处理成,将处理好的数据整合成词云,最后发送给用户
难点1:爬取用户和博客所用到的一系列爬虫知识(正则,解析等等)
难点2:词云的安装(确实挺麻烦的。。。。。)
难点3:邮件发送内容嵌套image(菜鸟教程没有给出QQ邮箱内嵌套图片,自己去官网找的。)